Verzija dokumenta : 0.91.104
Pregled 1 (sadržaj) :
Pregled 2 (pravopis i gramatika) :
Pregled 3 (sintaksa) :
Sadržaj : 98 %
Knjiga “Uvod u Linux” napisana je unutar inicijative “Open Source Osijek”:
https://www.opensource-osijek.org
Inicijativa “Open Source Osijek” je član udruge “Osijek Software City”:
Poveznica na izvorni dokument:
https://www.opensource-osijek.org/dokuwiki/wiki:knjige:uvod_u_linux
Napomena : Moguće su pravopisne i gramatičke pogreške.Također je moguće i očekivano da će doći do izmjena pojedinih dijelova dokumenta, kao i dodavanja novih poglavlja, do trenutka izdavanja “stabilne” verzije 1.x.
Autor:Hrvoje Horvat
Naslov : Uvod u Linux i Linux napredno
Licenca i prava korištenja: Posebna licenca (navedena dolje)
Mjesto i godina izdavanja: Osijek, 2017
Verzija publikacije : 0.91
Naklada : Vlastita naklada
ISBN: 978-953-59438-7-7 (HTML-online)
DokuWiki URL (HTML):
https://www.opensource-osijek.org/dokuwiki/wiki:knjige:kratka-prica-o-mrezama-preklopnici
Uskoro izlazi i komercijalna, PDF verzija ove knjige
Ovu knjigu, u online HTML/DokuWiki formatu ali ne i u PDF ili nekom od formata za elektroničke čitaće, imate pravo koristi, umnažati, mijenjati i distribuirati isključivo u nekomercijalne svrhe. Što znači da na osnovu ove knjige možete učiti ili izvoditi praktične vježbe, samostalno ili unutar neke grupe, pod uvjetom kako se za učenje ili praktične radove ne uzima nikakav oblik naknade, osim u posebnim slučajevima uz izričitu pismenu suglasnost autora.
U slučaju da knjigu mijenjate, nova knjiga mora sadržavati:
Svaki put kada ponovo distribuirate ovaj dokument (knjigu), primatelj automatski prima licencu od izvornog vlasnika za umnažanje, distribuiranje ili mijenjanje sadržaja prema ovim obvezama i uvjetima. Ne smijete nametnuti bilo kakva daljnja ograničenja na primateljevo korištenje ovdje zajamčenih prava. Niste odgovorni za traženje zadovoljavanja ove Licence od drugih stranaka.
Ako raspoznatljivi dijelovi novog djela nisu izvedeni iz ovog dokumenta (knjige), i mogu se sami razumno smatrati nezavisnim i odvojenim djelima, onda ova Licenca, i njeni uvjeti, ne vrijede za te dijelove kada ih distribuirate kao zasebna djela. Ali ako distribuirate iste dijelove kao dio cjeline koja je djelo zasnovano na Programu, distribucija te cjeline mora zadovoljavati uvjete ove Licence, čije dozvole drugima koji su je licencirali vrijede za cjelinu, odnosno svaki njen dio bez obzira tko ga je napisao.
Dakle, ovom dijelu nije namjera da dobije prava ili da pobija vaša prava na djelo koje ste vi napisali u cjelini; namjera mu je poboljšati pravo nadzora distribucije izvedenih ili skupljenih djela zasnovanih na ovom dokumentu (knjizi).
Ne smijete umnažati, mijenjati, podlicencirati ili distribuirati ovaj dokument (knjigu) osim kako je izraženo u ovoj Licenci. Bilo kakav pokušaj umnažanja, mijenjanja, podlicenciranja ili distribuiranja dokumenta (knjige) je nezakonit, i odmah poništava vaša prava prema ovoj Licenci. Međutim, strankama koje su od vas dobile kopije ili prava pod ovom Licencom neće biti poništene licence, dok zadovoljavaju sve uvjete.
Ne morate prihvatiti ovu Licencu, pošto ju niste potpisali. Međutim, ništa vam drugo ne jamči dozvolu za mijenjanje ili distribuciju ovog dokumenta (knjige) ili iz njega izvedenih djela. Te su radnje zakonom zabranjene ako ne prihvatite ovu Licencu. Prema tome, mijenjanjem ili distribuiranjem ovog dokumenta (knjige) (ili djela na njemu zasnovanog), pokazujete svoj pristanak na ovu Licencu, i sve njene obveze i uvjete za umnažanje, distribuiranje i mijenjanje ovog dokumenta (knjige) ili djela na njemu zasnovanih.
Svaki put kada ponovo distribuirate dokument (knjigu) (ili bilo koje djelo zasnovano na njemu), primatelj automatski prima licencu od izvornog vlasnika za umnažanje, distribuiranje ili mijenjanje ovog dokumenta (knjige) prema ovim obvezama i uvjetima. Ne smijete nametnuti bilo kakva daljnja ograničenja na primateljevo korištenje ovdje zajamčenih prava. Niste odgovorni za traženje zadovoljavanja ove Licence od drugih stranaka.
Ako vam se, kao posljedicu sudske presude ili tužbe za kršenje patenta ili iz bilo kojeg drugog razloga (ne samo što se tiče patenata), nameću obveze (bilo sudskim nalogom, nagodbom, ili drukčije) u kontradikciji s uvjetima ove Licence, to ne znači da smijete kršiti uvjete ove Licence. Ako ne možete distribuirati tako da zadovoljavate istodobno i svoje obveze pod ovom Licencom i sve ostale odgovarajuće obveze, onda kao posljedicu uopće ne smijete distribuirati ovaj dokument (knjigu). Na primjer, ako patentna licenca ne dopušta slobodnu redistribuciju ovog dokumenta (knjigu) svima koji njegove kopije dobiju izravno ili neizravno od vas, onda je jedini način na koji možete zadovoljiti i nju i ovu Licencu prestanak distribuiranja dokumenta (knjige).
Autor: hrvoje.horvat1@gmail.com
U trenutku nastanka ideje o pokretanju predavanja Uvod u Linux, sredinom 2013. godine, nastala je i ideja da sva predavanja pretočimo u knjižicu, koja će rasti i razvijati se sa svakim novim predavanjem. Svako poglavlje prate i mnogi primjeri, koje slobodno možete i isprobati. Po završetku svakog predavanja dodavana su i napredna poglavlja, koja nismo pokrili u samom predavanju ali smatram kako će biti dobrodošla za one koji žele naučiti nešto više. Napredna poglavlja također prate praktično upotrebljivi primjeri, koji su odabrani, jer sam ih i sam koristio, a do kojih sam došao, nakon dugog niza godina upotrebe linuxa u praksi. Naime smatram kako su konkretni primjeri iz prakse najbolji za ukazivanje na mogućnosti koje svatko treba isprobati i na koje se treba fokusirati. Nadalje teorija i prateći primjeri, mogu vam pomoći u raznim problematičnim situacijama ili u slučajevima, kada želite optimizirati određene podsustave Linuxa.
Za one koji tek ulaze u svijet Linuxa, napredna poglavlja mogu slobodno preskočiti, dok ne savladaju osnove. Nakon završetka zadnjeg predavanja, dodavati će se i nova poglavlja i popunjavati postojeća, sa što konkretnijim primjerima iz prakse.
Za koga je ova knjiga i što sve pokriva ?
Ova knjiga obrađuje osnove rada u tekstualnom okruženju Linuxa. Namijenjena je svima koji imaju vrlo malo ili niti malo iskustva s Linuxom. Dodatno gotovo svaka važnija cjelina sadrži napredna poglavlja, tako da knjiga može biti od koristi i naprednim korisnicima u cilju detaljnijeg razumijevanja ili optimizacije Linux sustava.
Svi primjeri i savjeti su preporučeni za testnu upotrebu ili za učenje. U slučaju da primjere ili savjete primjenjujete na “žive” sustave odnosno sustave koji su u radnoj (produkcijskoj) upotrebi, odgovornost u slučaju neke greške ili kvara je na vama samima te se autor odriče svake odgovornosti za štetu nastalu vašim radom.
U informatici su svi ili barem velika većina pojmova na globalnoj razini svima razumljivi na engleskom jeziku. Dodatno, nazivi tehnologija, alata i pojmova osmišljeni su i u širokoj upotrebi također na engleskom jeziku.
Stoga je naglasak autora kako će se uz svaki hrvatski pojam OBAVEZNO često ponavljati i izvorni pojam na engleskom jeziku, toliko puta koliko će biti potrebno da ga upamtite - namjerno, više puta nego bi to bilo “normalno”.
Važni dijelovi teksta su pisani zadebljano.
Primjeri naredbi odnosno vježbi, pisani su s posebnom pozadinom poput naredbe :
ls -al
Ista naredba u tekstu je posebno obojana, poput ls -al.
Važne napomene su vidljive u nekoliko razina:
Osnovne informacije
Napomene
Važne napomene
Upozorenja
Brze upute ili napomene
Svi primjeri koje ćemo spominjati u knjizi, pisani su za RedHat/CentOS Linux verzije 6.x (podrška za v.6.x traje do 30.11.2020.g.). U nekim slučajevima navesti ćemo i razlike koje vrijede za RedHat/CentOS verzije 7.x.
Većina navedenih primjera radi i na drugim distribucijama Linuxa uz sljedeće napomene.
Dijelovi koji se tiču:
Se odnose na sve distribucije Linuxa koje su direktno bazirane na RedHatu, poput CentOS i Fedora distribucija ali i drugim distribucijama linuxa koji koriste RPM pakete, poput OpenSUSE, PCLinuxOS, Mandriva i drugi.
Dijelovi koji se tiču:
init procesu
Odnose se na sve grane Linuxa i UNIX-a koje koriste init.
Dakle najnovija generacija RedHat verzije 7.x. ili drugih Linuxa koje su init zamijenile sa systemd imaju malo drugačiji način upravljanja s procesima i servisima.
Korištenjem Linuxa i drugih sustava otvorenog koda (engl. Open Source), u odnosu na sustave zatvorenog koda (koje često nazivamo komercijalnim programima ili sustavima [što ne mora biti točno]), dobivamo sljedeće prednosti :
Sve komponente Linuxa, počevši od Linux kernela (jezgre) do svih programa, kao i drugih Open Source programa i sustava, razvijani su od strane stotina ili tisuća programera a testirane od strane stotina tisuća ili više programera i običnih korisnika. Svi uključeni u razvoj i testiranje (ovdje govorimo, ovisno o programu, i o stotinama tisuća ljudi), kako je praksa pokazala, vrlo brzo (višestruko brže nego kod komercijalnog softvera) su uočavali greške i ispravljali ih ili radili na poboljšanjima, optimizacijama (pr. ubrzanjima) ili dodavanju novih funkcionalnosti. Sve navedeno drastično je povećalo kvalitetu.
Ovdje možemo citirati tvorca Linux kernela : Linus Torvalds : “Given enough eyeballs, all bugs are shallow”.
Dakle ako dovoljno veliki broj ljudi gleda u određeni problem ili grešku (bug), svi problemi će vrlo brzo biti otkriveni (i riješeni).
Ako se već bavite razvojem programa, postavite si sljedeća pitanja :
Sigurnost je usko povezana s paradigmama vezanim za kvalitetu jer kao što veliki broj programera i korisnika koji razvijaju softver povećava kvalitetu, istovremeno otkriva i sigurnosne propuste i ispravlja ih (u praksi puno brže od komercijalnih rješenja). Naime niti najveće korporacije nemaju na tisuće zaposlenih programera i testera na svakom pojedinom softveru, a pošto je njihov izvorni kod skriven od javnosti nitko drugi im ne može puno pomoći - osim ukazati na problem kada se već pojavio i napravio štetu.
Ako se već bavite razvojem programa, postavite si sljedeća pitanja :
Komercijalnim proizvođačima programa i sustava u konačnici nije u interesu imati najbolji, najbrži, najsigurniji i najkvalitetniji program ili sustav sa svim funkcionalnostima koje neki korisnici ili grupe korisnika trebaju jer “za to treba imati puno resursa, od programera, testera, hardvera , … ”. Jedan od problema u razvoju je i fleksibilnost i koliko je vremena potrebno uložiti u razvoj, a da bi program i/ili sustav bio stvarno fleksibilan. Iza svega navedenog zapravo stoje pitanja koja su specifična kod razvoja sustava zatvorenog kôda tj. proizvođača:
S druge strane Open Source sustavi ne boluju od ovakvih (i drugih) stvari te je na vama odluka kada ćete primjerice mijenjati vaš hardver (računalo) jer budimo iskreni - nova verzija Open Source programa nije napravljena na brzinu samo da se proda pa se kasnije ispravljaju (i često naplaćuju) greške a vi ste besplatni tester nečijeg programa/sustava (koji plaćate). Također, kod pisanja kôda ako vaš kod nije fleksibilan u širem smislu riječi, često će vas netko već upozoriti na to i/ili ispraviti vaš “loše” napisan kôd.
Ako se već bavite razvojem programa, postavite si sljedeća pitanja :
Open Source programi i sustavi se u praksi barem pokušavaju držati standarda te ne uvode neke svoje (izmišljene) formate datoteka, standarde, protokole i sl.. Stoga imate veću vjerojatnost da će Open Source program ili sustav koji vi koristite raditi u kombinaciji s Open Source programom i sustavom koji koriste vaši klijenti ili netko drugi. Također je velika vjerojatnost ako pr. koristite neki mrežni protokol koji je pisan prema načelima open sourcea, iz jednog izvora ili su dio jednog rješenja ili proizvoda, da će isti raditi s drugim rješenjima ili proizvodima.
Naime ovo je najviše slučaj kod raznih sustava, raznih protokola (pr. mrežnih protokola) i uređaja ali i kod programa i njihovih međusobno većinom namjerno ili ne nekompatibilnih formata datoteka.
Suprotno mišljenju, podrška za Open Source programe i sustave postoji u istoj mjeri kao i za komercijalne programe i sustave.
U praksi, podrška je višestruko bolja, kvalitetnija i uslužnija za Open Source programe i sustave. Zbog nekoliko činjenica:
Pitanje za one koji su i dalje skeptični prema podršci za Open Source i koji bi platili (i plaćaju) “koliko god treba” :
Da li ste platili komercijalnu podršku za neki Open Source program ili sustav i ostali nezadovoljniji u odnosu na Close Source komercijalne sustave za koje (već) plaćate podršku ?
Ako i sami razvijate neki close source program ili sustav, Pitajte vaše krajnje korisnike (preko nekog posrednika), kakva je podrška za vaš program ili sustav ?
Troškovi Open Source programa i sustava su nekada i višestruko manji od troškova komercijalnih programa i sustava :
Lista nekih od Open Source programa i sustava, prema kategorijama, vidljiva je na našoj stranici: https://www.opensource-osijek.org/wordpress/najpoznatiji-projekti/
Nakon, po nekima samo teorije, o prednostima upotrebe Linuxa i drugih sustava otvorenog koda, pogledajmo primjere upotrebe u praksi. Naime sve veći broj država i državnih agencija od Sjedinjenih Američkih Država, preko Europe do Japana, sve više koristi Linux kao i razne druge programe i sustave bazirane na principima otvorenog koda. Ne zaboravimo i sve veći broj tvrtki: od najvećih korporacija do malih tvrtki sa svega nekoliko zaposlenih.
Krenimo od upotrebe Linuxa na mjestima koja će vas možda i začuditi
Državne agencije i ministarstva :
Školstvo :
Neke od velikih tvrtki ili korporacija koje koriste Linux i OpenSource za poslovanje:
Osim navedenog i većina najjačih superračunala u svijetu koristi Linux.
Dobro, mnoge državne institucije i tvrtke sve više koriste programe i sustave otvorenog koda ali tko još (pametan) od tvrtki razvija ovakve sustave?.
Navesti ću samo nekoliko velikih tvrtki koje su najviše uložile u programe i sustave otvorenog koda:
IBM
SUN Microsystems
RedHat
Microsoft
Apple
Što je s malim tvrtkama ?
Osim navedenih velikih igrača, veliki broj malih tvrtki je osnovan na bazi poslovnog modela koji obuhvaća neke (ili sve) segmente komercijalne upotrebe “Open Source” programa i/ili sustava:
Za sve koji žele vidjeti komentare i iskustva ljudi koji su najviše doprinjeli razvoju Open Source inicijative, iz prve ruke, preporučujemo da pogledaju dokumentarni film : Revolution OS : IMDB : http://www.imdb.com/title/tt0308808/
U dokumentarcu nam svoja iskustva govore :
Dodatno preporučujemo i :
Ako se bavite razvojem softvera (ne nužno i Open Source), preporučujem da pročitate knjižicu (~35 stranica) koja je promijenila stavove mnogih tvrtki o Open Sourceu. Autor knjige je Eric Steven Raymond, koji je od sredine 1980 radio na razvoju raznih programa za Unix:
On je praktično cijelo desetljeće radio na razvoju Unix programa ustaljenim i stabilnim metodologijama razvoja (poput Katedrale kako i sam kaže) a odatle i naziv knjige. Nakon toga krenuo je u avanturu razvoja programa metodologijom koju je preporučio Linus Torvalds, a koju on naziva modelom tržnice (engl. Bazaar).Dakle razvoja u kojem sudjeluje veći ili veliki broj ljudi, od kojih svatko često objavljuje promjene koda, … ali o tome u knjizi. On nam opisuje svoja iskustva i probleme uz rješenja, na koje je nailazio u razvoju e-mail klijenta (Fetchmail) na kojem je počeo raditi.
Njegova knjiga je i po mnogima uzrokovala odluku tvrtke Netscape Communications Corporation koja je tvorac, u to vrijeme, najboljeg Web preglednika, da kompletan kôd Netscape Navigator preglednika, daju u Open Source i otvore Mozilla fondaciju.
Taj potez je kasnije otvorio vrata za razvoj današnjih preglednika baziranih na Mozilla Firefox pregledniku koji je razvijan unutar fondacije Mozilla.
Knjižica se zove : The Cathedral and the Bazaar , možete ju potražiti na internetu : njena izvorna verzija se može pronaći na : http://www.unterstein.net/su/docs/CathBaz.pdf ⇒ Postoji i proširena verzija od stotina stranica, koja je naravno komercijalna i zanimljiva ali mislim da je za razumijevanje svega dovoljna i ova izvorna verzija.
Priču o Linuxu moramo započeti puno prije njegovog vremena nastanka, točnije nekih dvadesetak godina ranije.Ona počinje s razvojem Unix operativnih sustava.
Što je toliko posebno oko UNIX-a ?.
Razne varijante UNIX-a su u upotrebi već nekoliko desetaka godina te provjerene u radu u raznim industrijskim i drugim zahtjevnim okruženjima (telekomi, banke, industrija , vojska, … ).
Operacijski sustav Unix razvili su znanstvenici Ken Thompson i Dennis Ritchie u tvrtki AT&T, točnije radeći u njihovoj sestrinskoj tvrtki Bell Laboratories krajem 1969 godine. Prva radna verzija nastala je početkom 1970 godine. Prve verzije UNIXa su bile razvijane u programskom jeziku Assembler a kasnije, negdje tijekom 1972, cijeli Unix je napisan od početka, korištenjem programskog jezika C.
Prelaskom na programski jezik C povećala se portabilnost softvera, odnosno samog UNIXa i na druge platforme odnosno arhitekture procesora.
Naime programski kod pisan u programskom jeziku Assembler je čvrsto vezan za arhitekturu procesora te ga je bilo gotovo nemoguće ili vrlo teško prepisati za neku drugu arhitekturu. Prelazak na programski jezik C je pojednostavio ovaj proces, pri čemu je zadržana brzina rada.
Danas se Unix koristi na različitim arhitekturama procesora poput:
1.1.1970 se smatra rođenjem Unixa
Krajem 1970 te početkom 1980 tvrtka AT&T licencirala je Unix drugim tvrtkama, koje su krenule s razvojem svojih verzija Unixa.
Na slici je vidljiv razvoj raznih verzija Unix operacijskog sustava od 1970 godine do danas.
Izvor slike : https://en.wikipedia.org/wiki/History_of_Unix#/media/File:Unix_history-simple.svg
Autor : Levenez Unix History Diagram, Information on the history of IBM's AIX on ibm.com “User:Eraserhead1, Infinity0, Sav_vas”
UNIX operacijski sustavi su u širokoj upotrebi preko 40 godina i oni su utjecati na razvoj drugih operacijskih sustava. Osim toga, veliki broj organizacija, tvrtki i pojedinaca su bili i jesu uključeni u njegov razvoj i napredak.
Neke od inačica UNIXa, koje su i danas u upotrebi su:
Zanimljivo je da je i tvrtka Microsoft kupila licencu za Unix od tvrtke AT&T, krajem 1970, koji je razvijala pod imenom Xenix. Njihova inačica Unixa je sredinom 1980 postala i jedna od češće korištenih varijanti Unixa, ali ju je kasnije Microsoft prodao tvrtki Santa Cruz Operation (SCO) koja ju je nastavila razvijati pod imenom SCO UNIX, a danas se prodaje pod imenom SCO OpenServer.
Detaljniji razvoj UNIXa od 1969 do danas vidljiv je u ovom dokumentu (koji se stalno osvježava) :
http://www.levenez.com/unix/unix.pdf
Za Unix možemo reći
Što je specifično za sve UNIXoidne operacijske sustave ?
Svi Unixoidni operacijski sustavi imaju zajedničko nekoliko stvari:
program 1 | program 2 | program 3
Osnovna filozofija Unixa kaže :
Everything is a file – Sve je datoteka i prema tome baratanje sa samim operacijskim sustavom, njegovim aplikacijama i njegovim hardverom je vrlo jednostavno. Nadalje moguće je skriptirati i automatizirati svaki djelić sustava, prema potrebi, upotrebom shell skripti.
Za razumijevanje razvoja Linuxa bitno je razumjeti i razvoj sustava otvorenog koda (Engl. Open Source). Naime 1983. godine - pokreće se Free Software Movement te godinu dana kasnije (1983/84) Richard Stallman pokreće GNU projekt koji 1984 kreće s razvojem prvih programa.
Želja je bila sve programe koji postoje u komercijalnim Unix operativnim sustavima napisati “od nule”, ne koristeći niti jednu liniju koda od izvornih programa, jer bi to bilo kršenje autorskih prava. Dakle željelo se napisati nove programe s istom ili proširenom funkcionalnosti, od postojećih i objaviti ih pod nekom od licenci otvorenog koda.
Veći dio ovog posla, a ovdje govorimo o tisućama programa, je dovršen negdje u toku 1992. godine.
Neovisno o razvoju FSF i GNU 1991. godine Linus Torvalds razvija jezgru (Engl Kernel) i slijedi logičan korak odnosno povezivanje tisuća programa pisanih unutar GNU pokreta i samog kernela. Od tog trenutka povezano je sve što je bilo potrebno za stvaranje novog operativnog sustava danas poznatog pod nazivom Linux (nekada se naziva i GNU Linux).
Od tada do danas pojavile su se razne varijante Linuxa, od kojih su se ustalile tri značajnije grane, na osnovu kojih su nastali na deseci drugih Linux distribucija:
Nešto više detalja možete vidjeti u našem predavanju o open source-u: : https://www.opensource-osijek.org/wordpress/predavanja/etfos-predavanje-sto-kako-i-zasto-open-source/
Počeci Linuxa
Linux se od prve verzije ili takozvane distribucije, nastavio razvijati preko nekoliko glavnih distribucija, što je vidljivo na slikama (1)
Distribucije bazirane na Debian Linuxu, koji koristi .deb format paketa te dpkg package manager i pripadajuće frontend programe.
Distribucije bazirane na RedHat Linuxu, koji koristi .rpm format paketa te rpm package manager i pripadajuće frontend programe.
Distribucije bazirane na Slackware Linuxu, koji koristi .txz format paketa te Tzv. pkgtools alate, kao i pripadajuće frontend programe.
Pogledajmo i cijelo stablo najčešće korištenih i najrasprostranjenijih distribucija Linuxa:
Lista gotovo svih distribucija Linuxa, nalazi se na : https://en.wikipedia.org/wiki/List_of_Linux_distributions.
Linux pristupa hardveru na vrlo niskoj razini te je za razumijevanje njegovog ali i rada bilo kojeg drugog operacijskog sustava, potrebno i razumijevanje rada samog računala. U poglavljima koja slijede upoznati ćemo se s osnovama arhitekture i rada računala.
Svako računalo se sastoji od :
CPU odrađuje sve :
poput zbrajanja, oduzimanja, množenja, dijeljenja i drugih matematičkih operacija
Možemo reći kako je CPU jezgra svakog računala. On je zadužen za pokretanje, rad i kontrolu cijelog sustava, počevši od njegovog učitavanja s tvrdog diska, SSD diska ili nekog drugog medija poput CD/DVD-ROM, USB stick ili sličnih, do učitavanja operacijskog sustava sa svim upravljačkim programima te pokretanja i rada svih programa i aplikacija.
Pogledajmo osnovnu logičku arhitekturu računala :
Kao što je vidljivo iz slike, sve komponente računala su povezane preko sabirnice.
Većina navedenih komponenti računala, nalazi se na matičnoj ploči (Engl. Motherboard). Druge komponente, poput tvrdog diska, CD/DVD-ROM i drugih uređaja poput grafičke ili mrežne kartice, se spajaju zasebno, svaka na svoje sučelje, odnosno konektor, na matičnoj ploči. Tako se grafička ili mrežna kartica obično spajaju na PCI Express ili PCI sabirnicu odnosno na njen utor. S druge strane klasični tvrdi disk ili SSD disk te CD/DVD-ROM uređaji spajaju se na ATA ili SATA kontroler na matičnoj ploči, preko posebnog ATA ili SATA kabela te dodatnog kabela za napajanje, sve ovisno je li njihovo sučelje ATA ili SATA vrste.
Matična ploča (engl. Motherboard) je centralni dio svakog računala. Na njoj se nalaze sve važne komponente za funkcioniranje cijelog računala, poput:
Kako bi razumjeli rad računala, pogledajmo logičku shemu malo starijeg dizajna matične ploče s pripadajućim CPUom (Intel Core 2 Duo E8500) i njegovim chipsetom (Intel Q45 i ICH10) :
Na ovoj logičkoj shemi se vidi pozicija svih važnih dijelova matične ploče. CPU (Central Processing Unit) ili centralni procesor (na vrhu slike) komunicira s ostatkom računala, preko posebne vrste sabirnice. Ova sabirnica povezuje CPU sa tzv. chipsetom, a koji je na ovoj generaciji procesora (odnosno u to vrijeme), bio podijeljen u dva dijela.
Pod zajedničkim nazivnikom cijeli chipset je zadužen za komunikaciju između procesora i memorije te svih ostalih komponenti sustava. Od disk kontrolera i diskova, preko sabirnice do grafičke, mrežne, zvučne i drugih kartica. Te od USB do serijskih, paralelnih i drugih sučelja (portova). Dakle možemo reći kako sprega procesora i chipseta čine matičnu ploču.
Mana ovakvog dizajna se pokazala zbog potrebe za sve većim brzinama komunikacije između procesora i Northbridgea jer je povećanjem brzine obrade podataka novijih procesora bilo potrebno ubrzati i komunikaciju s RAM memorijom ali i s vrlo brzom PCI Express sabirnicom - za spajanje grafičkih i drugih super brzih kartica.
Pogledajte i stvarnu sliku procesora koji pripada generaciji s ovakvim dizajnom (CPU + Northbridge + Southbridge).
Na slici je Intel Pentium 4 (Prescott 2M ) radnog takta 3.2GHz, FSB 800MHz, sa 2MB priručne (Engl. Cache) memorije :
Autor slika CPU-a : (Eric Gaba – Wikipedia)
Pogledajte i sliku pripadajuće matične ploče za Intel Pentium 4 (Prescott) 640 CPU :
Opis:
1. BIOS i LPC sučelje
2. SATA sučelja
3. Southbridge chip
4. PCI utori (PCI sabirnice)
5. Kontroler (Chip) mrežne kartice
6. PCI-Express (x4 i x16) utori (PCI Express sabirnice)
7. Vanjski konektori : VGA, LAN, Audio, Serijski i paralelni portovi, USB , PS/2
8. CPU utor : Socket 775 utor za Pentium 4 Prescott 2M procesor
9. Northbridge chip (s aluminijskim hladnjakom)
10. Utori za RAM memoriju (DDR-400)
11. Super I/O kontroler Chip
12. Floppy disk konektor (34.pin)
13. ATA (PATA) disk konektor (40. pin.)
Sada probajte usporediti komponente koje su označene u opisu, s onima koje smo opisali u teoriji, na samom početku ovog poglavlja.
A sada pogledajmo noviju generaciju CPU (Intel i5 6500) i njegov pripadajući chipset (Z170)
U najnovijim generacijama procesora i chipseta, ovaj problem je riješen tako što je memorijski kontroler (MMU) prebačen unutar samog procesora. Osim toga i kontroler zadužen za super brzu PCI Express sabirnicu se sada također nalazi unutar procesora. Dakle sva funkcionalnost Northbridgea je integrirana unutar samog procesora.
Sada je sljedeći logičan korak bio ubrzati i vezu sa Southbridge dijelom chipseta, što je i učinjeno. Samim time je i “Southbridge” dobio veću propusnost pa je u mogućnosti da poveća propusnost prema PCI Express sabirnici za koju je zadužen (x4 i x1). Nadalje povećane su i brzine rada SATA kontrolera, prema novim standardima (SATA 3 , koji sada omogućavaju brzinu od 600MB/s po disku), USB portova (koji sada podržavaju USB 3.0 standard koji omogućava brzinu od 625MB/s) i sl.
U novom dizajnu je zadržana LPC sabirnica za komunikaciju sa Super I/O : serijski i paralelni portovi, BIOS i sl.
I na kraju priče o sabirnicama, pogledajmo brzine PCI, PCI-X i PCI Express sabirnnica, na koje spajamo različite kartice (mrežne, SAS/SATA, zvučne i druge).
Sada pogledajmo brzine sabirnica, na koje spajamo mrežne (i druge) kartice.
Starije vrste sabirnica (PCI i PCI-X)
| Naziv | Brzina rada (MHz) | Širina sabirnice | Propusnost Mb/s |
| PCI | 33 MHz | 32 bitna | 1,064 Mb/sec |
| PCI | 33 MHz | 64 bitna | 2,128 Mb/sec |
| PCI | 66 MHz | 32 bitna | 2,128 Mb/sec |
| PCI | 66 MHz | 64 bitna | 4,256 Mb/sec |
| PCI-X | 100 MHz | 64 bitna | 6,400 Mb/sec |
| PCI-X | 133 MHz | 64 bitna | 8,192 Mb/sec |
Novije sabirnice (PCIe - PCI Express), kod kojih se komunikacija odvija prema Tzv. komunikacijskim kanalima ili trakama (Engl. Lane), svaki kanal je dvosmjeran, i zapravo se sastoji od dva kanala (para) jedan za primanje i jedan za slanje podatka.
| Jedna traka (per lane) | Propusnost Gb/s (zaokruženo) - u svakom pojedinom smjeru | Dvosmjerno Gb/s | MB/s jednosmjerno |
| PCIe - 1x v.1 | 2 Gbps | 4 Gbps | 250 MB/s |
| PCIe - 1x v.2 | 4 Gbps | 8 Gbps | 500 MB/s |
| PCIe - 1x v.3 | 8 Gbps | 16 Gbps | 985 MB/s |
| PCIe - 1x v.4 | 16 Gbps | 32 Gbps | 1969 MB/s |
Maksimalne brzine su prema tome (sa 16 traka):
| Prema trakama (per lane) | Propusnost Gb/s (zaokruženo) - u svakom pojedinom smjeru | Dvosmjerno Gb/s | GB/s jednosmjerno |
| PCIe - 16x v.2 | 64 Gbps | 126 Gbps | 8 GB/s |
| PCIe - 16x v.3 | 126 Gbps | 252 Gbps | 15.75 GB/s |
| PCIe - 16x v.4 | 252 Gbps | 504 Gbps | 31.51 GB/s |
Za ostale brzine (x2,x4 i x8) si izračunajte sami. U svakom slučaju, važno je kako sabirnica mora biti dovoljno brza kako bi podnijela brzine svih kartica koje ugrađujete u računalo odnosno poslužitelj.
Tipkovnica pripada kategoriji ulaznih uređaja. Bez obzira na vrstu ili način spajanja, bilo to preko PS/2, USB ili nekog drugog konektora, rad svih tipkovnica je isti.
Sve tipkovnice na sebi imaju tipke na kojima su ugravirana ili otisnuta slova, brojevi i posebni znakovi. Osim osnovnih tipki, postoje i tipke za posebne namjene:
F1 do F12)Shift, Ctrl, Alt , Alt Gr , Print Scrn , SysRq , ESC Insert, Delete, Home , Pause/Break, SysRq i drugihIzgled standardne tipkovnice s “Engleskim” i to “QWERTY” rasporedom tipki, vidljiv je na slici dolje:
Slika je preuzeta sa : https://en.wikipedia.org/wiki/File:Qwerty.svg
Tipkovnica se sastoji od :
Tipkovnica se sastoji od tipki ispod kojih se nalaze prekidači odnosno sklopke. Bez obzira da li se radi o membranskoj, mehaničkoj ili nekoj drugoj tipkovnici, pritiskom na tipku, aktivira se njen prekidač, koji zatvara strujni krug koji predstavlja tu tipku. Tako pritisnut prekidač mikrokontroleru (procesoru tipkovnice) daje podatak o poziciji tipke koja je stisnuta.
Slika prikazuje logičku shemu rada tipkovnice:
Stiskanjem pojedine tipke zatvara se jedan vertikalni i jedan horizontalni strujni krug, koji su pod kontrolom mikrokontrolera tipkovnice.
Mikrokontroler tipkovnice na osnovi pozicije stisnute tipke, odnosno reda i stupca strujnog kruga kojeg zatvara pojedina pritisnuta tipka, “zna” koja je tipka stisnuta.
Svaka tipka stiskanjem zatvara strujni krug određenog reda i strujni krug određenog stupca kao što je vidljivo na slici gore. Tako se prema slici gore, stiskanjem tipke Q zatvaraju strujni krugovi prvog reda i prvog stupca. Drugim riječima svaka tipka stiskanjem zatvara strujne krugove “x” i “y” osi. U ovom pojednostavljenom primjeru dobilo bi se očitanje pozicije (koordinata): x1, y1.
Mikrokontroler tipkovnice skenira sve redove i stupce u pravilnim vremenskim intervalima. Tako je za USB tipkovnice interval skeniranja između 18.77 ms i 32.75 ms dok je za PS/2 tipkovnice interval između 2.83 ms i 10.88 ms dakle znatno kraći. To u praksi znači da su PS/2 tipkovnice “responzivnije” odnosno kada se pritisnuta tipka brže registrira.
Dodatno budimo svjesni činjenice kako se stisnuta tipka ne očitava isti tren kada je stisnuta već u prvom slijedećem intervalu u kojemu ju očita mikrokontroler tipkovnice.
To znači da kod najsporijih modela USB tipkovnica, ako ste stisnuli tipku a tek je prošao vremenski interval skeniranja, potrebno je do 33 ms (33 tisućinke sekunde) da kod slijedećeg intervala skeniranja, stisnuta tipka bude registrirana.
Kada je tipka očitana od mikrokontroler tipkovnice, on gleda u svoju matricu tipki (Engl. Key matrix), da bi pronašao koja je tipka stisnuta. Potom ju uspoređuje s tablicom koja se zove Character Map tablica a koja je pohranjena u njegovoj ROM memoriji. Tako se dobiva Character code odnosno jedinstveni kod za stisnutu tipku.
Mikrokontroler tipkovnice tada traži signal prekida (Engl. Interrupt request) od centralnog procesora (CPU).
Kernel operacijskog sustava “hvata” zahtjev za prekid i kada naš prekid dođe na red, preuzima ga. Preuzeti zahtjev se prosljeđuje, prema upravljačkom programu (Engl. driveru) za tipkovnicu.
Tek tada operacijski sustav Character code stisnute tipke učitava preko mikrokontrolera tipkovnice.
Operacijski sustav u procesu obrade Character codea, može koristiti svoju tablicu karaktera (slova/brojeva/znakova) te preći (pregaziti) preko one koju je dobio od mikrokontrolera tipkovnice. Ovo je korisno ukoliko se koriste tipke na tipkovnici (i njeni pripadajući kodovi) koje nemaju ispravan ekvivalent na trenutnim postavkama sustava.
Što se događa u ovom koraku ?.
Dobili smo numerički kod, koji predstavlja stisnutu tipku, kod se zove Scan code.
Taj kod se potom mapira u Tzv. Key code koji predstavlja svako pojedino slovo/znak/broj/funkcijsku tipku …
Tablica s mapiranjima ( poveznicama ) Scan Code u Key code ovisi o tipkovnici koju koristimo.
Definicija tipkovnice s rasporedom tipki te regionalnih postavki tipki, nalazi se u datoteci /etc/sysconfig/keyboard.
Ona se obično automatski podešava kod instalacije Linuxa.
Ovdje se nalazi nekoliko postavki:
KEYBOARDTYPE=“sun|pc” moguće opcije su ili “SUN” ili “PC” - u većini slučajeva to je uvijek PCMODEL=” “ i LAYOUT=” “ koji točnije definiraju vrstu i tip tipkovnice.KEYTABLE=”<file>“ označava upravo tablicu s mapiranjima tipki o kojoj smo maloprije govorili. Unutar direktorija : /lib/kbd/keymaps/i386/ nalaze se pod direktoriji s rasporedom tipki : pr. : querty , quertz , azerty itd.. Unutar njih se nalazi definicija tipki za pojedine modele tipkovnica. Za hrvatski raspored tipki i “naših” znakova (šđčćž) koristi se tablica definirana unutar datoteke croat.map.gz koja je komprimirana datoteka croat.map i koja se koristi u slučaju da koristimo Hrvatsku tipkovnicu.
Sada možemo i provjeriti koja tablica je učitana i koristi se, sve s pomoću naredbe dumpkeys :
dumpkeys > my_keymap
Dodatno sve možemo snimiti u datoteku “my_keymap” te ju prema potrebi pregledati kasnije.
dumpkeys > my_keymap
I na kraju sumirajmo
Što se događa kod pritiskanja tipke ? :
a1e 9e30
Koji su još elementi uključeni u ovu priču
Ovdje postoji još jedna komponenta a to je Konzola i/ili program u kojem radimo. U slučaju konzole praktično je to naš zaslon/ekran. Osim klasične konzole, pristup na konzolu može biti i preko Terminal programa za udaljeni pristup, poput :
telnet ili ssh terminala za udaljeni pristupSvaka konzola kao i terminal moraju imati i odabrani Character set poput :
Dakle sada se Key code 30 mapira (ako koristimo ASCII) u ASCII kod 97.
Ovaj korak mapiranja se zove enkodiranje (Engl. Encode).
Mapiranje Key codea u Character set se zove enkodiranje.
Zatim sve ide dalje prema programu u kojem radimo (tipkamo) te se iscrtavaju stisnute tipke odnosno slova (ili što smo već zapravo stisnuli na tipkovnici) i to korištenjem Fonta koji je odabran.
Font definira stil i oblik svih pojedinih slovnih znakovnika (Engl. Glyph) i slovnih simbola, odnosno svakog tipografskog karaktera.
Ovisno o Fontu i njegovoj veličini, slova se iscrtavaju na vizualno drugačiji način. Pogledajmo isti tekst ispisan s različitim fontovima iste veličine:
Kodne stranice
Kako su nastale kodne stranice
Prva osobna računala su razvijana za englesko govorno područje, pa je prema tome prvo bilo potrebno razviti određeni set slova i interpunkcijskih znakova, kao i brojeva i posebnih znakova za engleski jezik. Tako je otprilike i nastao ASCII set za koji je odlučeno da je dovoljno adresirati 7 bitova, što omogućava ukupno 128 slova/brojeva/znakova. Pogledajte ASCII tablicu. Unutar ovog seta odnosno tablice definiran je osnovni niz slova/brojeva/znakova koji je bio zadovoljavajući u trenutku stvaranja. Kasnije se pojavila potreba za dodavanjem novih posebnih znakova, tako što se ovaj set proširio na 8 bitova, pa je sada bilo moguće koristiti do 256 znakova.
Tako je nastao prošireni ASCII set. Ovaj set je nadogradnja osnovnog ASCI seta, tako da počinje od 128 pozicije (osnovni ASCII set završava na poziciji 127), sve do 255-te, gdje se sada nalaze dodatni znakovi.
Kako su se s vremenom osobna računala koristila i izvan engleskog govornog područja, pojavila se potreba za korištenje znakova koji su specifični za druge jezike. Ideja je bila koristiti osnovni ASCII set (0-127) kao standardan a proširiti ga sa setom specifičnim za pojedini jezik (ili više njih) - slično kao kod proširenog ASCII seta. Ovakva upotreba se naziva upotrebom Tzv. “kodnih stranica” odnosno “Code pages” na engleskom.
Jedna od prvih kodnih stranica je bila CP437, koja je sadržavala posebne znakove, grčka i još poneka slova ali ne i naša. Na osnovi nje je nastala i jedna od prvih kodnih stranica koja je uključivala naša slova (veliko i malo : šđčćž) dakle 8859-2 (znana i kao “Latin 2”). Ona je napravljena za sve jezike centralne i istočne europe, s latiničnim pismom.
Osim nje postoji i 8859-1 (znana i kao “Latin 1” ) ali ona je za jezike zapadne europe (Njemački, Francuski, …).
Da ne bi bilo zabune postoji i cijeli niz kodnih stranica za druge jezike. Pogledajte samo listu za kodne stranice bazirane na ISO 8859-.
Unutar nekih operacijskih sustava napravljene su “vlastite” kodne stranice, poput Windows 1250 (Latinična slova - poput Latin 2 (8859-2)) dakle za centralno i istočno europske jezike.
Problem se javlja kada trebate pisati nešto za što su vam potrebne dvije (ili više) kodnih stranica jer unutar jedne od njih nemate sve znakove ili slova koja su vam potrebna. Ako recimo radite na nekom dokumentu, na taj način, morate biti sigurni da i primatelj vašeg dokumenta ima sve iste kodne stranice koje ste i vi koristili.
Kao što smo rekli ASCII set je prilično ograničen što se tiće posebnih znakova te se u novije vrijeme često koristi enkodiranje prema UTF-8 standardu. UTF-8 unutar sebe podržava kompletan set znakova iz ASCII seta te ga znatno proširuje. On je dovoljno velik da u njega stanu (gotovo) sve kodne stranice koje postoje ili koje vam trebaju.
Upravo je to i bila ideja razvoja UTF-8 standarda - praktično jedan set za sve jezike.
ASCII set podržava do 128 karaktera (slova/znakova/brojeva/…) dok UTF-8 podržava njih preko milijun !.
UTF-8 je dominantan standard za enkodiriranje karaktera na Webu (World Wide Web), te se prema statistikama za 2016. godinu koristi na oko 86.5% svih web stranica na svijetu.
Pogledajte i poglavlje "Sistemske (Environment) varijable" i to primjer s terminalima i enkodiranjem (kodnim stranicama).
U narednom djelu objasniti ćemo nekoliko tipki koje imaju “posebnu” funkcionalnost a koju je potrebno razumjeti.
Alt Gr odnosno Alt Graph ili Graphic daje nam mogućnost ispisa posebnih znakova/karaktera na tipkovnici. Dodatno moguć je i ispis posebnih znakova prema kodu karaktera - ako nam je poznata njena tablica odnosno kod za karaktere - poput primjerice ASCII tablice ).
Tipku Alt Gr moramo koristiti poput tipke shift - držimo ju stisnutu i istovremeno stišćemo drugu tipku.
Tipku Alt Gr često nazivamo i “desni” Alt a na tipkovnicama koje ju nemaju, istu funkcionalnost dobivamo istovremenim stiskanjem tipki Ctrl i Alt.
S jedne strane možemo dobiti znak/karakter kombinacijom Alt Gr tipke i bilo koje tipke na našoj tipkovnici, koja nam daje taj poseban znak.
Primjerice stiskanjem Alt Gr te tipke/slova V , dobivamo znak @.
S druge strane ako znamo kod za željeni karakter, to isto možemo dobiti stiskanjem tipke Alt Gr i broja koda.
Tako je prema ASCII tablici za naš znak @ kod 64.
Stisnimo Alt Gr i na numeričkoj tipkovnici (dok držimo stisnut Alt Gr) upišimo 64 te pustimo tipku Alt Gr.
Dobiti ćemo istu stvar kao u primjeru gore.
Pogledajmo tablicu s osnovnim znakovima/karakterima, najčešćim na Hrvatskim tipkovnicama.
| Karakter/znak koji ćemo dobiti | Alt Gr i tipka: |
| \ | Q |
| | | W |
| [ | F |
| ] | G |
| @ | V |
| { | B |
| } | N |
| § | M |
| ~ | 1 |
| ^ | 3 |
| ˘ | 4 |
| ` | 7 |
| ˙ | 8 |
| ´ | 9 |
| ˝ | 0 |
Za druge (međunarodne) tipkovnice, pogledajte listu na **Wikipediji**.
SysRq funkcionalnost
Jedna od rijetko korištenih tipki (kao i njene funkcionalnosti) je tipka SysRq. Na nekim tipkovnicama je označena samo kao tipka Print Scrn.
Pritiskom na tipku SysRq uzrokuje se izvršavanje posebnog signala prekida (Engl. Interrupt).
Izvorna namjena ove tipke je bila pokretanje više operacijskih sustava na prvim PC AT računalima 80286, koja su radila na 6MHz.
Iako je izvorna namjena SysRq odavno napuštena, neki operacijski sustavi i dalje ju koriste za svoje potrebe.
Linux i dalje ima sposobnost slušanja ovog signala prekida (ili pritiskanja ove tipke) ali u kombinaciji s drugim tipkama. Ova kombinacija SysRq i drugih tipki se u Linux terminologiji zove Magic SysRq Key.
Ova funkcionalnost je povezana direktno s Linux kernelom te je stoga potencijalno opasna (osim ako ne znate što radite).
Preciznije - funkcionalnost ove tipke je implementirana unutar upravljačkog programa tipkovnice. To znači unutar trenutnog (radnog) linux kernela. Prema tome, dokle god radi Linux kernel, radi i ova funkcionalnost.
Ova kombinacija tipki se često koristi u procesu oporavka uslijed neke velike greške u radu sustava ili u slučajevima kada je potrebno napraviti Tzv. Kernel Dump/Crashdump proceduru. Za više detalja pogledajte poglavlje ” Kernel Dump/Crashdump/core dump “
Ovu kombinaciju možemo svrstati i u kategoriju Escape sekvenci (nizova).
Navedena kombinacija tipki se sastoji od istovremenog stiskanja tipki : Alt SysRq i tipke koja označava željenu funkcionalnost.
Tablica predstavlja najčešće korištene funkcionalnosti SysRqa:
| Funkcionalnost | Tipka/Znak/Slovo |
| Log Level za konzolu (poruke koje će se prikazivati na konzoli (ekranu)) | 0 1 2 3 4 5 6 7 8 9 |
| Nasilni i trenutni restart sustava (bez sinkronizacije datotečnog sustava iz RAM memorije na disk) | b |
| Pokreni gašenje sustava uz crashdump proceduru (ako je omogućena ) | c |
| Pošalji signal **SIGTERM** svim procesima osim init procesu (ovo uredno gasi sve procese/programe) | e |
| Pošalji signl **SIGKILL** svim procesima osim init procesu (ovo nasilno gasi sve procese/programe) | i |
| Resetiraj **nice** prioritete za sve procese koji su u kategorijama high-priority i Real-Time | n |
| Sinkroniziraj sve mountane datotečne sustave iz RAM memorije na disk (sync) | s |
| Napravi “remount” svih mountanih datotečnih sustava kao read-only (bez prava zapisivanja - samo ćitanja) | u |
Primjeri upotrebe
Najčešća upotreba ove funkcionalnosti se svodi na nekoliko koraka.
1. Potrebno je osigurati se da je ova funkcionalnost uključena Privremeno ju uključimo :
echo 1 > /proc/sys/kernel/sysrq
2. Slanje/pozivanje željene SysRq funkcionalnosti.
Zamislimo slučaj u kojemu se naše računalo ili poslužitelj potpuno zaglavio te ga želimo restartati ovom metodom jer ništa drugo ne pomaže. Ova metoda radi i preko udaljenog pristupa (telnet/ssh/…).
Mi ćemo pozvati prvo :
echo e > /proc/sysrq-trigger
echo i > /proc/sysrq-trigger
echo s > /proc/sysrq-trigger
echo u > /proc/sysrq-trigger
i potom konačno:
echo b > /proc/sysrq-trigger
Čim smo napravili zadnji korak računalo će se bezuvjetno restartati.
Print Scrn funkcionalnost
Korištenjem Print Scrn funkcionalnosti odnosno samo stiskanjem ove tipke (na istoj tipki je i SysRq ) kopiramo sadržaj našeg zaslona (Engl, screenshot) u radnu memoriju. Stiskanjem tipke Print Scrn kopiramo naš cijeli grafički “ekran”, sa svim prozorima i radnom površinom. Kopira se sve što vidimo na našem zaslonu monitora u grafičkom načinu rada ( X Window grafički sustav ).
Kasnije je moguće snimiti/pohraniti ovu sliku doslovno kao sliku (bitmapu) u nekom od programa za grafičku obradu (slika) pr. GIMP.
U slučaju kada želimo kopirati samo sadržaj jednog otvorenog prozora, potrebo je označiti taj prozor - da postane aktivan, te istovremeno stisnuti kombinaciju tipki : Alt Gr i Print Scrn.
Nakon ovog procesa također možemo snimiti/pohraniti “sliku” označenog prozora kao bitmap sliku odnosno kao rastersku sliku.
U slučaju da imamo potrebu promijeniti postavke tipkovnice, sa recimo Američke (us) na Hrvatsku (croat) to je vrlo jednostavno.
Rekli smo kako se definicije svih tipkovnica sa pripadajućim Key Codeovima nalaze unutar direktorija /lib/kbd/keymaps/i386 i to pozicionirane unutar poddirektorija prema prvim tipkama : “azerty” , “qwerty” , “qwertz” i druge. Tako je definicije za Hrvatsku tipkovnicu zapisana u datoteci /lib/kbd/keymaps/i386/qwertz/croat.map.gz
Učitajmo našu tipkovnicu pomoću naredbe loadkeys.
Hrvatska tipkovnica ima oznaku croat dok Američka/Engleska ima us
loadkeys croat Loading /lib/kbd/keymaps/i386/qwertz/croat.map.gz
Sada možemo koristiti našu (HR) tipkovnicu. Ovo uglavnom nije potrebno raditi jer se Linux pri instalaciji već pobrine kako bi se sve ispravno konfiguriralo.
Što se tiće trajne konfiguracije, ručne promjene je potrebno napraviti u datoteci /etc/sysconfig/keyboard.
Regionalne postavke vezane su za :
Definiranje vremenske zone je vezano za usklađivanje sata za vremensku zonu u kojoj se nalazimo.
Ove opcije se konfiguriraju u toku instalacije samog operacijskog sustava ali ih je moguće mijenjati i naknadno.
Na svakoj matičnoj ploči pronaći ćete i bateriju poput ove na slici dolje. Ova baterija napaja integrirani sat koji je ugrađen u matičnu ploču. Praktično se radi o običnom kvarcnom oscilatoru odnosno satu - vrlo sličnom kao na “ručnim” ili “zidnim” satovima. Ovaj sat na matičnoj ploči se zove “Real Time Clock” ili RTC i on radi bez prestanka, bez obzira da li je računalo uključeno ili nije. Stoga mu je i potrebna baterija za napajanje i rad. Na starijim računalima, postojao je poseban chip unutar kojega je bio upravo ovakav sat te SRAM vrsta memorije u kojoj su se čuvale postavke BIOS-a. Sva današnja računala sve postavke BIOS-a spremaju u neku vrstu Flash memorije koja se nalazi na matičnoj ploči te im više nije potrebna ovakva SRAM memorija koja zahtjeva bateriju za održavanje sadržaja/stanja memorije. Stoga je danas jedini razlog postojanja ove baterije, napajanje integriranog sata.
Slika CR2032 baterija na matičnoj ploči:
Na novijim računalima RTC je integriran u “Southbridge” chip.
RTC sat se naziva i “Hardverski” sat ili CMOS odnosno BIOS sat
RTC odnosno hardverski sat pohranjuje i prikazuje datum: godinu, mjesec, dan i vrijeme: sat, minutu i sekundu. On nije u mogućnosti koristiti našu vremensku zonu ili promjene vezane za ljetno ili zimsko računanje vremena.
Kada se operacijski sustav pokreće, učitava se točan datum i vrijeme iz hardverskog (RTC) sata. Nakon toga se postavlja Sistemski sat koji više ne ovisi o hardverskom satu. Unix odnosno Linux vrijeme se od tog trenutka računa kao broj sekundi od ponoći prvog siječnja 1970. godine (ovo je službeni datum rođenja Unix-a). Ovo vrijeme koje počinje 1.1 1970.g u: 00:00:00 se naziva i UNIX epoha.
Poslije postavljanja i rada sistemskog UNIX/Linux sata, u bilo kojem trenutku može se raditi konverzija u kalendarski sat, koji i prikazuje većina programa zbog nama (ljudima) lakšeg rada.
Sistemski sat nadalje više uopće ne ovisi o hardverskom satu, već se za točno računanje vremena pouzdaje u nekoliko generatora takta unutar matične ploče i to paralelno. Dakle uzima se više izvora takta zbog što veće preciznosti sistemskog sata.
Nakon što UNIX/Linux sustav krene sa svojim satom, svako malo se provjerava odmak između hardverskog i sistemskog sata. Ta razlika se konstantno ažurira u datoteku: /etc/adjtime.
Pogledajmo hardverski (RTC) sat s naredbom hwclock:
hwclock Tue 11 Oct 2016 02:56:16 PM CEST -0.969103 seconds
Vidljivo je da smo pročitali datum i vrijeme i hardverskog sata, kao i odmak odnosno kašnjenje između hardvesrkog i sistemskog sata - konkretno: 0.969103 sekundi. Ova razlika odnosno kašnjenje se zove “Time drift value”.
Sistemski sat je u pravilu znatno točniji od hardverskog sata ali i on nije savršen.
Ako želimo uskladiti hardverski sat sa sistemskim satom tj. popraviti hardversko vrijeme za ono vrijeme kašnjenja u odnosu na sistemski sat to možemo uraditi na slijedeći način:
hwclock --adjust
Nakon nekog vremena pogledajmo hardverski sat - kašnjenje će biti smanjeno:
hwclock Tue 11 Oct 2016 03:08:32 PM CEST -0.140972 seconds
Vidimo da je kašnjenje smanjeno na -0.140972 sekundi.
Česti prekidači naredbe hwclock za sinkronizaciju vremena između hardverskog i sistemskog sata :
–hctosys namještanje sistemskog vremena (sata) prema hardverskom (RTC) vremenu : RTC → Sistem–systohc namještanje hardverskog (RTC) vremena prema sistemskom vremenu (satu) : System → RTCMoguće je i postaviti točno definiran datum i vrijeme na hardverski (RTC) sat. Sintaksa je :
hwclock --set --date "dd mmm yyyy HH:MM"
Pri tome :
dd je DANmmm je MJESECyyyy je GODINAHH:MM su sati (HH) i minute (MM)
NTP
Za još točnije vrijeme se koristi NTP protokol (Network Time Protokol) pomoću kojega je moguće u redovitim vremenskim intervalima sinkronizirati naš sistemski sat s nekim atomskim satom koji podržava ovaj protokol.
Dakle NTP je mrežni protokol za sinkronizaciju sata preko mreže. On je jedan od najstarijih mrežnih protokola - u upotrebi je od 1985. godine.
Sinkronizacijom vremena (sata) s NTP poslužiteljem, dobivamo preciznost od nekoliko milisekundi u odnosu na NTP sat poslužitelja. U slučaju sinkronizacije s NTP poslužiteljima na internetu, obično je preciznost od desetak milisekundi standardna.
NTP za komunikaciju koristi UDP protokol (pogledajte poglavlje "UDP protokol" ) i to port 123 a tip komunikacije može biti Broadcast ili Unicast ( pogledajte poglavlje "Metode komunikacije" ). Protokol radi na principu “Client” –> “Server”. Dakle NTP klijent (vaše računalo) se spaja na NTP poslužitelj (NTP Server). Osim ovog načina rada moguć je i Tzv. “peer-to-peer” način povezivanja u kojemu se svaki “peer” odnosno NTP “klijent” ponaša i kao “server” te jedan drugome mogu biti vršni poslužitelji (kao referentni NTP izvori).
Trenutna verzija NTP protokola je v.4. ( RFC5905 ).
NTP protokol (poslužiteljski dio) radi na hijerarhijskom, višeslojnom principu. Na vrhu hijerarhijske strukture (Stratum 0) se nalazi Atomski sat. Ispod njega, odnosno direktno spojeni na njega su NTP poslužitelji koji su u hijerarhiji kao Stratum 1. Slijedeći ispod njih su NTP poslužitelji (spojeni na Stratum 1 NTP poslužitelje) koji pripadaju hijerarhiji Stratum 1 i tako prema dolje. Možemo reći da je jedinica udaljenosti od Atomsko sata upravo Stratum broj (što je veći to je poslužitelj udaljeniji od njega).
Stratum 16 se koristi kao poruka da je nemoguća sinkronizacija preko NTP poslužitelja.
NTP klijenti se mogu spajati na bilo koji od NTP poslužitelja u hijerarhiji ali je uvijek cilj spajati se na one NTP poslužitelje što bliže Atomskom satu odnosno izvoru točnog vremena.
Atomski sat se smatra najpreciznijim satom koji postoji. Najnovija generacija atomskih satova ima najveću grešku od 1 sekunde u 30 milijuna godina.
U praksi se često koristi sinkronizacija sistemskog sata preko NTP protokola.
U Hrvatskoj imamo nekoliko javno dostupnih NTP poslužitelja (nužno je odabrati zemljopisno što bliži ) , pr.:
Za sada toliko o NTP protokolu.
U slučaju da smo kod instalacije operacijskog sustava konfigurirali krivu vremensku zonu ili ju je potrebno promijeniti zbog nekog drugog razloga, to je prilično jednostavno.
Ali prvo kratko o vremenskim zonama.
Citat s Wikipedije: ” Jedna vremenska zona pokriva područja Zemlje koja su izabrala isto lokalno vrijeme. Granice vremenskih zona u pravilu leže na meridijanima zemljopisne dužine koji su višekratnici 15º, pa razlika između susjednih vremenskih zona iznosi jedan sat. Ipak, ponegdje je razlika i drukčija. Osim toga, kao što se može vidjeti na karti u nastavku, vremenske zone mogu imati prilično nepravilne oblike jer obično prate granice država ili drugih administrativnih područja. “
Slika s vremenskim zonama u svijetu:
”
GMT je sustav za predstavljanje vremena koji je bio prihvaćen kao svjetsko vrijeme.
GMT je engl. kratica za Greenwich Mean Time, a ime je dobilo po nultom meridijanu, koji od 1884. godine prolazi kroz zvjezdarnicu u Greenwichu kraj Londona.
Danas ta kratica polako izlazi iz uporabe (osim u pomorstvu, gdje je zadržala svoje tradicionalno ime), zamjenjuje ju UTC što znači Koordinirano svjetsko vrijeme.
Koordinirano svjetsko vrijeme (eng. Coordinated Universal Time, UTC) je međunarodni naziv koji je zamijenio GMT, a predstavlja vrijeme nulte, odnosno početne vremenske zone. To je standardno vrijeme prema kojem se određuje vrijeme u drugim dijelovima svijeta. Hrvatska se nalazi u srednjoeuropskoj vremenskoj zoni, UTC+1, što znači da je u Hrvatskoj tijekom zime 13 sati kada je UTC vrijeme 12 sati. Ljeti je u Hrvatskoj propisano pomicanje satova pa je stoga ljeti u Hrvatskoj 14 sati kada je UTC vrijeme 12 sati. “
Na Linux sustavima moguće je koristiti i GMT i UTC za vremenske zone, mada se preporuča UTC, kao noviji, sveobuhvatniji i precizniji standard.
Za provjeru trenutnog vremena možemo pokrenuti naredbu date :
date Thu Nov 3 16:20:29 CET 2016
Dobili smo trenutno vrijeme. Osim toga vidljiva je i vremenska zona (CET = “Central Europe Time”). Konfiguracija vremenske zone, a koja utječe na ovaj prikaz vremena, se nalazi definirana u datoteci : /etc/localtime. Malo točnije ova datoteka bi trebala pokazivati na datoteku u kojoj je definirana vremenska zona. Još preciznije ova datoteka je simbolički link (pogledajte poglavlje "Soft linkovi" ) na datoteku u kojoj je definirana točna vremenska zona koju koristimo.
Pogledajmo i kako to izgleda za našu vremensku zonu (UTC+1 (Zagreb)):
ls -l /etc/localtime lrwxrwxrwx 1 root root 33 Aug 13 2013 /etc/localtime -> /usr/share/zoneinfo/Europe/Zagreb
Dakle vidljivo je da je /etc/localtime zapravo simbolički link na datoteku : /usr/share/zoneinfo/Europe/Zagreb.
Naime unutar direktorija /usr/share/zoneinfo/ se nalazi stablo poddirektorija, za sve vremenske zone.
Pogledajmo kako to izgleda:
ls /usr/share/zoneinfo/ Africa Brazil EST GB-Eire Hongkong Kwajalein NZ-CHAT ROC Universal right America CET EST5EDT GMT Iceland Libya Navajo ROK W-SU zone.tab Antarctica CST6CDT Egypt GMT+0 Indian MET PRC Singapore WET Arctic Canada Eire GMT-0 Iran MST PST8PDT Turkey Zulu Asia Chile Etc GMT0 Israel MST7MDT Pacific UCT iso3166.tab Atlantic Cuba Europe Greenwich Jamaica Mexico Poland US posix Australia EET GB HST Japan NZ Portugal UTC posixrules
U našem slučaju (za Europu), moguć je slijedeći izbor
ls /usr/share/zoneinfo/Europe/ Amsterdam Bratislava Dublin Kaliningrad Madrid Oslo San_Marino Tirane Vilnius Andorra Brussels Gibraltar Kiev Malta Paris Sarajevo Tiraspol Volgograd Astrakhan Bucharest Guernsey Kirov Mariehamn Podgorica Simferopol Ulyanovsk Warsaw Athens Budapest Helsinki Lisbon Minsk Prague Skopje Uzhgorod Zagreb Belfast Busingen Isle_of_Man Ljubljana Monaco Riga Sofia Vaduz Zaporozhye Belgrade Chisinau Istanbul London Moscow Rome Stockholm Vatican Zurich Berlin Copenhagen Jersey Luxembourg Nicosia Samara Tallinn Vienna
I u konačnici za promjenu vremenske zone potrebno je promijeniti datoteku /etc/localtime koja mora biti simbolički link na datoteku koja odgovara našoj vremenskoj zoni. U našem slučaju /usr/share/zoneinfo/Europe/Zagreb. To možemo postići s naredbom ln, koristeći prekidaće -sf koji znače:
-s kreirati ćemo simbolički link (Soft Link)-f “Force” odnosno odredišna datoteka (ako postoji) će biti pregažena (ili promijenjena u našem slučaju).Za ove promjene potrebo je biti root korisnik (Administrator)
ln -sf /usr/share/zoneinfo/Europe/Zagreb /etc/localtime
Nakon ove promjene moramo vidjeti simbolički link koji pokazuje na našu novu vremensku zonu:
ls -l /etc/localtime lrwxrwxrwx 1 root root 33 Aug 13 2013 /etc/localtime -> /usr/share/zoneinfo/Europe/Zagreb
U slučajevima kada nije definirana datoteka /etc/localtime, provjerava se dostupnost sistemske varijable TZ u kojoj se može definirati vremenska zona (ovo se ne preporuča u normalnim uvjetima).
U ovom slučaju morali bi postaviti i eksportirati ovu varijablu:
TZ='Europe/Zagreb' export TZ
Kao pomoć kod kreiranja vrijednosti ove varijable, možemo koristiti naredbu tzselect koja nas vodi korak po korak do naše željene vremenske zone: prvo biramo kontinent pa državu, te na kraju dobivamo i vrijednost TZ varijable.
Regionalnim postavkama (i malo više od toga) odnosno “Engl. Locale” definiramo korisničko okruženje koje ovisi o regionalnim i kulturološkim postavkama, kao i postavkama enkodiranja.
Svaka kategorije ovih postavki je definirana zasebno te samim time kontrolira zaseban dio ovog podsustava.
S naredbom lang -a možemo pogledati sve dostupne opcije, koje se definiraju kao vrijednosti sljedećih sistemskih varijabli (navesti ćemo samo one najčešće korištene):
LANG je osnovna i najvažnija varijabla. U njoj se prema formatu : JEZIK_TERITORIJ.KODNA STRANICA/ENKODIRANJE definiraju postavke na slijedeći način :
Za Hrvatski imamo nekoliko mogućnosti. Pošto je prema ISO639-1 oznaka za Hrvatski hr, pogledajmo koje sve mogućnosti imamo. Koristiti ćemo naredbu locale -a da vidimo listu svih mogućih postavki te ćemo filtrirati samo ključnu riječ hr_:
locale -a | grep hr_ hr_HR.iso88592 hr_HR.utf8
Vidimo da je moguće koristiti JEZIK=hr te TERITORIJ=HR te :
Na poslužiteljima se najčešće zbog kompatibilnosti i drugih potencijalnih problema ostavljaju standardne postavke, koje su obično : LANG=POSIX ili LANG=en_US.UTF-8
Ako je ova (LANG) varijabla definirana njene postavke će se uzeti kao standardne za postavljanje svih slijedećih varijabli koje ćemo opisati. Drguim riječima ako smo definirali neku od donjih varijabli one će pregaziti “default” postavke koje postavljamo za sve varijable u varijabli LANG
POSIX
POSIX je zajednički naziv za skupinu IEEE standarda kojima se definira sučelje za programiranje (API) softvera , kao i naredbene ljuske (Shell) te svih ostalih veza između aplikacija, usklađenih s različitim izvedenicama operacijskog sustava UNIX (ili Linux). Službena oznaka je IEEE 1003, a naziv međunarodnog standarda je ISO/IEC 9945. Standardi su nastali iz projekta koji je počeo oko 1985. Naziv POSIX predložio je Richard Stallman, a naknadno je izvedeno značenje “Portable Operating System Interface”, pri čemu X predstavlja UNIX.
S obzirom na činjenicu da su se već vrlo rano u razvoju UNIXa pojavile njegove razne varijante (koje su razvijale mnoge tvrtke, institucije i sveučilišta), pojavila se i potreba za određenom standardizacijom. Na početku je postojao samo jedan dokument koji se ticao samo API-ja ali se standardizacija širila i na druge dijelove UNIXa, pa je tako narasla na 19 odvojenih dokumenata odnosno podstandarda (POSIX.1, POSIX.2, …).
Jedan dio POSIX standarda tako definira naredbenu ljusku i mogućnosti skriptiranja kao i njihovu međuvezu. Ovaj dio standarda je preuzet sa Tzv. “UNIX System V” naredbene ljuske (Shella).
Drugi dio standarda je standardizirao ponašanje i rad mnogih programa poput awk , echo , ed i drugih i to zajedno sa sistemskim servisima. Dio koji se bavi standardizacijom sistemskih servisa definira ponašanje i rad Ulazno/izlaznog sustava, sustava datoteka, terminala i mreže.
POSIX također definira i sustav vezan za višenitnost (Engl. Threading) kao i API-je za pristup ovom sustavu. U novije vrijeme su svi zasebni POSIX standardi ujedinjeni u jedan veći te su definirani kao IEEE POSIX Std 1003.1-2008, znan i kao POSIX.1-2008.
Praktično gotovo sve logičke komponente današnjih UNIX ili Linux sustava su definirane i razvijane prema POSIX standardu.
Određene verzije UNIXa su certificirane kao POSIX kompatibilne - neke od njih su:
Neke druge verzija UNIX-oidnih operacijskih susava su POSIX kompatibilni (svaki do neke točke), pogledajmo i neke od njih:
Za više detalja o POSIX-u pogledajte Wikipediju: https://en.wikipedia.org/wiki/POSIX
Nastavimo s regionalnim postavkama odnosno njihovim varijablama :
LC_CTYPE definira klasifikaciju karaktera (znakova) kao i konverziju velikih i malih slova i općenito baratanje s karakterima (znakovima). Osim toga programi i biblioteke koje rade s karakterima i/ili stringovima često trebaju klasificirati da li se radi o brojevima, slovima, posebnim znakovima, razmakom i sl. te na osnovi toga raditi određene konverzije.LC_NUMERIC radi s numeričkim vrijednostima koje nisu monetarneLC_MONETARY radi s numeričkim vrijednostima koje su vezane za monetu (valutu)LC_TIME radi s datumom i vremenom (satom)LC_COLLATE je vezan za rad sa znakovima kod kojih leksikografske konvencije redoslijeda slova nisu jednake onima prema brojčanim oznakama (kodovima). Primjerice redoslijed slova a,b,c,d je prema engleskom redoslijedu točan ali u hrvatskom je to a,b,c,č,ć a pogotovo kod slova koja su sastavljena od dva slova poput dž, lj i sl.. Dakle ovdje se definira ispravan način rada s ovim “posebnim” pravilima.LC_MESSAGES specificira “jezik” u kojemu su ili će biti postavljene potvrdne ili negativne poruke unutar raznih programa.
Pogledajmo koje su sve postavljene varijable vezana za “Locale”, pomoću naredbe locale:
locale LANG=POSIX LC_CTYPE=en_US.UTF-8 LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX"
Pogledajte i poglavlje : "Upotreba uglatih zagrada"
Konfiguracija
Na RedHat/Centos 6.x verzijama Linuxa ove postavke se definiraju u datoteci : /etc/sysconfig/i18n za cijeli operacijski sustav.
Standardno za poslužitelje postavljene su slijedeće vrijednosti:
LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16"
Dakle globalna verijabla LANG koju smo opisali te dodatno globalna varijabla SYSFONT koja definira osnovni font koji se koristi za X11 Windows sustav.
Ovdje je najvažnija naravno varijabla LANG a koju je moguće (i uz sve gore navedene varijable LC_) definirati za sve korisnike , u datoteci : /etc/profile
Ako imamo potrebu mijenjati ove varijable na razini svakog korisnika i to je moguće.
Sve što je navedeno i definirano u datoteci /etc/sysconfig/i18n moguće je definirati za svakog korisnika posebno, u njegovom HOME direktoriju u datoteci imena: .i18n.
RedHat/CentOS v.7.x koristi drugu konfiguracijsku datoteku : /etc/locale.conf za ove postavke
Kada neka hardverska komponenta traži pristup procesoru (CPU), taj pristup se zatraži kreiranjem signala prekida (engl. Interrupt request). Dakle signalom prekida (IRQ), uređaj upozorava procesor (CPU) kako je došlo do događaja, zbog kojega se traži malo vremena od procesora, kako bi se odradilo ono što nam poručuje uređaj koji je kreirao signal prekida, poput zaprimljenih podataka na mrežnoj kartici, podataka koje treba snimiti na disk i sl.
Operacijski sustav tada prvo otkriva od koje komponente je kreiran signal prekida, te poziva posebnu proceduru, a koja se nalazi unutar upravljačkog programa, konkretnog uređaja, koji je kreirao signal prekida. Ova procedura, koja se mora nalaziti unutar svakog upravljačkog programa za svaki pojedini uređaj (hardver), zove se interrupt handler procedura. Pomoću ove procedure se kontaktira komponenta unutar operacijskog sustava koja je zadužena za prebacivanja između procesa/programa, koja se zove Linux Process Scheduler.
Ovakvi događaji, aktivirani interruptima, imaju vrlo visoki prioritet, u odnosu na druge programe, koje obrađuje procesor.
Linux Process Scheduler zatim privremeno zaustavlja proces odnosno program/aplikaciju koja je na obradi te kreće s obradom podataka, koju je zatražio hardver koji je kreirao signal prekida. Dakle procesor pokreće ovaj posao i odrađuje ga, nakon čega se proces koji je bio pauziran, ponovno učitava i pokreće.
Tijekom obrade tog (svakog) zahtjeva, rade se mnoge operacije čitanja ili pisanja u i prema RAM memoriji, kao i diskovnom podsustavu a za koje je također zadužen CPU.
Za više informacija o ”Task/process scheduler“ mehanizmu, u poglavlju Procesi.
Dakle hardverski prekidi (Interrupts) se koriste kod svake pojedine aktivnosti nekog uređaja, poput mrežne i zvučne kartice, modema, USB uređaja, uređaja na serijskom ili paralelnom portu, disk kontrolera (SATA/ATA/SCSI) i sl. Čak svako pomicanja miša ili stiskanje tipki na tipkovnici generira IRQ.
Kako bi CPU mogao reagirati na ove prekide, potrebna je komponenta koja se brine za interrupte, a zove se PIC (Programmable Interrupt Controller). PIC je bilo spojen na sve uređaje, na sabirnici, preko posebnih linija odnosno vodova koji su zaduženi za interrupte te je on komunicirao s CPUom te prosljeđivao interrupte preko tih vodova/linija prema procesoru. PIC se fizički nalazio unutar Southbridge chipseta a logički kao na slici ispod.
Pojednostavljeno to izgleda otprilike ovako:
PIC je podržavao do 16 interrupta (IRQ 0 - 15) te jedan fizički CPU. PIC je podržavao i mogućnost dijeljenja interrupta između više uređaja. Ovo je povećalo broj uređaja koji se mogao koristiti na jednom računalu ali je za uređaje koji su zahtijevali bržu komunikaciju uveo usporavanja (ili ponekad probleme) u radu.
U novije vrijeme PIC je zamijenjen sa APIC (Advanced Programmable Interrupt Controller), koji je omogućio upotrebu više procesora (CPU) istovremeno na jednoj matičnoj ploči. Ova metoda upotrebe više fizičkih procesora se zove SMP (Symmetric multiprocessing). Upotreba APICa je dovela do toga što se dio funkcionalnosti prebacio unutar samog CPUa (unutar kojega je sada integriran LAPIC) a dio je ostao kao vanjska komponenta (I/O APIC).
I/O APIC obrađuje signale prekida (IRQ - Interrupt request) sa svih uređaja na glavnoj sabirnici te ih prosljeđuje prema LAPIC (Local APIC unutar CPU-a) prema svim postojećim procesorima (CPU). Osim toga, APIC podržava do 224 iskoristiva signala prekida (u teoriji) te samim time veći broj uređaja koji se mogu koristiti unutar jednog računala. U praksi broj signala prekida je bio do makismalno 24 - pr. za PIIX3 chipset.
U najnovije vrijeme, nakon uvođenja standarda PCI v.2.2 odnosno na svim PCI Express standardima, omogućena je i upotreba MSI (Message Signaled Interrupts) standarda.
MSI (Message Signaled Interrupts) - o čemu se radi ?
Tradicionalno, svaki uređaj spojen na sabirnicu ima Tzv. interrupt line (pin) koji se aktivira svaki puta kada se želi poslati signal prekida prema procesoru . MSI donosi potpuno drugačiji način rada, tako što se više ne moraju koristiti zasebni vodovi kroz koje se šalju signali prekida, već se oni šalju kroz podatkovni (normalni) dio sabirnice, na posebnu memorijsku adresu (memory-mapped I/O adresu) a tada chipset prosljeđuje signal prekida prema procesoru.
PCI express sabirnica uopće nema zasebne linije odnosno vodove za signale prekida, već se koristi isključivo MSI metoda rada sa signalima prekida.
U današnje vrijeme najčešća je upotreba MSI metode za rad sa signalima prekida, koja je u prosjeku ubrzala obradu ovih signala za oko tri (3) puta. MSI omogućava maksimalno 32 signala prekida. Od 2009 godine sve Intelovw implementacije LAPIC unutar CPUa podržavaju do 224 signala prekida. MSI radi tako što se takozvani interrupt vector zapisuje direktno u LAPIC, koji se nalazi unutar samog procesora,a koji onda dalje odrađuje sve potrebno. Na ovaj način se još više ubrzao rad.
Postoji i još noviji standard MSI-X (definiran u standardu PCI v.3.0) koji omogućava alociranje do 2048 interrupta. U praksi to ne znači da su svi implementirali toliki broj ali prema standardu je minimalan broj 64. više od toga ovisi o proizvođaču i implementaciji.
Za više detalja o MSI pogledajte : http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/PCI/MSI-HOWTO.txt?id=HEAD
Virtualizacija interrupta
S obzirom na to što se razvijao svaki segment virtualizacije, postalo je potrebno i imati podršku za virtualizaciju interrupta. Ova tehnologija se pojavila u najnovijim Intel i AMD procesorima. Intelov naziv je APICv a AMD-ov : Advanced Virtual Interrupt Controller AVIC. Ova tehnologija je dostupna od procesora “Ivy Bridge EP”, negdje od kraja 2013. godine.
Što je IPI (Inter-Processor Interrupt) ?
IPI je posebna vrsta signala prekida pomoću kojega u NUMA konfiguraciji računala (s više fizičkih procesora na jednoj matičnoj ploči), jedan procesor može poslati signal prekida drugom procesoru. Ovo se događa ako jedan procesor treba od drugog procesora neku posebnu radnju koja može biti :
Standardni ili hardverski signali prekida Signali prekida o kojima smo do sada pričali se zovu i hardverski interrupti odnosno signali prekida.
Posebni interrupti (NMI)
Postoji i posebna kategorija definiranih interrupt-a koji imaju prioritet izvršavanja ispred svih ostalih.
To su takozvani NMI (Non-maskable interrupt). NMI se koristi kada je vrijeme odziva kritično te se ovaj IRQ mora odraditi u što kraćem roku. Ovi IRQ se koriste kada je potrebno obavijestiti sustav o nekoj kritičnoj grešci na hardveru, za debuggiranje sustava ili za resetiranje sustava.
Softverski interrupti
Softverski interrupti se događaju kada se dogodi neki poseban uvjet (engl. exception). Kada se recimo u programu naloži dijeljenje s nulom, ova nemoguća operacija će izazvati poruku koju će nam vratiti sustav : divide-by-zero exception pri čemu će se ili odustati od operacije ili će doći do greške. U svakom slučaju pojavit će se softverski interrupt pri ovom pokušaju. Drugi primjer je komunikacija s diskovnim I/O sustavom kada se kreira softverski interrupt kod zahtjeva za nekom operacijom (čitanje ili pisanje) - na vrlo niskoj razini. Svak od tih softverskih (kao i hardverskih) interrupta ima svoju rutinu za obradu interrupta (interrupt handler) pa tako vrijedi i za softverske interrupte, s time da njih može biti definiranih na stotine ili više (prema potrebi) te se oni mogu znatno brže generirati od hardverskih interrupta.
Detaljne statistike na razini cijelog Linuxa, za svaki interrupt moguće je pratiti pogledom na posebnu datoteku /proc/interrupts.
Pogledajmo interrupt-e na našem Linuxu (stariji CPU Xeon):
cat /proc/interrupts
CPU0 CPU1
0: 18667 0 IR-IO-APIC-edge timer
1: 2 0 IR-IO-APIC-edge i8042
8: 1 0 IR-IO-APIC-edge rtc0
9: 0 0 IR-IO-APIC-fasteoi acpi
12: 4 0 IR-IO-APIC-edge i8042
17: 158 0 IR-IO-APIC-fasteoi ata_piix
20: 1241 0 IR-IO-APIC-fasteoi ehci_hcd:usb1, uhci_hcd:usb2
... ... ... ... ...
50: 106628875 0 IR-PCI-MSI-edge hpsa0
... ... ... ... ...
54: 306816715 0 IR-PCI-MSI-edge eth0
55: 145395108 0 IR-PCI-MSI-edge eth1
... ... ... ... ...
Ispis je filtriran za potrebe prikaza.
Prvi stupac je broj interrupta, potom su stupci CPU0 i CPU1 gdje se vidi koliko je interrupta obradio koji CPU. Statistike su iskazane u broju interrupta u svakoj sekundi (za svaki CPU [0 i 1] jer imamo 2 CPU-a).
U našem slučaju sve interrupte odrađuje prvi CPU (CPU0) što je u redu.
Zatim vidimo tip interrupta:
I u zadnjem stupcu je uređaj koji korist interrupt (objasniit ćemo ih nekoliko):
rtc0 je Real Time Clock (interni sat na matičnoj ploči) - IRQ8acpi je ACPI (Advanced Configuration and Power Interface) - Koristi se za “hardware discovery”, konfiguraciju hardvera, “power management”, monitoring itd. - IRQ 9ata_piix je ATA kontroler na koji je spojen samo CD/DVD-ROM - IRQ 17hpsa - HP Smart Array RAID kontroler na kojemu su sistemski diskovi u RAID 1 polju - IRQ 50eth0 i eht1 su mrežne kartice - IRQ 54 i IRQ 55Vidimo da je najveći broj interrupta (IRQ) prema disk kontroleru (disku) i prema mrežnim karticama (koje su obije stalno aktivne), što i odgovara stvarnosti.
Sada postaje jasno koliko se IRQ-ova kreira svakoj sekundi.
Dodatne detalje moguće je vidjeti na razini svakog interrupt-a.
Pogledajmo IRQ 54 (to je u našem slučaju eth0 mrežna kartica)
ls -a /proc/irq/54/ affinity_hint /eth0 node smp_affinity smp_affinity_list spurious
Svaka datoteka sadrži određena očitanja i parametre.
Recimo smp_affinity sadrži definiciju da li uređaj koji koristi ovaj interrupt može koristiti bilo koji procesor (CPU) za baranje s ovim interruptom ili je “zaključan” na točno određeni CPU (Pr. CPU Br.0).
Da je recimo zaključan na CPU 0 vrijednost bi bila 1.
cat /proc/irq/54/smp_affinity 000000ff
FF Znači da bilo koji CPU može odrađivati interrupt br. 54 (u ovom slučaju za eth0 mrežnu karticu)
Na našem Linux sustavu smo vidjeli da je sve IRQ odradio CPU0, što je u redu ali u nekim slučajevima postoji potreba da se oni (IRQ) ipak raspoređuju na više procesora jednako (ovo više uzrokuje usporavanja ali postoje slučajevi kada želimo ovakav rad). Za neke primjene želimo da se neki interupti izvršavaju samo na jednom procesoru. Ako primjerice želimo da mrežne kartice eth0 i eth1 obrađuje samo CPU0 kao kod nas, a na drugim procesorima da se odrađuje nešto drugo. U slučaju rada mreže to je dosta dobar primjer.
Pogledajmo i reprezentaciju oznaka prema procesorima (radi se o “bit maski”)
| Koja CPU jezgra se može koristiti | Binarna oznaka | Heksadecimalna oznaka |
| CPU 0 | 0001 | 1 |
| CPU 1 | 0010 | 2 |
| CPU 2 | 0100 | 4 |
| CPU 3 | 1000 | 8 |
U slučaju da želimo dati mogućnosti izbora korištenja više CPU jezgri tada se vrijednosti zbrajaju:
| Koja CPU jezgra se može koristiti | Binarna oznaka | Hexadecimalna oznaka |
| CPU 0 ili CPU 1 | 0011 | 3 |
| CPU 2 ili CPU 0 | 0101 | 5 |
| CPU 2 ili CPU 1 | 0110 | 6 |
| CPU 0 ili CPU 1 ili CPU 2 | 0111 | 7 |
| Sve jezgre od ponuđenih | 1111 | F |
…
U slučaju da imamo sustav s više od 4 jezgre, dodaju se vrijednosti prema slijedećem principu (u tablici). Uz napomenu da je zadnja oznaka uvijek F. Svaki niz o 4 bita oznaćava set od četiri CPU jezgre, s time da se hexa oznake popunjavaju od desno (od zadnjeg slova F) na lijevo.
| Set po četiri CPU-a | Hexadecimalna oznaka |
| Sva četiri prva CPU-a | 000000FF |
| Sva četiri druga CPU-a | 00000F0F |
| Sva četiri prva i sva četiri druga CPU-a | 00000FFF |
| Sva četiri treća CPU-a | 0000F00F |
| Sva četiri prva,druga i treća CPU-a | 0000FFFF |
U gornjem primjeru, prema tablici ako želimo da se mrežna kartica eth0, koja koristi CPU 0 na IRQ 54, prebaci na CPU 1 , tada treba napraviti slijedeće:
echo 2 > /proc/irq/54/smp_affinity
I sada imamo sve IRQ 54 prebačen na CPU 1: (skračeno izlistanje)
cat /proc/interrupts
CPU0 CPU1
... ... ... ... ...
54: 306816715 187 IR-PCI-MSI-edge eth0
... ... ... ... ...
Vidimo kako se IRQ 54 preselio na CPU 1 jer je brojač na CPU 1 za taj IRQ počeo rasti.
irqbalance
U nekim distribucijama Linuxa postoji Linux thread (servis koji radi na vrlo niskoj razini - pokreće ga kthreadd), koji se zove irqbalance i čiji zadatak je upravo raspoređivanje interrupta između svih dostupnih procesora (CPU) jednoliko. Ali ponavljam vrlo često to nije najbolje rješenje jer ovaj servis svako malo preraspoređuje interrupte na drugi procesor, tako da bi svi procesori jednoliko bili opterećeni obradom interrupta ali se s takvim radom sustav može i usporiti zbog stalnog prebacivanja interrupta na drugi procesor na obradu.
Ovaj servis stalno prati koliko je interrupta raspoređeno između svih procesora i ako u nekom trenutku interrupti nisu ravnomjerno raspoređeni on ih ponovno preraspodjeljuje.
Ovaj servis je moguće i dodatno optimizirati, njegova konfiguracija se nalazi u datoteci : /etc/sysconfig/irqbalance
Kako trenutno zaustaviti ovaj servis ?
Ako niste 100% SIGURNI ŠTO RADITE NAJBOLJE NE DIRAJTE NIŠTA.
service irqbalance stop
Kako trajno zaustaviti ovaj servis ?
chkconfig irqbalance off
Pogledajmo sada drugo Linux računalo s Intel Core 2 Duo E8500 procesorom (ima dvije CPU jezgre) te aktivan proces irqbalance.
Da li je stvarno aktivan irqbalance proces ?
ps -ef |grep irqbalance | grep -v grep root 1820 1 0 Nov24 ? 00:00:13 irqbalance --pid=/var/run/irqbalance.pid
Da, ovaj proces je stvarno aktivan.
Sada pogledajmo kako su raspoređeni interrupti, zahvaljujući ovom procesu (servisu).
cat /proc/interrupts
CPU0 CPU1
0: 845 137 IO-APIC-edge timer
1: 6 2 IO-APIC-edge i8042
... ... ... ... ...
7: 0 0 IO-APIC-edge parport0
8: 1 0 IO-APIC-edge rtc0
9: 0 3 IO-APIC-fasteoi acpi
12: 98 54 IO-APIC-edge i8042
14: 72239 69192 IO-APIC-edge ata_piix
... ... ... ... ...
18: 0 0 IO-APIC-fasteoi ehci_hcd:usb1, uhci_hcd:usb4, ata_generic
... ... ... ... ...
29: 21 6 PCI-MSI-edge i915
30: 35447 411265 PCI-MSI-edge eth0
31: 294 280 PCI-MSI-edge snd_hda_intel
Vidljiva je slična lista uređaja koji koriste interrupte ali su interrupti zahvaljujući irqbalance raspoređeni između oba procesora (CPU).
Moguće je, u slučaju da određeni IRQ želimo ručno “zaljepiti” na određenu CPU jezgru, taj IRQ isključiti iz dostupnih IRQ s kojima barata irqbalance. Na taj način možemo dobiti mogućnost da određene uređaje vezane za određeni IRQ uvijek vežemo za određenu CPU jezgru ali bi za sve ostale ipak koristi irqbalance mehanizam za raspodjelu IRQa, po CPU jezgrama.
Uzmimo slučaj naše mrežne kartice eth0 koja koristi IRQ 30 te ju vežimo za CPU jezgru 0.
echo 1 > /proc/irq/30/smp_affinity
Sada ovaj IRQ “mičemo” iz irqbalance-a, na način da prvo stopiramo irqbalance te ga pokrenemo na slijedeći način:
/usr/sbin/irqbalance --banirq=30
ksoftirqd
ksoftirqd je Linux thread (servis koji radi na vrlo niskoj razini : pokreće ga kthreadd), zapravo pokreće se po jedan ovakav proces za svaku CPU jezgru dostupnu sustavu.
Softverski interrupti se često pozivaju nakon hardverskih (objasnili smo ih gore u tekstu), pošto je njih moguće kreirati puno brže nego hardverske, postoji i mogućnost da ih se ne stigne sve odraditi u određenom vremenskom okviru. Ako se softverski interrupt ponovi (jer prvi puta nije bio odrađen) tada kontrolu nad njim preuzima ksoftirqd koji se onda i dalje brine za njega sve dok se ne izvrši (proslijedi na obradu i obradi).
Ako ksoftirqd počne zauzimati više procesorskog vremena to je znak da je računalo pod velikim opterećenjem jer ne stiže odrađivati softverske interupte na vrijeme,
Kod klasičnoga korištenja signala prekida (Interrupt), u jednom trenutku, potreban je prijenos podataka od i prema memoriji samog uređaja, što predstavlja čitanje ili pisanje na taj uređaj , te dodatno i prijenos podataka od ili prema RAM memoriji računala. Kod bilo koje od ovih operacija, potrebno je posredovanje CPUa.
Srećom, postoji i metoda koja može rasteretiti CPU od operacija pristupa RAM memoriji ili pristupa memoriji uređaja, odnosno omogućiti svakom uređaju direktan pristup RAM memoriji. Samim time se i drastično povećava brzina prijenosa podataka između (tog) uređaja i RAM memorije. Ova metoda se zove Direct memory access (DMA) odnosno metoda direktnog pristupa memoriji bez potrebe za posredovanjem od strane CPUa.
Kod korištenja DMA, ako ga uređaj podržava, također sam uređaj koji traži pristup procesoru (CPU) za obradu tako što kreira signal prekida (Interrupt) i tada se privremeno zaustavlja pokrenuti proces koji je na obradi.
Potom se pokreće interrupt handler i kreće se sa obradom (ovog) novog procesa. Ali, od tog trenutka, preko DMA kanala, pristupa se memoriji direktno bez posredovanja procesora, koji sada može nastaviti obradu podataka bez brige o pristupu RAM memoriji (čitanje ili pisanje).
Dodatan problem kod klasičnoga rada je bio i u tome što je procesor često čekao na neke ulazno izlazne operacije : pr. prema disk kontroleru i indirektno prema disku, grafičkoj kartici ili nekom drugom uređaju. Naime u trenucima kada se novi proces počeo obrađivati, nakon primljenog signala prekida, u životnom tijeku tog procesa prilično često se podaci moraju čitati ili zapisivati u RAM memoriju te je procesor tada morao čekati na uređaj (koji je i inicirao signal prekida tj. tražio svoje CPU vrijeme za obradu) da bi ili iz njega ili prema njemu primao ili slao podatke. Ti podaci bi u konačnici završili u RAM memoriji pa je uvođenje DMA uvelike ubrzalo rad i obradu svakog procesa.
Na samom kraju životnog vijeka ovog dijela procesa, DMA kontroler šalje signal za prekid kada su operacije prema RAM memoriji završile te se nastavlja dalja procedura identična za rad bez DMA (pauziranje procesa i prebacivanje na novi proces).
Pogledajmo logičku arhitekturalnu shemu IRQ i DMA podsustava:
Zamislimo sljedeću situaciju kada disk kontroler zatraži DMA komunikaciju (DISK - RAM memorija) kao na slici:
DMA komunikacija se odvija preko DMA kanala kojih ima ukupno 8 (DMA 0 - DMA 7). DMA kanali se ne mogu dijeliti između više uređaja poput IRQa već se svaki DMA kanal dodjeljuje pojedinom uređaju. Uređaji na PCI sabirnici sami mogu odabrati (zauzeti) prvi slobodan DMA kanal za komunikaciju, prema potrebi, ali sve novije PCI kartice više ne koriste klasične DMA kanale i DMA kontroler već Bus Master metodu, prema kojoj uređaj traži direktnu kontrolu nad sabirnicom te direktan pristup RAM memoriji.
Povijesno u originalnom IBM PC XT računalu, postojao je samo jedan DMA kontroler (Intel 8237) koji je imao 4 DMA kanala (DMA 0 - DMA 4), koji se koristio na starim ISA sabirnicama.
Pojavom novije arhitekture IBM PC AT, dodan je i drugi DMA kontroler (Intel 8237), tako se sada broj DMA kanala povećao na 8 (DMA 0 - DMA 7). Pri tome je odabran DMA kanal 4 za međusobnu komunikaciju između ta dva DMA kontrolera.
Danas je zadržana ova kompatibilnost pa se oba DMA kontrolera nalaze integrirana unutar “Super IO” chipseta, koji je zadužen za starije/sporije uređaje poput serijskih i paralelnih portova, portova za miš i tipkovnicu i sl (PS/2 i sl.).
Prema starijoj arhitekturi ako se neki podaci trebaju čitati ili zapisivati na tvrdi disk, proces je sljedeći :
U primjeru na slici kada se računalo uključilo, disk kontroler je dobio svoj DMA kanal (pr. 5).
U današnje vrijeme (na PCI i novijim PCI Express sabirnicama) koristi se slična metoda s time kako se u koraku kada se traži pristup RAM memoriji više ne mora zatražiti pristup preko DMA kontrolera, preko određenog DMA kanala.
Sada se prijenos podataka u ili prema RAM memoriji radi tako da uređaj koji traži pristup može preko kontrolera sabirnice (PCI ili PCI Express) zatražiti kontrolu upotrebe sabirnice (engl. become the bus master).
Kada uređaj zatraži kontrolu nad sabirnicom (od kontrolera sabirnice tj. chipseta), kontroler sabirnice prvo provjerava da li je još neki uređaj u tom trenutku zatražio kontrolu nad sabirnicom te ako je, odlučuje koji od njih će prvi dobiti kontrolu. Važno je znati da u svakoj jedinici vremena samo jedan uređaj može imati kontrolu nad sabirnicom. Potom se odabranom uređaju daje kontrola nad sabirnicom te on postaje Tzv. Bus Master.
Tada on preko sabirnice i preko kontrolera sabirnice komunicira s memorijskim kontrolerom, koji mu daje direktan pristup RAM memoriji (bez posredovanja procesora).
Na kraju su dalji koraci identični staroj metodi (kreira se signal prekida) itd.
“DMA” ili “Bus Master” za komunikaciju koriste uređaji koji u pravilu zahtijevaju veliku brzinu komunikacije od ili prema RAM memoriji, poput:
Primjeri
Kako provjeriti koji DMA kanali su u upotrebi na Linuxu ?.
Unutar datoteke /proc/dma su popisani svi aktivni DMA kanali.
Pogledajmo aktivne DMA kanale na našem računalu.
cat /proc/dma 4: cascade
Vidljivo je da je samo DMA kanal 4 aktivan. On je DMA kanal koji se koristi samo za komunikaciju između dva DMA kontrolera (unutar Super IO dijela chipseta). Dakle na ovom (novijem) računalu se ne koristi klasični DMA već Bus Mastering metoda komunikacije za PCI i PCI Express uređaje (ATA/SATA, …).
Naime mrežne kartice, kao i drugi uređaji (pr. disk kontroleri) kada im je potrebna pažnja CPUa, odnosno kada od CPUa traže procesorsko vrijeme za obradu njihovih zahtjeva, generiraju signal prekida (Engl interrupt). U slučaju mrežne kartice, kod svakog novog mrežnog paketa koji je zaprimljen, mrežna kartica kreira signal prekida. CPU tada zaustavlja trenutni proces s obradom, tj, pauzira ga, privremeno pohranjuje međurezultate, prazni memoriju i registre, te preuzima na obradu zadatak od mrežne kartice (preuzima na obradu taj, konkretni mrežni paket). Naime za gigabitne brzine (1Gbps) to znači 1.48 milijuna paketa u sekundi, koje mrežna kartica može primiti ili poslati.
Jasno je kako se broj signala prekida kod ovakvog rada, također mora popeti na isti broj (1 paket = 1 interrupt). Mehanizmi implementirani u Linux, FreeBSD i druge moderne operacijske sustave, u slučajevima, kada broj mrežnih paketa i samim time interrupta postaje prevelik, da bi zagušio cijeli operacijski sustav i sve programe, prelazi u drugačiji način rada a koji ovisi o tome da li ga uopće podržava upravljački program mrežne kartice kao i sam hardver kartice. Dakle u tom trenutku se prelazi na rad u kojem se više ne generiraju interrupti za svaki paket, već se sustav počinje brinuti o tome, kako bi svako malo, s posebnim mehanizmima, sam dohvaćao pakete od mrežne kartice (Engl. Polling mehanizam). Na ovaj način sam sustav se počinje brinuti i o tome kako će opsluživati ostale procese (programe) na najnižoj razini. Kod boljih implementacija ovdje se pazi na Tzv. context switching na najbolji mogući način i time se dodatno dobiva na performansama jer se CPU prebacuje između procesa na način koji je optimalan.
U konačnici:
Osim toga, sam prijenos podataka od mrežne kartice prema CPU, može se odraditi na dva načina:
Novije i snažnije mrežne kartice danas imaju i Interrupt coalescing znan i kao interrupt moderation mehanizam. U slučaju upotrebe ovog mehanizma (uz pripadajući upravljački program), mrežna kartica ne generira signal prekida za svaki pojedini mrežni paket, već tek kada joj se međuspremnici napune većim brojem paketa. Dakle signal prekida se generira za više paketa a ne za svaki pojedinačno. Ova metoda značajno smanjuje broj signala prekida, te može ubrzati rad mreže (43).
Pod operacijskim sustavom Linux, obije metode (Pooling i Interrupt moderation ) implementirane su u novi mrežni API (application programming interface), koji se zove NAPI. Osim toga implementiran je i zaštitni mehanizam, koji se aktivira u slučajevima potpunog zagušenja sustava, poznatog pod nazivom Packet throttling. Dakle kada je mrežna kartica toliko zagušena, ona nove mrežne pakete neće niti pokušavati prosljeđivati dalje prema procesoru, uzrokujući dodatno zagušenje sustava, već će svi novopristigli mrežni paketi tada biti odbačeni, direktno od strane mrežne kartice, točnije od strane njenog upravljačkog programa, koji je napravljen korištenjem NAPIja.
Kao što smo naglasili, CPU odrađuje sve :
Pogledajmo i blok dijagram modernih procesora:
Na svim novijim generacijama procesora (CPU) integrirane su i mnoge druge komponente, poput:
Na ovaj način, značajno su se ubrzale mnoge operacije, koje je do tada morao odrađivati CPU.
Ove funkcionalnosti su u Linuxu vidljive kao CPU zastavice “Engl. CPU flags”.
Pogledajte i listu večine tih funkcionalnosti:
| Flag (zastavica) | Opis funkcionalnosti | Flag (zastavica) | Opis funkcionalnosti |
| 3dnow | 3DNow! (AMD vector instructions, competing with Intel's SSE1) | mtrr | Memory Type Range Registers |
| 3dnowext | AMD 3DNow! extensions | nodeid_msr | NodeId MSR |
| 3dnowprefetch | 3DNow prefetch instructions | nonstop_tsc_s3 | TSC doesn't stop in S3 state |
| abm | Advanced bit manipulation | nonstop_tsc | TSC does not stop in C states |
| acpi | ACPI via MSR (temperature monitoring and clock speed modulation) | nopl | The NOPL (0F 1F) instructions |
| adx | The ADCX and ADOX instructions | npt | AMD Nested Page Table support |
| aes | AES instructions - AES-NI | nrip_save | AMD SVM next_rip save |
| amd_dcm | multi-node processor | nx | Execute Disable |
| aperfmperf | APERFMPERF | osvw | OS Visible Workaround |
| apic | Onboard APIC | pae | Physical Address Extensions (support for more than 4GB of RAM) |
| arch_perfmon | Intel Architectural PerfMon | pat | Page Attribute Table |
| avx2 | AVX2 instructions | pausefilter | AMD filtered pause intercept |
| avx | Advanced Vector Extensions | pbe | Pending Break Enable |
| bmi1 | 1st group bit manipulation extensions | pcid | Process Context Identifiers |
| bmi2 | 2nd group bit manipulation extensions | pclmulqdq | PCLMULQDQ instruction (carry-less multiplication — accelerator for GCM) |
| bts | Branch Trace Store | pdcm | Performance Capabilities |
| centaur_mcr | Centaur MCRs (= MTRRs) | pdpe1gb | GB pages |
| cid | Context ID | pebs | Precise-Event Based Sampling |
| clflush | CLFLUSH instruction | perfctr_core | core performance counter extensions |
| cmov | CMOV instructions (conditional move) (also FCMOV) | perfctr_l2 | L2 performance counter extensions |
| cmp_legacy | If yes HyperThreading not valid | perfctr_nb | NB performance counter extensions |
| constant_tsc | TSC ticks at a constant rate | pfthreshold | AMD pause filter threshold |
| cr8_legacy | CR8 in 32-bit mode | pge | Page Global Enable (global bit in PDEs and PTEs) |
| cx16 | CMPXCHG16B | pni | SSE-3 (“Prescott New Instructions”) |
| cx8 | CMPXCHG8 instruction (64-bit compare-and-swap) | pn | Processor serial number |
| cxmmx | Cyrix MMX extensions | popcnt | POPCNT instruction (Hamming weight, i.e. bit count) |
| cyrix_arr | Cyrix ARRs (= MTRRs) | pse36 | 36-bit PSEs (huge pages) |
| dca | Direct Cache Access | pse | Page Size Extensions (4MB pages) |
| decodeassists | AMD Decode Assists support | rdrand | The RDRAND instruction (hardware random number generator) |
| de | Debugging Extensions (CR4.DE) | rdseed | The RDSEED instruction |
| ds_cpl | CPL Qual. Debug Store | rdtscp | RDTSCP Read Time-Stamp Counter and Processor ID |
| dtes64 | 64-bit Debug Store | rep_good | rep microcode works well |
| dts | Debug Store (buffer for debugging and profiling instructions) | rtm | Restricted Transactional Memory |
| eagerfpu | Non lazy FPU restore | sep | SYSENTER/SYSEXIT |
| ept | Intel Extended Page Table | skinit | SKINIT/STGI instructions |
| erms | Enhanced REP MOVSB/STOSB | smap | Supervisor Mode Access Prevention |
| est | Enhanced SpeedStep | smep | Supervisor Mode Execution Protection |
| extapic | Extended APIC space | smx | Safer mode - TXT (TPM support) |
| extd_apicid | has extended APICID (8 bits) | ss | CPU self snoop |
| f16c | 16-bit fp conversions (CVT16) | sse2 | SSE2 |
| flexpriority | Intel FlexPriority | sse4_1 | SSE-4.1 |
| flushbyasid | AMD flush-by-ASID support | sse4_2 | SSE-4.2 |
| fma4 | 4 operands MAC instructions | sse4a | SSE-4A |
| fma | Fused multiply-add | sse | Intel SSE vector instructions |
| fpu | Onboard FPU (floating point support) | ssse3 | Supplemental SSE-3 |
| fsgsbase | {RD/WR}{FS/GS}BASE instructions | svm_lock | AMD SVM locking MSR |
| fxsr | FXSAVE/FXRSTOR, CR4.OSFXSR | svm | “Secure virtual machine” - AMD-V |
| fxsr_opt | FXSAVE/FXRSTOR optimizations | syscall | SYSCALL/SYSRET |
| hle | Hardware Lock Elision | tbm | trailing bit manipulations |
| ht | Hyper-Threading | tce | translation cache extension |
| hypervisor | Running on a hypervisor | tm2 | Thermal Monitor 2 |
| ia64 | IA-64 processor (not to be confused with x86-64 = amd64, indicated by lm) | tm | Automatic clock control (Thermal Monitor) |
| ibs | Instruction Based Sampling | topoext | topology extensions CPUID leafs |
| invpcid | Invalidate Processor Context ID | tpr_shadow | Intel TPR Shadow |
| k6_mtrr | AMD K6 nonstandard MTRRs | tsc_deadline_timer | Tsc deadline timer |
| lahf_lm | Load AH from Flags (LAHF) and Store AH into Flags (SAHF) in long mode | tsc_reliable | TSC is known to be reliable |
| lbrv | AMD LBR Virtualization support | tsc_scale | AMD TSC scaling support |
| lm | Long Mode (x86-64 ) - amd64, also known as Intel 64, i.e. 64-bit capable) | tsc | Time Stamp Counter (RDTSC) |
| lwp | Light Weight Profiling | up | smp kernel running on up |
| mca | Machine Check Architecture | vmcb_clean | AMD VMCB clean bits support |
| mce | Machine Check Exception | vme | Virtual Mode Extensions (8086 mode) |
| misalignsse | Misaligned SSE mode | vmx | Hardware virtualization - Intel VMX |
| mmxext | AMD MMX extensions | vnmi | Intel Virtual NMI |
| mmx | Multimedia Extensions | vpid | Intel Virtual Processor ID |
| monitor | Monitor/Mwait support (Intel SSE3 supplements) | wdt | Watchdog timer |
| movbe | MOVBE instruction | x2apic | x2APIC |
| mp | Multiprocessing Capable. | xop | extended AVX instructions |
| mpx | Memory Protection Extension | xsave | XSAVE/XRSTOR/XSETBV/XGETBV |
| msr | Model-Specific Registers (RDMSR, WRMSR) | xtopology | cpu topology enum extensions |
A sada pogledajmo kako provjeriti koju od navedenih funkcionalnosti podržana naš procesor.
U direktoriju /proc/ se nalazi datoteka cpuinfo koja sadrži sve informacije o našem procesoru (CPU).
Ispišimo ju te pogledajmo sve što je navedeno pod “Flags”.
Pogledajmo jedan noviji Intel Xeon procesor (E5-2650 v3 sa 40 CPU jezgri): (Iz primjera je izbačeno sve što nam trenutno nije zanimljivo )
cat /proc/cpuinfo ... ... ... vendor_id : GenuineIntel cpu family : 6 model : 63 model name : Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz cpu MHz : 2300.210 cache size : 25600 KB ... ... ... fpu : yes ... ... ... flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf cpuid_faulting pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt ... ... ...
Više hardverskih informacija o našem CPU-u, možemo dobiti pomoću naredbe dmidecode .
dmidecode -t 4
# dmidecode 2.11
SMBIOS 2.7 present.
Handle 0x0400, DMI type 4, 42 bytes
Processor Information
Socket Designation: Proc 1
Type: Central Processor
Family: Xeon
Manufacturer: Intel
ID: C2 06 02 00 FF FB EB BF
Signature: Type 0, Family 6, Model 44, Stepping 2
Flags:
FPU (Floating-point unit on-chip)
VME (Virtual mode extension)
DE (Debugging extension)
PSE (Page size extension)
TSC (Time stamp counter)
MSR (Model specific registers)
PAE (Physical address extension)
MCE (Machine check exception)
CX8 (CMPXCHG8 instruction supported)
APIC (On-chip APIC hardware supported)
SEP (Fast system call)
MTRR (Memory type range registers)
PGE (Page global enable)
MCA (Machine check architecture)
CMOV (Conditional move instruction supported)
PAT (Page attribute table)
PSE-36 (36-bit page size extension)
CLFSH (CLFLUSH instruction supported)
DS (Debug store)
ACPI (ACPI supported)
MMX (MMX technology supported)
FXSR (FXSAVE and FXSTOR instructions supported)
SSE (Streaming SIMD extensions)
SSE2 (Streaming SIMD extensions 2)
SS (Self-snoop)
HTT (Multi-threading)
TM (Thermal monitor supported)
PBE (Pending break enabled)
Version: Intel(R) Xeon(R) CPU E5606 @ 2.13GHz
Voltage: 1.4 V
External Clock: 133 MHz
Max Speed: 4800 MHz
Current Speed: 2133 MHz
Status: Populated, Enabled
Upgrade: Socket LGA1366
L1 Cache Handle: 0x0710
L2 Cache Handle: 0x0720
L3 Cache Handle: 0x0730
Serial Number: Not Specified
Asset Tag: Not Specified
Part Number: Not Specified
Core Count: 4
Core Enabled: 4
Thread Count: 4
Characteristics:
64-bit capable
...
...
...
U linuxu, većina informacija o CPUu se nalazi u nekoj od datoteka unutar /proc datotečnog sustava, na lokaciji: /sys/devices/system/cpu/ a osnovni podaci se nalaze u datoteci /proc/cpuinfo.
Važno je znati da svaku od ovih funkcionalnosti po logici moramo promatrati kao da je integrirana na zasebnoj kartici ili čipu. Stoga je potreban i upravljački program za svaku od njih. Ili već integriran u postojeći linux kernel ili dostupnu kao linux kernel modul. Više o tome u poglavlju “Kernel”
Ako smo i ispravno učitali upravljački program (kernel modul) za određenu CPU funkcionalnost, to ne znači da će ona raditi sama od sebe, već je za njenu upotrebu potreban i softver koji ju zna iskorištavati.
CPU registri se koriste za brzo dohvaćanje, spremanje i prijenos podataka i instrukcija kojima CPU može trenutno pristupiti (bez potrebe za posredovanjem preko neke druge komponente). Sami registri se nalaze između priručne memorije CPU-a (Level 1, Level 2 ili Level 3) i ostatka CPUa, s jedne strane, a s druge strane prema ostalim komponentama sustava.
Današnji procesori (CPU) imaju nekoliko osnovnih kategorija registara, poput ovih na slici na kojoj imamo pogled samo na registre procesora (dolje).
CPU registri se koriste i za obavljanje specijaliziranih zadaća, svaki prema svojoj namjeni. Na vrlo niskoj razini sve operacije u konačnici završavaju u nekom od registara, koji ih dalje obrađuju.
Možemo reći i slijedeće:
Kada se odrađuje bilo koja radnja na računalu, svi podaci se pohranjuju u registre, kao i međupodaci u toku obrade podataka. A na kraju se i rezultat obrade podataka čita iz samih registara.
Pogledajmo i tablicu s popisom broja registara ovisno o arhitekturi procesora:
| Arhitektura procesora | Broj registara opće namjene, data i adresnih registara | Broj Floating Point registara |
| 16 bitni x86 | 8 | 8 |
| 32 bitni x86 | 8 | 8 |
| 64 bitni x86 | 16 | 16 |
| Intel Itanium | 128 | 128 |
| SPARC | 31 | 32 |
| Power arhitektura | 32 | 32 |
| 32 bitni ARM | 14 | varira do 32 |
| 64 bitni ARM | 31 | 32 |
| MIPS | 31 | 32 |
Registri koji su zaduženi za pristup RAM memoriji drže memorijske adrese s kojih CPU želi čitati ili pisati (ovo radi MAR registar). U uvom slučaju kada CPU želi nešto snimiti ili pročitati iz RAM memorije on sprema adrese potrebnih memorijskih lokacija u MAR registar.
S druge strane MBR registar pohranjuje sadržaj (podatke ili instrukcije) koje se čitaju ili zapisuju u RAM memoriju. Sadržaj instrukcija koji se nalazi u ovom registru se prebacuje u IR (Instruction Register) registar ,dok se sadržaj (podaci) prebacuju u I/O registre ili AC registar. Drugim riječima MBR registar se koristi za pohranu podataka ili instrukcija koje dolaze ili odlaze prema RAM memoriji.
I/O Adresni registar se koristi za adresiranje I/O (ulazno/izlaznih) uređaja, dok se I/O Buffer registar koristi za razmjenu podataka (Engl. Data) između I/O komponenti i procesora.
Program Counter (PC) registar koji se inače zove i Instruction Pointer odnosno IP registar se koristi za spremanje adrese slijedeće instrukcije koja je na redu za izvršavanje. Naime kada je prva instrukcija izvršena od strane procesora, vrijednost ovog registra se povećava, tako da on uvijek pokazuje na prvu slijedeću instrukciju koju procesor mora dohvatiti (Engl. Fetch) te potom izvršiti.
U tom procesu dohvaćanja (Fetch) instrukcije iz memorije, ona se prvo pohranjuje u Instruction Registar tj. IR registar. Tada Control Unit odnosno CU (pogledajte dizajn procesora) uzima instrukciju iz ovog registra i izvršava ju, slanjem signala drugoj komponenti koja ga zapravo može izvršiti (ovisno o samoj instrukciji).
Accumulator Register (AC) se zapravo nalazi unutar ALU jedinice te se koristi za sve aritmetičko logičke operacije ALUa (Engl. Arithmetic Logic Unit). Njega koristi CU (Control Unit) tako što u njega sprema podatke koje je dohvatila iz RAM memorije - za aritmetičko logičke operacije. Dakle ovaj registar drži ulazne podatke nad kojima će se raditi neke od aritmetičko logičkih operacija, međurezultate i konačne rezultate ovih operacija.
Konačni rezultati se tada prebacuju u RAM memoriju pomoći MBR registra.
Stack Control Register (SCR). Stog (Engl. Stack) predstavlja grupu memorijskih blokova unutar kojih se trebaju pohraniti određeni podaci ili se trebaju pročitati u određenom nizu. Podaci se čitaju ili zapisuju u stog prema principu “FILO” (Engl. First In and Last Out) - prvi koji uđe zadnji izlazi. SCR registar se koristi za upravljanje stogom (Stack) podataka u RAM memoriji. Veličina ovog registra je relativno malih 2 ili 4 byte-a.
Flag Register (FR) se koristi za indikaciju određenih stanja ili uvjeta u radu procesora. Ovaj registar je prilično mali (1 ili 2 bytea) te se koristi za pohranjivanje određenih alarma ili zastavica. Dakle u slučajevima kada se određene instrukcije izvršavaju te se dogodi neki uvjet, moguće je postavljanje Tzv. zastavice unutar ovog registra, koja se provjerava, te ovisno o tome što ona signalizira, mogu se pokrenuti određene akcije unutar algoritma koji se izvršava.
Data Register (DR) se koristi za privremeno spremanje podataka koji će biti ili poslani ili učitani s perifernih uređaja.
Što su instrukcije koje stalno spominjemo
Instrukcije o kojima smo govorili su zapravo naredbe koje podržava određeni procesor,odnosno arhitektura procesora, ali na vrlo niskoj razini.
Ove naredbe su poput naredbi u višim programskim jezicima (C/C++/JAVA/Scala/Python/Perl/PHP…) kojima se indirektno daju instrukcije procesoru koji ih odrađuje.
Ove instrukcije na najnižoj razini su ugrađene u sam procesor i ovise o arhitekturi procesora. Kao što smo vidjeli i iz tablice s registrima, tako ovisno o arhitekturama procesora ovise i instrukcije koje postoje. Tako razlikujemo nekoliko osnovnih arhitektura procesora :
Vidljivo je kako postoji cijeli niz arhitektura procesora, od kojih svaka arhitektura ima točno određeni niz mikro instrukcija. To znači kako, prvo operacijski sustav a nadalje i programi, koji su pisani za jednu arhitekturu procesora (govorimo o razini strojnog koda), ne mogu raditi na drugoj arhitekturi procesora jer imaju različite instrukcije.
Ovo čak znači da i unutar jedne arhitekture kao što je recimo 64. bitna x86 arhitektura, postoje razlike - od proizvođača do proizvođača i od procesora do procesora, pogotovo što se tiče dodatnih funkcionalnosti - za koje također postoje posebne instrukcije. Pogledajte listu s funkcionalnostima (CPU Flags) raznih x86 procesora - u poglavlju Napredno :CPU. Dakle iza svake od tih funkcionalnosti stoji cijeli niz novih instrukcija.
Ako neki program koristi specifične funkcionalnosti (strojne instrukcije) jednog procesora, postoji velika vjerojatnost da neće raditi na drugom procesoru iako pripadaju istoj arhitekturi procesora (poput x86). Stoga se (osim kada to nije sa stvarnim razlogom) izbjegava korištenje poziva na vrlo niskoj razini, koji koriste točno određene instrukcije procesora, već se prepušta (višem) programskom jeziku briga o tome. To znači kako programski jezik više razine prema programeru radi apstrakciju svih detalja s niske razine a kojima uglavnom programer niti nema pristup.
Ako promatramo još nižu razinu, koja je dostupna primjerice ako programiramo u programskom jeziku poput Assemblera, tada dajemo direktne (strojne) instrukcije procesoru, poput ovih u primjeru dolje gdje je vidljiv assemblerski programski kod. U ovom primjeru assemblerskog programskog koda, varijabli var1 dodjeljujemo vrijednost 123 a potom u slijedećem koraku CPU registru EAX postavljamo vrijednost te varijable:
var1 DWORD 123 mov ebx, var1 add eax, ebx
Ovo je i najniža razina kojoj programeri mogu pristupiti
Popis svih instrukcija strojnog koda programskog jezika assembler, što standardnih (osnovnih) a što onih koji su specifični za pojedine procesore, možete vidjeti na stranici: https://en.wikipedia.org/wiki/X86_instruction_listings
Ako se pak spustimo na još nižu razinu, tada shema cijelog procesa obrade našeg programa (sa svim instrukcijama) izgleda ovako (Izvori informacija: (140) - (145)):
Naime u prvom koraku procesor preuzima strojni kod, odnosno naš program, sa svim pripadajućim instrukcijama. Zatim ga decoder dio procesora, dekodira u strojni kod najniže razine, koji se često naziva i mikro kod, a koji u konačnici ovisi o arhitekturi samog procesora. Dakle ovdje se instrukcije koje smo kao programeri zadali samom procesoru, pretvaraju u stvarne instrukcije koje procesor razumije, a koje su skrivene, čak i od programera na najnižoj razini. Definicija i popis ovih mikroinstrukcija nalazi se u posebnom dijelu microcode ROM memorije ugrađene u CPU, koja se kontaktira u fazi dekodiranja instrukcija. Dodatno, CPU ima i microcode RAM memoriju, u koju se mogu spremati i nove verzije CPU microcodea. Naime često se u nekim od mikroinstrukcija otkrivaju greške ili se rade određene poboljšanja, pa ih je moguće nadograditi, nadogradnjom microcodea CPUa.
Naime ako gledamo strojne instrukcije koje kao programeri na najnižoj programerskoj razini, primjerice programirajući u programskom jeziku assembler, prosljeđujemo procesoru, one su više manje standardne, osim onih s kojima baratamo specijaliziranim registrima ili dijelovima procesora. Međutim kada se te strojne instrukcije prevedu u mikroinstrukcije unutar procesora, tu dolazi do određenih promjena. Tako recimo pojedina strojna instrukcija, prevedena u mikroinstrukcije, može biti prevedena u više mikroinstrukcija, jer ne postoji jedna od njih koja može riješiti pojedinu višu instrukciju, već se ta radnja mora odraditi s više mikroinstrukcija i potencijalno u više taktova procesora. S druge strane moguće je i da se niz od nekoliko strojnih instrukcija prevede i obradi kao samo jedna mikroinstrukcija.
Dalje, kada su strojne instrukcije prevedene u mikroinstrukcije, moderni procesori potom imaju dio koji se zove scheduler koji se brine o dohvaćanju i u konačnici izvršavanju instrukcija, odnosno slanju istih dalje u takozvani cjevovod, koji se zove pipeline, na pripremu za izvršavanje. U ovom cjevovodu se može istovremeno naći i više instrukcija, koje bi se poslije mogle istovremeno izvršiti. Ovaj cjevovod se naziva i Instruction pipelining.
Tek tada se ove instrukcije šalju dalje na paralelnu obradu, ako je moguća, prema drugim dijelovima procesora.
Dodatna komplikacija u arhitekturi procesora je i činjenica kako moderni procesori imaju više CPU jezgri (SMP arhitektura), dijeljene priručne memorije ali i više cjevovoda.
Za više detalja o ovoj najnižoj razini mikro instrukcija procesora, možete pogledati upute tvrtke Intel, za njihove procesore: https://software.intel.com/en-us/articles/intel-sdm.
Kako smo već spomenuli, s vremena na vrijeme otkrivaju se greške ali se rade i poboljšanja mikroinstrukcija, te je zbog toga potrebna nadogradnja microcode dijela CPUa. Dodatno, moguće je kreirati i nove instrukcije, unutar microcode nadogradnje. Ipak, veće greške unutar CPUa, ne mogu se riješiti nadogradnjom microcode. Nadogradnja microcodea, radi se obično tako, da se ona nadograđuje unutar Firmwarea BIOSa matične ploče. Ova nadogradnja se odrađuje tako, da se nakon nadogradnje BIOSa matične ploče, kod svakog novog pokretanja/restarta računala, microcode za CPU učitava u microcode RAM memoriju unutar CPUa.
Druga metoda nadogradnje CPU microcodea je nadogradnja iz Linuxa. Naime Linux u vrlo ranoj fazi inicijalizacije kernela, a prije podizanja ostatka operacijskog sustsva, može napraviti microcode update.
Sličan microcode update, može se odrađivati i za drugi hardver, poput RAID ili disk kontrolera, mrežnih kartica i drugog hardvera, koji podržava microcode funkcionalnost, a ovakve nadogradnje se obično nazivaju Firmware update. Za Firmware update odnosno nadogradnju, pogledajte poglavlje: Nadogradnja firmwarea uređaja
Vratimo se na microcode te provjerimo verziju microcodea, našeg CPUa, pogledom u posebnu datoteku: /proc/cpuinfo:
grep microcode /proc/cpuinfo microcode : 0x5 microcode : 0x5
U ovom slučaju imamo CPU sa microcode verzijom 0x5.
Pogledajmo i što se događa u trenutku inicijalizacije (pokretanja) računala:
dmesg | grep microcode [ 20.383452] microcode: CPU0 sig=0xf43, pf=0x10, revision=0x5 [ 20.388169] platform microcode: firmware: agent loaded intel-ucode/0f-04-03 into memory [ 20.388203] microcode: CPU1 sig=0xf43, pf=0x10, revision=0x5 [ 20.391786] platform microcode: firmware: agent loaded intel-ucode/0f-04-03 into memory [ 20.392050] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
Ako nemate instaliran, potrebno je instalirati paket: microcode_ctl, uz koji dolazi i microcode datoteka od Intela i AMDa.
Čisto za informaciju, za Intel CPU, microcode za Linux je dostupan na lokaciji: https://downloadcenter.intel.com/search?keyword=Linux*+Processor+Microcode+Data+File.
Standardna lokacija i ime CPU microcode datoteke za Intel CPU je: /lib/firmware/microcode.dat i ova datoteka sadrži microcode za cijeli niz procesora (CPUa), od kojih se pronalazi pravi, te se u njega učitava ispravan microcode. Lokacija microcode datoteka za AMD je: /lib/firmware/amd-ucode/.
Provjerimo jeli naš trenutni kernel kompiliran s podrškom za microcode update, jer bez ove podrške nadogradnja microcodea neće biti moguća:
grep -i "microcode_[IA]" /boot/config-`uname -r` CONFIG_MICROCODE_INTEL=y CONFIG_MICROCODE_AMD=y
Pošto i za INTEL i AMD (procesore) imamo y, to znači kako je sve u redu te kako će kod slijedećeg restarta računala biti uredno učitan CPU microcode, ako je to potrebno (ako postoji novija verzija od one koja se nalazi u microcode ROM verziji procesora).
Izvori informacija: (145),(146)
Cijeloj priči oko CPU registara, moramo dodati još jednu komponentu a to je priručna vrlo brza RAM memorija, koja se logički nalazi između registara i RAM memorije, te ostatka CPUa.
Pogledajmo pojednostavljeni model CPUa s jednom jezgrom (procesori s više jezgri imaju još kompleksniji model).
Naime na putu između RAM memorije i praktično ostatka CPU-a se nalaze vrlo brze priručne memorije i to u nekoliko slojeva.
Uglavnom su tu:
ITLB1) a druga za podatke (zvana i DTLB1)Ova priručna RAM memorija služi kao međuspremnik između RAM memorije (koja je za sam CPU prilično spora) i ostalih komponenti CPUa. Posebni mehanizmi su zaduženi za spremanje podataka u ove međuspremnike (Layer 1 i Layer 2) jer je potrebno znati što čuvati u ovoj memoriji a što ne. Svaki puta kada traženi podatak (ili instrukcija ) nije sačuvana u ovim priručnim memorijama, potrebno ga je dohvatiti i učitati, što naravno troši određeni dio resursa. S druge strane ove priručnie memorije unutar procesora su ipak drastično brže nego RAM memorija, pa je njihova upotreba itekako opravdana.
Što se događa kod dohvaćanja sadržaja RAM memorije ?
Prvo se podaci pokušavaju dohvatiti iz Layer 1 a ako dođe do promašaja (podataka ovdje nema), pokušavaju se dohvatiti iz Layer 2 i učitati u Layer 1. Ako traženi podatak nije niti u Layer 2 tada se pokušava dohvatiti iz Layer 3 kod višejezgrenih CPUa. I na kraju ako podatak nije niti ovdje podatak se dohvaća iz RAM memorije.
Ovisno a arhitekturi procesora ova memorija se koristi i/ili kao TLB memorija ili se TLB memorija nalazi unutar MMU dijela.
O kojim se brzinama i kašnjenjima radi u prosjeku, za x86 arhitekturu (Intel Core i7 Xeon 5500) ?
Ovo su okvirni podaci !
| Lokalno ili udaljeno | Memorija kojoj se pristupa | Koliko je CPU ciklusa potrebno | Koliko ns je potrebno (najlošije - najbolje) |
| local | L1 | 4 ciklusa | 2.1 - 1.2 ns |
| local | L2 | 10 ciklusa | 5.3 - 3.0 ns |
| local | L3 - direktno dohvaćeno | 40 ciklusa | 21.4 - 12.0 ns |
| local | L3 - dijeljeno s drugom jezgrom | 65 ciklusa | 34.8 - 19.5 ns |
| local | L3 - modificirano na drugoj jezgri | 75 ciklusa | 40.2 - 22.5 ns |
| remote | L3 - ”NUMA udaljeni NUMA node“ | 100-300 ciklusa | 160.7 - 30.0 ns |
| local | DRAM | 60 ns | |
| remote | DRAM ”NUMA udaljeni NUMA node“ | 100 ns |
Objašnjenje : CPU ciklusa(u sekundi) = takta procesora:
| Takt procesora (MHz/GHz) | Opis |
| 1 MHz | 1 000 000 Hz (ciklusa u sekundi) |
| 10 MHz | 10 000 000 Hz (ciklusa u sekundi) |
| 100 MHz | 100 000 000 Hz (ciklusa u sekundi) |
| 1000 MHz (1 GHz) | 1 000 000 000 Hz (ciklusa u sekundi) |
| 2000 MHz (2 GHz) | 2 000 000 000 Hz (ciklusa u sekundi) |
I još malo detalja vezanih uz memoriju
Pogledajte i poglavlja :
Tablica prikazuje vrijeme potrebno za pristup ili dohvaćanje/obradu podataka:
0.5 ns - CPU - referenciranje L1 dCACHE memorije
1 ns - brzina svjetlosti - foton prolazi udaljenost od 30.5cm
5 ns - CPU L1 iCACHE Branch mispredict
7 ns - CPU - referenciranje L2 CACHE memorije
30 ns - sistemski poziv na obradu podataka (ovo vrijeme varira od 30ns do 90ns ovisno o CPU)
100 ns - MUTEX lock/unlock (novije implementacije CPUa - 17 ns)
100 ns - Referenciranje DDR memorije (RAM)
10,000 ns - Komprimiranje 1KB korištenjem ZIP algoritma
20,000 ns - Slanje 2KB preko 1 Gbps mreže
250,000 ns - Sekvencijalno čitanje 1 MB podataka iz RAM memorije
500,000 ns - Odziv mreže (kašnjenje) unutar podatkovnog centra
10,000,000 ns - Pristup tvrdom disku (DISK seek)
10,000,000 ns - Sekvencijalno čitanje 1 MB s mreže
30,000,000 ns - Sekvencijalno čitanje 1 MB s tvrdog diska
150,000,000 ns - Slanje mrežnih paketa iz SAD-a u Europu
| | | |
| | | ns|
| | us|
| ms|
sistemski pozivi - sistem mora nekako reagirati kod primanja svakog zahtjeva za obradu podataka. Ovdje se radi o vremenu potrebnom kako bi se uopće odradio određeni sistemski poziv i pokrenula cijela procedura obrade. Nerijetko je ovo vrijeme u granicama između 40ns i 90ns.MUTEX lock/unlock se odnosi na proces zaključavanja odnosno otključavanja radnog threada (niti) unutar programa, zbog dalje obrade od strane CPUa. Za više detalja, pogledajte poglavlje "Context switching" branch predictor je dio CPUa odnosno logika unutar njega, koja pokušava predvidjeti grananje programa, odnosno smjerove grananja ovisne o programiranim uvjetima unutar same logike programa. Dakle uvjeti poput if-then-else i slično. Naime moderni procesori tijekom izvršavanja programa, a s obzirom na to da imaju nekoliko cjevovoda (Engl. Pipelines) za izvršavanje, pokušavaju unaprijed predvidjeti grananje programa, ne bi li se ono moglo što brže odraditi. Dakle CPU L1 iCACHE Branch mispredict se odnosi na promašaj u predviđanju grananje, te ponovni (novi) odabir odnosno vrijeme potrebno kako bi se to odradilo.Sada uzmimo primjer u kojemu CPU mora obraditi mrežne pakete, kako ih mrežna kartica prima. Ako govorimo o brzinama 1Gbps, tada imamo 1,488,095 paketa u sekundi, koje treba obraditi a to znači kako dobivamo vremenski okvir od 672ns unutar kojih se svaki pojedini mrežni paket mora obraditi. Pogledajte odakle nam ova brojka:
1 / 1,488,095 x 1,000,000,000 (ns) = 672 ns
Ako s druge strane govorimo o većim brzinama - pr. 10Gbps tada imamo:
1 / 14,880,952 x 1,000,000,000 (ns) = 67.2 ns
To znači, kako je procesoru (CPU), koji radi na 2GHz, jedan takt (clock) traje 0.5ns. Prema tome ovisno o brzini mreže imamo slijedeće stanje:
| Brzina mreže | Maksimalno vrijeme obrade | Broj taktova/ciklusa CPU unutar koji se mora odraditi svaki paket |
| 1 Gbps | 672 ns | 1340 ciklusa |
| 10 Gbps | 67.2 ns | 134 ciklusa |
| 40 Gbps | 16.8 ns | 33.5 ciklusa |
| 100 Gbps | 6.7 ns | 13.4 ciklusa |
Prema tablici, za brzinu od 1 Gbps, procesor ima vremena 672ns kako bi obradio svaki mrežni paket. Povećanjem brzine mreže na 10 Gbps to se vrijeme smanjuje na samo 67,2ns unutar kojih se svaki mrežni paket mora obraditi. Dakle za 10Gbps za CPU koji radi na 2GHz, svaki mrežni paket mora obraditi unutar 134 takta procesora, što je vremenski okvir od 67.2ns. Za još veće brzine (40 Gbps i 100 Gbps) problemi postaju sve veći. Cijelo vrijeme govorimo o najmanjim mogućim paketima (64 byte)
Zbog razumijevanja ove problematike, moramo znati kako se unutar vremenskih okvira u kojima se svaki paket mora obraditi događaju i druge stvari, poput :
Ovdje smo načeli i problematiku obrade mrežnih paketa na brzinama od 10Gbps (sve zbrojite i provjerite da li se sve može odraditi unutar 67.2ns za svaki mrežni paket).
Za više detalja pročitajte : https://software.intel.com/sites/products/collateral/hpc/vtune/performance_analysis_guide.pdf
SMP (Engl. Symmetric Multi-Processor)
Na stolnim i prijenosnim računalima, imalo novijim, može se primjetiti da njihov procesor (CPU) ima nekoliko procesorskih jezgri. Dakle jedan fizički procesor sadržava više (logičkih) jezgri. Tako danas u “desktop/stolnim” verzijama današnjih modernih procesora imamo do 8 ili više jezgri unutar jednog fizičkog procesora. Ovakva arhitektura fizičkog procesora, koji sadržava više jezgri se naziva SMP (Engl. Symmetric Multi-Processor).
Sve jezgre unutar jednog fizičkog procesora u ovakvim SMP sustavima preko MMU (Eng. Memory Management Unit) odnosno memorijskog kontrolera, pristupaju svoj raspoloživoj RAM memoriji, preko memorijske sabirnice, bez dodatnih ograničenja.
Ovakav dizajn ima svoja ograničenja po pitanju proširivosti odnosno skaliranja. Problem je u tome što je jedino moguće proširenje po pitanju procesora, ugradnja novog CPU-a s više jezgri (ako to podržava matična ploča). Ovo uglavnom znači i kupovinu nove matične ploče i procesora.
Sve ovo nije problem ukoliko vaše potrebe ne prelaze ograničenja jednog fizičkog procesora i svih njegovih jezgri, kao i pripadajuće RAM memorije.
Pozicija fizičkog procesora, njegovih jezgri te memorijskog kontrolera i pripadajuće RAM memorija za SMP sustave je vidljiva na slici :
Pojam CPU affinity je vezan uz SMP sustave, kada izričito želimo narediti operacijskom sustavu kako bi se određeni (željeni) proces izvršavao samo i isključivo na određenoj jezgri (ili jezgrama) procesora.
Linux task/proces scheduler tada veže označeni proces na procesorske jezgre koje smo mu zadali.
Linux task/proces scheduler inače, svaki proces dodjeljuje određenoj jezgri procesora prema svom internom algoritmu i prioritetima, što u posebnim slućajevima (kada se radi o zahtjevnim aplikacijama) nije dobro rješenje.
Kao što smo rekli CPU affinity je povezan sa ”Linux task/proces schedulerom“ i njegovim mehanizmima, a koji se zapravo brinu o :
Za više detalja o Linux task/proces scheduleru pogledajte poglavlje ”Task scheduler“
Za potrebe postavljanja “CPU afinity”-ja koristiti ćemo naredbu taskset
Ova naredba/program se može koristiti:
Naredba taskset je potpuno djelotvorna na SMP sustavima. Na NUMA sustavima s ovom naredbom ne možemo biti sigurni čiju RAM memoriju (lokalnog CPU-a ili udaljenog CPU-a) će proces koristiti (pogledajte slijedeće poglavlje ”NUMA“).
Za CPU afinitet za NUMA arhitekturu se koristi naredba numactl.
CPU afinitet je na niskoj razini sustava prezentiran “bit maskom”. Najniži bit predstavlja prvi logički CPU (jezgru) a najviši bit predstavlja zadnji logički CPU (jezgru).
Osim navedene “bit maske” moguće je postavljati CPU afinitet s brojčanim oznakama CPU jezgri što ćemo i mi koristiti.
Pogledajmo i primjere
1. Provjerimo CPU afinitet pokrenutog procesa. Radi se o procesu čiji PID (Process ID) smo saznali s naredbom pidof (pogledajte primjer iz poglavlja Task scheduler).
Dakle saznali smo kako se radi o PID-u : 410561.
Koristiti ćemo prekidače :
-p označava da dajemo PID od pokrenutog procesa -c označava da želimo numeričku listu CPU jezgri (umjesto bit maske koja nam je malo teže razumljiva)taskset -p -c 410561 pid 410561's current affinity list: 0-7
Dobili smo kao rezultat da naš proces PID 410561 (zapravo se radilo o SSH servisu): ima CPU afinitet :0-7 (što znači 0,1,2,3,4,5,6 i 7). U našem slučaju se radilo o procesoru sa 8 jezgri. Dakle naš proces ih može koristiti sve (odnosno bilo koju od njih).
2. Postavimo CPU afinitet pokrenutom procesu, tako što se smije pokretati samo na CPU jezgri Br.1
taskset -p -c 1 410561 pid 410561's current affinity list: 0-7 pid 410561's new affinity list: 1
Rezultat je potvrda da je sada CPU afinitet promijenjen i to samo na CPU jezgru Br.1.
2.1 Moguće je postaviti CPU afinitet za niz CPU jezgri a ne samo za jednu. Postavimo ipak za naš proces PID : 410561, CPU afinitet na CPU jezgre 0 i 1.
taskset -p -c 0,1 410561 pid 410561's current affinity list: 1 pid 410561's new affinity list: 0,1
3. Postavimo CPU afinitet za proces koji tek pokrećemo (zove se /bin/moja-skripta-ili-program), na CPU jezgre 2 i 3.
taskset -c 2,3 /bin/moja-skripta-ili-program
4. Kombinacija CPU afiniteta i process/task scheduler prioriteta (Engl. Priority) i algoritma (Engl Scheduler policy) za naš program iz primjera prije.
taskset -c 2,3 chrt -f 78 /bin/moja-skripta-ili-program
Opis :
Postavimo CPU afinitet samo na jezgre 2 i 3
Postavimo parametre rada proces/task schedulera za naš program koji pokrećemo, na:
-f odabir “SCHED_FIFO” algoritma 78 odabir prioriteta unutar gore navedenog algoritma : 78 (za taj algoritam: najniži prioritet=1 , najviši=99 ).
Objasnili smo što se događa sa pojedinim procesima ali što je sa nitima (Engl. Thread) unutar svakog pojedinog procesa odnosno aplikacije.
Naime u razvoju programa bilo bi dobro paziti da je program pisan tako da je moguće izvršavati više logičkih cjelina u paraleli odnosno razvijati aplikacije koje mogu koristiti više niti istovremeno. Sve imalo naprednije aplikacije (a pogotovo one za poslužiteljske namjene) su upravo tako i pisane.
Ovdje zapravo dolazimo do malih komplikacija. Iako Linux task/proces scheduler, što sam, a što s našim podešavanjem CPU afiniteta može vrlo dobro rasporediti pojedine procese (programe/aplikacije) na pojedine CPU jezgre. Ostaje pitanje kako će rasporediti niti (thread-ove) unutar svakog od tih procesa.
Sada zapravo ponovno dolazimo do područja koje više pripada Linux proces/task scheduleru ali ćemo to ipak objasniti ovdje.
Zapravo Linux Linux task/proces scheduler ne pravi razliku da li se radi o procesu ili niti te primjenjuje iste mehanizme za njih. Dakle ako je pokrenutom procesu dozvoljeno da koristi sve dostupne CPU jezgre sustava, on će ih i koristiti a istovremeno će niti unutar tog procesa također koristiti sve dostupne CPU jezgre.
Dakle optimizacijom svakog pojedinog procesa/programa/aplikacije prema Linux task/proces scheduleru radimo i optimizacije za sve njegove niti. Tako primjerice ako imamo pokrenuti program koji može koristiti 4 CPU jezgre a pisan je tako da ima samo dvije niti, te niti će se zapravo pokretati na dvije CPU jezgre.
Kako provjeriti koje niti našeg programa se pokreću na kojoj CPU jezgri ?
Prvo moramo naći PID našeg pokrenutog procesa/programa.
Recimo da smo pronašli da je PID 4071.
U našem primjeru radi se o programu imena kvm koji pokreće jedno virtualno računalo na našem poslužitelju, ali se može raditi o bilo kojem programu za koji znamo da koristi više niti u radu.
pidof kvm 4071
Za ovu potrebu, koristiti ćemo naredbu ps ali sa dodatnim parametrima, s kojima ćemo moći vidjeti sve što nas zanima o našem pokrenutom procesu:
ps -mo pid,tid,fname,user,psr -p 4071
PID TID COMMAND USER PSR
4071 - kvm root -
- 4071 - root 5
- 4096 - root 3
- 4097 - root 5
- 4098 - root 3
- 4100 - root 3
Vidimo da naš proces (PID 4071) ima više niti - pogledajte Thread ID (TID) : 4071, 4096, 4097, 4098 i 4100 koje su trenutno aktivne (možda ih ima i više ali trenutno nisu aktivne) te kako se neke od njih pokreću na CPU jezgri 5 a neke na CPU jezgri 3.
Svako pokretanje gore navedene naredbe očitava trenutno stanje - u djeliću sekunde kada smo pokrenuli naredbu.
Opis prekidača naredbe ps koje smo koristili :
-mo Ispiši niti (Thread) poslije procesa (m) te nakon toga slijede dodatne opcije (o) pid Ispiši PID (Process ID) trenutnog (našeg) procesa tid Ispiši TID (Thread ID) (ID od svake niti) trenutnog (našeg) procesa fname Ispiši ime pokrenutog procesa/programa (vidljivo u stupcu ispod “COMMAND”) user Ispiši ime korisnika koji je pokrenuo ovaj (naš) proces/program psr Ispiši procesor (CPU jezgru) na kojoj se trenutno izvršava nitAko budemo pokretali gore navedenu naredbu više puta, vidjeti ćemo kako se niti raspoređuju po CPU jezgrama unutar granica koje su dozvoljene za trenutni proces.
Provjerimo ih kako smo naučili u prvom primjeru gore.
taskset -p -c 4071 pid 4071's current affinity list: 0-7
Dakle granica za ovaj proces/program su CPU jezgre 0 do 7.
Upravo zbog višenitnosti može nam izgledati kao da se naš višenitni (Engl. Multithread) proces/program/aplikacija prebacuje između više CPU jezgri - kada pratimo opterećenje sustava.
I na kraju ponovno proučite : Linux task/proces scheduler i također context switching te detalje direktno vezane uz “context switching” a odnose se na RAM memoriju i proces translacije adresa koji se mora učestalije događati u slučajevima ako imamo veći broj niti unutar programa u odnosu na njihovo paralelno izvršavanje i upotrebu CPU jezgri.
NUMA (Engl. Non-uniform memory access)
Na poslužiteljskim generacijama procesora (CPU) koji imaju i znatno veći broj jezgri unutar fizičkog procesora (12, 24, 28, 32 ili 36 ), moguće je na jednu matičnu ploču instalirati i dva ili više fizičkih procesora (CPU-a). Naravno ako to podržava sama matična ploča (i procesor).
Iako je ova tehnologija konceptualno nastala 1960-tih, pojavom prvih superračunala, njen dizajn se mijenjao do 1990-tih zbog drastičnih promjena u odnosima između brzine procesora u odnosu na brzinu RAM memorije.
Trenutni dizajn NUMA arhitekture su postavili AMD 2003 (s Opteron procesorima) te Intel kasnije 2007 na x86 (s Nehalem i Tukwila procesorima) i Itanium arhitekturi procesora.
S obzirom da svaki fizički procesor ima svoj ugrađeni memorijski kontroler (MMU) , kao i svoju memorijsku sabirnicu , sa pripadajućom RAM memorijom, sada dolazimo do situacije da za sustav s dva fizička procesora imamo:
Pogledajmo dva NUMA dizajna tvrtki AMD i Intel
Starije AMD (prije Quad-core - Abu Dhabi MCM (6308) ) i starije Intel NUMA rješenje
Novije AMD (nakon Quad-core - “Abu Dhabi” MCM (6308)) i novije Intel (od Xeon 7000 serije (“Beckton”)) NUMA rješenje
Intel prezentacija QPI nove generacije te pregled tehnologija
Kako to izgleda u praksi ?
Slika prikazuje noviju generaciju Intel Xeon matičnih ploča, baziranih na Intel C602J chipsetu, za LGA2011 Xeon procesore, poput : Intel Xeon E7-8870V3 sa 36 jezgri unutar svakog fizičkog procesora.
Matična ploča na slici je Supermicro X10QBL-4 :
Na slici je vidljivo da je na novu matičnu ploču moguće ugraditi do 4 fizička Xeon procesora E7 generacije.
Svaki od ovih procesora podržava četverokanalni pristup RAM memoriji (preko svog MMU kontrolera i memorijske sabirnice).
Stoga svaki fizički procesor ima po dva niza utora za RAM memoriju i to svaki od njih po četiri utora za dvokanalnu RAM memoriju gore (na slici) te po jedan niz od četiri utora za RAM memoriju dolje (isto dvokanalni). Dakle svaki fizički procesor (na slici) ima ukupno 8 utora za RAM memoriju, koji su raspoređeni u četiri kanala (što osigurava četiri puta vežu brzinu u odnosu na jednokanalnu memoriju).
Na što još obratiti pažnju kod procesora - primjer za Intel (zbog lakše dostupnosti podataka od strane Intel-a)
Svaki procesor koji podržava NUMA arhitekturu dizajniran je za NUMA sustav određene veličine.
Pogledajmo karakteristike tri Intel Xeon “NUMA” procesora :
| Model procesora | Broj QPI linkova koje podržava | Koliko se može skalirati |
| Xeon E5-2620 | 2 | 2S |
| Xeon E7-4830 v2 | 3 | S4S |
| Xeon E7-4830 v3 | 3 | S4S |
| Xeon E7-8860 | 4 | S8S |
| Xeon E7-8870 v3 | 4 | S8S |
Podatak o skaliranju (2S ili S2S) , (S4S) ili (S8S) nam govori kako su pojedini procesori dizajnirani za rad odnosno kako se mogu ugraditi na matične ploče koje imaju:
Dakle nije moguće pokrenuti sustav koji ima recimo četiri procesorska utora na matičnoj ploči, sa procesorima koji ih podržavaju samo dva (pr. S2S procesori).
Osim toga novije generacije procesora imaju sve veću propusnost QPI linkova.
U čemu je problem ?
U samom radu operacijskog sustava, prema tome da li se koristi na SMP sustavu (jedan fizički procesor sa više jezgri) ili NUMA sustavu(više fizičkih procesora od kojih svaki ima više jezgri) očito postoje velike razlike.
Zbog toga što NUMA ima popriličan utjecaj na performanse kod pristupa RAM memoriji, potrebne su i intervencije na strani operacijskog sustava, koji mora biti svjestan NUMA arhitekture. Osim toga porebne su i promjene na razini softvera, vezano za višenitni rad i pozicioniranje samih niti i procesa što bliže fizičkom procesoru (tj. NODE-u prema NUMA terminologiji).
Podrška za NUMA tehnologiju se počela razvijati s Linux kernelom v.2.4 a buduće verzije (danas trenutne) v.2.6 te v.3.0 i novije donijele su nam robustniju i stabilnu podršku. To znači da već od LTS verzija linux kernela v.2.6.32 na dalje Linux proces/task scheduler u kombinaciji s upravljačim programima i modernim aplikacijama pouzdano odrađuje sve zadatke koje pred njih postavlja NUMA tehnologija.
Manifestacije loše upotrebe ili konfiguracije NUMA-e, mogu imati za posljedicu sporiji rad ili usporavanja aplikacija ili u slučaju Virtualizacije, usporavanja rada virtualnih računala.
Na slici je vidljiv slučaj kada proces/program/aplikacija pokrenuta na prvom fizičkom procesoru (NODE 0) i to na njegovoj prvoj CPU jezgri (CORE 0 (označeno crvenom bojom)) koristi RAM memoriju.
Pošto o ovom slučaju, konkretan proces/program/apikacija nije svjesna NUMA arhitekture, on može (i vrlo često hoće) koristiti RAM memoriju, koja nije lokalna njegovom fizičkom procesoru (NUMA NODE 0) i njegovom memorijskom kontroleru, već drugom fizičkom procesoru.
Zbog toga što RAM memorija koju je on počeo koristiti nije njemu lokalna, on mora preko međuveze između fizičkih procesora (Intel QPI ili AMD HT) i to preko drugog fizićkog procesora (NUMA NODE 1) i njegovog memorijskog kontrolera dohvatiti RAM memoriju. Ova RAM memorija je prema tome lokalna (Engl. Local) za NUMA NODE 1 ali je za NUMA NODE 0 ona udaljena (Engl. Remote).
Jasno je da ovo unosi kašnjenje, prvo: prolaz između procesora prema drugom procesoru, i potom korištenje drugog memorijskog kontrolera (s drugog procesora), te prijenos podataka u suprotnom smjeru. Ovaj proces se ponavlja kod svakog pojedinog pristupa RAM memoriji.
Prema nekim mjerenjima, razlike u latenciji (kašnjenju) između pristupa lokalnoj RAM memoriji i NUMA udaljene memorije dosežu i do 50%.
Ovisno o dizajnu odnosno internoj arhitekturi procesora, ovisi kako Linux numerira jezgre procesora.
Slijedeća slika predstavlja logičku shemu AMD NUMA topologije koja je u upotrebi na “Abu-Dhabi” arhitekturi (Opteron 6300) procesora:
Kao što je vidljivo na slici, numeriranje jezgri u NUMA arhitekturi, na Linuxu, može varirati, ovisno o modelu vašeg procesora.
Kakva je trenutna podrška za NUMA kod aplikacija i programskih jezika za Linux ?
NUMA Statistike i informacije
Za provjeru dostupnosti NUMA procesora te njihove raspored, možemo pokrenuti naredbu numactl –hardware:
Pogledajmo malo stariji poslužitelj s dva fizička procesora (Intel Xeon E5606), od kojih svaki ima četiri jezgre.
Logički izgled navedenog Xeon procesora (E5606) je
Pogledajmo i kako to izgleda prema dijagnostici
numactl --hardware available: 2 nodes (0-1) node 0 cpus: 0 2 4 6 node 0 size: 49141 MB node 0 free: 7227 MB node 1 cpus: 1 3 5 7 node 1 size: 49151 MB node 1 free: 7278 MB node distances: node 0 1 0: 10 20 1: 20 10
Dakle vidimo da imamo dva fizička procesora ( available: 2 nodes (0-1) ).
Osim toga vidiljivo je i to da su na:
Također vidimo da :
Node distances
Tablica na kraju prikazuje Tzv. SLIT (Engl. System Locality Information Table) i SRAT (Static Resource Affinity Table) - ako je podržana od strane procesora. U našem primjeru gore nije podržana SLIT tablica jer se radi o vrlo starom procesoru, te nemamo točna očitanja latencije između fizičkih procesora.
SRAT tablica pokazuje nam kojemu fizičkom procesoru pripada koji blok RAM memorije. Ovaj pojam se zove i “proximity domain” prema ACPI-ju. Fizički procesor se naziva i “NODE” prema NUMA terminologiji.
Udaljenost odnosno vremena kašnjenja (Engl. Delay) između fizičkih procesora (NODES) su upisana u SLIT tablicu.
Na novijim procesorima SLIT i SRAT tablicama sustav može pristupiti preko ACPI (Engl. Advanced Configuration and Power Interface ) poziva.
NODE se sastoji od jednog fizičkog procesora i njegove pripadajuće RAM memorije.
Svi NODE-ovi (fizički procesori) su povezani međusobom (ovisno o implementaciji i proizvođaču kako smo vidjeli):
Ako se radi o više od dva procesora u prstenastom NUMA spoju to znači da pristup RAM memoriji sa NODE 0 (procesora 1) na RAM memoriju NODE 1 procesora ima samo prolaz kroz NODE 1 procesor. S druge strane pristup RAM memoriji s NODE 0 (procesor 1) na RAM memoriju NODE 3 (procesor 3) zahtjeva prolaz kroz još jedan procesor (ili kroz NODE 2). U složenijim NUMA arhitekturama, koristi se međuveza prstenastog spoja : 1 - 2 - 3 - 1.
Kod “Mesh” NUMA topologije svaki fizički procesor ima direktnu vezu s bilo kojim drugim fizičkim procesorom pa prema tome kašnjenje može biti samo s jednog preko drugog (nikada nema onog trećeg u nizu).
Dakle na novijim procesorima koji nam daju informacije o SLIT tablica pokazuje udaljenost odnosno kašnjenja ovisno s kojeg fizičkog procesora pristupamo kojoj RAM memoriji (lokalnoj - našem CPU-u ili udaljenoj koja pripdada drugom CPU-u).
Tablica za četveroprocesorski sustav koji ima noviju generaciju CPU-a bi izgledala otprilike ovako (Dakle imamo 4 x fizički CPU ):
Ovdje se radi o NUMA topologiji prsten.
node distances: node 0 1 2 3 0: 10 12 17 12 1: 12 10 12 17 2: 17 12 10 12 3: 12 17 12 10
Ova tablica nam govori da ako NUMA NODE 0 (CPU 1) pristupa svojoj lokalnoj RAM memoriji, da mu za t otreba 1.0 ns (nano sekundi). Ako isti procesor želi pristupati RAM memoriji NUMA NODE 1 (CPU 2) , za to mu je potrebno malo viš vremena : 1.2ns a ako želi pristupati RAM memoriji NUMA NODE 2 (CPU 3), tada mu za to treba čak 1.7 ns.
Vratimo se na naš stariji dvoprocesorski isustav
Ako želimo vidjeti listu svih dostupnih CPU jezgri i dodatne informacije, za to možemo koristiti :
numactl –show
numactl --show policy: default preferred node: current physcpubind: 0 1 2 3 4 5 6 7 cpubind: 0 1 nodebind: 0 1 membind: 0 1
Vidljivo je da imamo ukupno 8 CPU jezgri na sustavu ( physcpubind: 0 1 2 3 4 5 6 7 ), podjeljenih u dvije grupe (Tzv. “memory nodes” , pošto i imamo dva NODE-a tj. dva fizička CPU-a : 0 1 ).
Za ručnu provjeru NUMA statistike (u slučaju da imamo dva fizička procesora) može pokrenuti naredbe:
echo "Message : Node0 , Node1 "; join /sys/devices/system/node/node0/numastat /sys/devices/system/node/node1/numastat |awk '{print $1 ":" , $2 ",", $3 }'
Opis: čitamo statistike koje su vidljive za svaki NUMA node (fizički CPU). Statistike su dostupne u datoteci :
/sys/devices/system/node/node0/numastat za prvi NUMA node (broji se od 0)/sys/devices/system/node/node1/numastat za drugi NUMA nodejoin povezuje statistike iz obije datoteke u jednu (pošto obije datoteke imaju istu strukturu - stupaca i redova a mijenjaju se samo “brojevi”). awk samo filtriramo ispisRezultat će biti nešto slično ovome (ako je sve uredu s NUMA):
Message : Node0 , Node1 numa_hit: 31413614, 16686285 numa_miss: 0, 0 numa_foreign: 0, 0 interleave_hit: 20108, 20261 local_node: 31413376, 16664958 other_node: 238, 21327
Ovdje nam je važno da numa_miss i numa_foreign budu nula (0), što znači da nije bilo prebacivanja/korištenja RAM memorije s krivog fizičkog procesora.
Osim ovog ručnog rada, moguće je koristiti i naredbu numastat.
To onda izgleda ovako:
numastat
node0 node1
numa_hit 4144953406 3911786342
numa_miss 0 0
numa_foreign 0 0
interleave_hit 33306 33295
local_node 4144950529 3911749267
other_node 6648721 124510471
Pogledajmo i jedan loše konfiguriran NUMA sustav:
numastat
node0 node1
numa_hit 4401481650 4152273756
numa_miss 7270135 143548866
numa_foreign 143548866 7270135
interleave_hit 33306 33295
local_node 4401478648 4152236667
other_node 7273137 143585955
Ulazno izlazna komponenta NUMA-e odnosno NUMA I/O je vezana uz NUMA node slično kao što je memorijski kontroler i njegova lokalna RAM memorija vezana uz svoj NUMA node. Dakle svaki fizički procesor osim što ima svoj memorijski kontroler i svoju lokalnu RAM memoriju, također ima i pristup na svoju lokalnu sabirnicu (pr. PCI Express). Tako da već u NUMA sustavima s dva fizička procesora (dva NUMA node-a) imamo i dvije odvojene PCI Express sabirnice - svaka je spojena na svoj procesor, kao na slici:
Slika prikazuje Dell PowerEdge R720 poslužitelj s dva fizička procesora Intel Xeon E5-2600.
Ponovno dolazimo do problema kao i s RAM memorijom
Nakon inicijalizacije BIOS-a, BIOS operacijskom sustavu (Linux) dalje prosljeđuje informacije o tome koji PCI Express (PCIe) uređaj pripada kojem NUMA node-u (fizičkom procesoru). Pošto se na PCI Express sabirnici nalaze razni uređaji : od disk kontrolera, mrežnih i grafičkih kartica i sl. vrlo je važno da je operacijski sustav toga svjestan, te da su u konačnici i upravljački programi (prema Linux terminologiji “Kernel moduli”) svjesni NUMA arhitekture. Ovaj problem se proteže sve do procesa/programa/aplikacija koji koriste ove (praktično sve) uređaje.
Sada imamo komplikaciju :
Uređaj ← → PCI Express sabirnica ← → NUMA Node (CPU) ← → BIOS ← → upravljački programi (driveri) ← → Linux kernel ← → programi/aplikacije (procesi).
I naravno svi u nizu moraju biti svjesni NUMA arhitekture.
Na svim novijim linux kernelima (2.6.32 ili noviji), sve komponente sustava su dovoljno “svjesne” NUMA i NUMA I/O te su uglavnom jedine optimizacije vezane za NUMA CPU afinitet u smjeru :
Pozicioniranje CPU afiniteta za program koji zahtjeva vršne performanse, na isti NUMA node, preko kojega koristimo NUMA I/O operacije. To znači da ako imamo mrežno vrlo intenzivnu aplikacju/program (10 Gbps +) a mrežna kartica koju ona koristi se nalazi na NUMA I/0 koji je spojena na NUMA Node 0, tada bi se i ta aplikacija trebala nalaziti/pokretati na istom NUMA node-u (tj. bilo kojoj CPU jezgri na tom NUMA node-u).
Očekivane performanse tada mogu porasti čak do dva (2) puta.
Slika prikazuje mjerenje mrežnih performansi generiranih/mjerenih pomoću naredbe netcat s obzirom na korištenje NUMA I/O i CPU afiniteta u svezi s njim. Mrežne kartice su 40Gbps, spojene na PCI express utor, koji se nalazi na NUMA Node0 , na kojemu se nalazi i RAID kontroler. I mrežna kartica i RAID kontroler su natjerani da koriste IRQ na istom NUMA Node 0. Razlika je samo u tome da li se naredba netcat pokretala na NUMA Node 0 ili NUMA Node 1 CPU jezgrama.
Slika je preuzeta iz Dell dokumenta “NUMA Best Practices for Dell PowerEdge 12th Generation Servers”.
Kako saznati koji uređaj (na kojoj PCI sabirnici) pripada kojem NUMA node-u ?
Prvo pogledajmo sve PCI uređaje - izlistajmo ih (prikazati ćemo skraćeni ispis, zbog razumijevanja):
Za ovu potrebu ćemo koristiti naredbu lspci.
lspci ... 00:00.0 Host bridge: Intel Corporation Xeon E5/Core i7 DMI2 (rev 07) 00:01.0 PCI bridge: Intel Corporation Xeon E5/Core i7 IIO PCI Express Root Port 1a (rev 07) 01:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5720 Gigabit Ethernet PCIe 01:00.1 Ethernet controller: Broadcom Corporation NetXtreme BCM5720 Gigabit Ethernet PCIe 02:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5720 Gigabit Ethernet PCIe 02:00.1 Ethernet controller: Broadcom Corporation NetXtreme BCM5720 Gigabit Ethernet PCIe 00:04.0 System peripheral: Intel Corporation Xeon E5/Core i7 DMA Channel 0 (rev 07) 00:04.1 System peripheral: Intel Corporation Xeon E5/Core i7 DMA Channel 1 (rev 07) 00:04.2 System peripheral: Intel Corporation Xeon E5/Core i7 DMA Channel 2 (rev 07) 00:04.3 System peripheral: Intel Corporation Xeon E5/Core i7 DMA Channel 3 (rev 07) 00:1f.2 SATA controller: Intel Corporation C600/X79 series chipset 6-Port SATA AHCI Controller (rev 05) 03:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS 2208 [Thunderbolt] (rev 01) ... ... 3f:08.0 System peripheral: Intel Corporation Xeon E5/Core i7 QPI Link 0 (rev 07) 3f:09.0 System peripheral: Intel Corporation Xeon E5/Core i7 QPI Link 1 (rev 07) 3f:0b.0 System peripheral: Intel Corporation Xeon E5/Core i7 Interrupt Control Registers (rev 07) 3f:0c.6 System peripheral: Intel Corporation Xeon E5/Core i7 Integrated Memory Controller System Address Decoder 0 (rev 07) ... 40:01.0 PCI bridge: Intel Corporation Xeon E5/Core i7 IIO PCI Express Root Port 1a (rev 07) 40:02.0 PCI bridge: Intel Corporation Xeon E5/Core i7 IIO PCI Express Root Port 2a (rev 07) 40:03.0 PCI bridge: Intel Corporation Xeon E5/Core i7 IIO PCI Express Root Port 3a in PCI Express Mode (rev 07) 40:03.2 PCI bridge: Intel Corporation Xeon E5/Core i7 IIO PCI Express Root Port 3c (rev 07) 40:04.0 System peripheral: Intel Corporation Xeon E5/Core i7 DMA Channel 0 (rev 07) 40:04.1 System peripheral: Intel Corporation Xeon E5/Core i7 DMA Channel 1 (rev 07) 40:04.2 System peripheral: Intel Corporation Xeon E5/Core i7 DMA Channel 2 (rev 07) 40:05.0 System peripheral: Intel Corporation Xeon E5/Core i7 Address Map, VTd_Misc, System Managem ... ... 7f:08.0 System peripheral: Intel Corporation Xeon E5/Core i7 QPI Link 0 (rev 07) 7f:09.0 System peripheral: Intel Corporation Xeon E5/Core i7 QPI Link 1 (rev 07) 7f:0b.0 System peripheral: Intel Corporation Xeon E5/Core i7 Interrupt Control Registers (rev 07) 7f:0b.3 System peripheral: Intel Corporation Xeon E5/Core i7 Semaphore and Scratchpad Configuration Registers (rev 07) 7f:0c.6 System peripheral: Intel Corporation Xeon E5/Core i7 Integrated Memory Controller System Address Decoder 0 (rev 07) ... ...
U grubo je vidljivo da su na ovom poslužitelju (Dell PowerEdge R730) vidljiva četiri niza PCI Express sabirnica:
Prema numeričkim oznakama :
Prvu oznaku nazovimo X.
Na svakom od tih PCI Express sabirnica se nalaze PCI express uređaji. Neki su ugrađeni na matičnu ploču (veči dio njih) a neki su spojeni na PCI Express utore kao zasebne kartice. Oznake koje su pod x , yy ili z označavaju identifikator određenog uređaja na sabirnici (sabirnicama, pošto ih svaki NUMA node ima više).
Unutar direktorija /sys/devices/pci0000:X se nalaze informacije o tim uređajima.
Kako to izgleda :
ls -al /sys/devices/ | grep pci0000 drwxr-xr-x 31 root root 0 May 18 12:02 pci0000:00 drwxr-xr-x 46 root root 0 May 30 15:01 pci0000:3f drwxr-xr-x 18 root root 0 May 30 15:01 pci0000:40 drwxr-xr-x 46 root root 0 May 30 15:01 pci0000:7f
Unutar svakog od tih direktorija se nalazi identifikator točnog uređaja.
Ako iz naredbe lspci izvučemo samo recimo identifikator za prvu mrežnu karticu :
01:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5720 Gigabit Ethernet PCIe
Dobivamo : 01:00.0 što znači da je naš vršni direktorij /sys/devices/pci0000:00 unutar kojega mora postojati direktorij za naš uređaj 01.0.
Pazite na to kako se znak : u nazivu direktorija, kod izlistavanja, mora "escape-ati" sa znakom \ i to ovako:
ls -al /sys/devices/pci0000\:00/ .... drwxr-xr-x 3 root root 0 May 30 15:01 0000:00:00.0 drwxr-xr-x 8 root root 0 May 18 12:02 0000:00:01.0 drwxr-xr-x 8 root root 0 May 18 12:02 0000:00:01.1 drwxr-xr-x 6 root root 0 May 30 15:01 0000:00:02.0 drwxr-xr-x 7 root root 0 May 18 12:02 0000:00:02.2 drwxr-xr-x 6 root root 0 May 30 15:01 0000:00:03.0 ...
U ovom skraćenom izlistanju imamo naš direktorij 0000:00:01.0.
Uđimo u njega:
cd /sys/devices/pci0000\:00/0000\:00\:01.0/ cat numa_node 0
Sadržaj datoteke numa_node nam daje informaciju na koji NUMA NODE je spojen naš PCI (Express) uređaj, u ovom slučaju naša mrežna kartica.
Isto vrijedi i za sve PCI identifikatore/uređaje.
Osim ove informacije, pohranjene je i lista NUMA jezgri na navedenom node-u, koje ovaj uređaj smije koristiti.
Informacija o listi jezgri se nalazi u datoteci : local_cpulist (- ne zanoravimo - unutar svakog direktorija koji je identifikator PCI uređaja).
Pogledajmo:
cat local_cpulist 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
Ovdje se nalazi i interrupt (IRQ) koji ovaj uređaj koristi (datoteka irq):
cat irq 95
Dakle ovaj uređaj koristi IRQ 95.
Napomena vezana za interrupte - svi noviji uređaji koriste MSI interrupte ("IR-PCI-MSI-edge" stupac u IRQ tablici ) , koji se mapiraju na malo drugačiji način (i poput ove integrirane mrežne kartice koju smo promatrali).
Više detalja u tome koju vrstu IRQ neki uređaj koristi možemo vidjeti s naredbom lspci -v -s nakon koje slijedi identifikator PCI uređaja, poput ovoga koji smo gledali.
lspci -v -s 01:00.0
01:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5720 Gigabit Ethernet PCIe
Subsystem: Dell Device 1f5b
Flags: bus master, fast devsel, latency 0, IRQ 35
Memory at d91a0000 (64-bit, prefetchable) [size=64K]
Memory at d91b0000 (64-bit, prefetchable) [size=64K]
Memory at d91c0000 (64-bit, prefetchable) [size=64K]
Expansion ROM at dc800000 [disabled] [size=256K]
Capabilities: [48] Power Management version 3
Capabilities: [50] Vital Product Data
Capabilities: [58] MSI: Enable- Count=1/8 Maskable- 64bit+
Capabilities: [a0] MSI-X: Enable+ Count=17 Masked-
Capabilities: [ac] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [13c] Device Serial Number 00-00-e0-db-55-0f-98-70
Capabilities: [150] Power Budgeting <?>
Capabilities: [160] Virtual Channel
Capabilities: [230] Transaction Processing Hints
Kernel driver in use: tg3
Ako vas zanimaju MSI interrupti, pogledajte http://lwn.net/Articles/44139/
I na kraju, optimizacija za NUMA I/O se svodi na optimizaciju nekoliko komponenti :
Slično kao i kod SMP sustava, na NUMA sustavima je također moguće postaviti “CPU affinity” tj. nazovimo to CPU afinitet. Ali ovdje se radi o CPU afinitetu koji je svjestan NUMA arhitekture odnosno pripadnosti RAM memorije određenom memorijskom kontroleru odnosno fizičkom procesoru.
NUMA RAM afinitet se definira kroz razne parametre (o tome u primjerima).
Kada bi za ovu namjenu koristili SMP alate (poput taskset) nikada ne bi bili sigurni na kojem NUMA node-u (fizičkom procesoru bi određeni proces ili thread bio pokrenut a s kojeg NUMA node-a bi koristio RAM memoriju). Dakle treba nam alat za CPU afinitet koji je svjestan NUMA arhitekture.
Program koji nam daje ove mogućnosti zove se numactl a koristi se slično kao i taskset.
Primjeri
1. Postavljanje NUMA CPU afiniteta za cijeli fizički procesor (NUMA NODE). U ovom primjeru našem procesu ćemo dozvoliti kako bi se mogao pokretati na bilo kojoj CPU jezgri ali unutar jednog NUMA NODE-a (fizičkog procesora). S ovime smo osigurali pristup bilo kojoj CPU jezgri na jednom NUMA NODE-u pa smo sigurni kako će dohvaćanje RAM memorije biti uvijek lokalno tj. upotrebom memorijskog kontrolera ovog fizičkog procesora, bez potrebe za dohvaćenjem udaljene RAM memorije (ovu opciju smo osigurali prekidačem –localalloc).
U primjeru koji slijedi naš proces ćemo vezati za NUMA NODE-0 te će moći koristiti samo RAM memorjiu od tog fizičkog procesora
numactl --localalloc --cpunodebind=0 IME_PROGRAMA
Opis :
–localalloc zadaje alociranje samo NUMA lokalne RAM memorije (one koja pripada definiranom fizičkom procesoru)–cpunodebind= zadaje na kojem NUMA node-u (fizički procesor) se program smije izvršavati (to znači da može koristiti sve CPU jezgre na tom fizičkom procesoru).
Što je još moguće definirati ?
* –interleave=all s ovom opcijom uključujemo “Memory policy controll” mehanizam koji za razliku od –localalloc pokušava koristiti lokalnu RAM memoriju, sve dok je moguće, a tada počinje koristiti i udaljenu RAM memoriju (koja pripada udaljenom NUMA node - fizičkom CPU) i to korištenjem “Round robin” algoritma. Ovo je korisno ako znamo da naša aplikacija treba više RAM memorije nego je dostupno pojedinom fizičkom procesoru (NUMA node-u). Osim vrijednosti all , moguće je definirati i brojčanu oznaku NUMA node-ova. Drugi primjer upotrebe bi bio kod optimizacije I/O operacija na sustavima s 4 ili više NUMA node-ova (4P ili 8P sustavi) kada točno znamo koji I/O uređaj (disk kontroler, mrežna kartica ili sl.) fizički pripada kojem NUMA node-u. I ovdje vrijednosti mogu biti : pojedini NUMA node ID (0 ili 1 ili 2 ili) ili niz NUMA node ID-ova (0,1,2,3 ili 0,2 i sl.).
* –membind=Z s ovom opcijom je moguće definirati s kojg NUMA node-a će se koristiti RAM memorija. Z može biti broj NUMA node-a
* –physcpubind=Y s ovom opcijom možemo raditi finiju granulaciju, na kojim CPU jezgrama (unutar NUMA node-a (X) koji smo definirali s –cpunodebind=X) se određeni program može pokretati. Y može biti jezgra : poput 1 , ili niz jezgri poput 1,3,5,7 (odvojenih zarezom).
numad je linux daemon (servis) koji automatski prati NUMA topologiju i korištenje njenih resursa. numad može pomoći pri dinamičkoj raspodjeli resursa na način da prati iskorištavanje CPU jezgri za svaki pokrenuti proces. S obzirom da je on “svjestan” NUMA arhitekture on pokušava tako rasporediti procese (prema CPU jezgrama) da su uvijek u mogućnosti pristupiti podacima iz lokalne memorije te tako smanjiti latenciju.
Dakle on se brine o tome da svaki pokrenuti proces bude dodjeljen NUMA CPU jezgri unutar jednog NUMA NODE-a.
Sve što je potrebno je pokrenuti ovaj daemon/servis:
service numad start
A ako se nakon nekog vremena njegove upotrebe odlučimo kako bi se on automatski pokretao s pokretanjem sustava, dovoljno je napraviti slijedeće:
chkconfig numad on
Napomena
Ako je KSM u upotrebi na NUMA sustavu , promijenite vrijednost parametra :
/sys/kernel/mm/KSM/merge_nodes na 0 kako bi se izbjeglo spajanje stranica (misli se na Memory Pages) na NUMA NODE-ovima (čvorovima).
KSM daemon/servis se zove ksmtuned.
Inače, KSM tada može povećati latenciju jer će koristi pristup udaljenoj NUMA memoriji (na drugom fizičkom procesoru) i lokalnoj memoriji istovremeno, na način da koristi memorijske stranice (pogledajte poglavlje o RAM memoriji - Paging) i sa lokalno dostupne RAM memorije i sa NUMA udaljene memorije, unutar adresnog prostora istog procesa.
Osim toga, statistike o korištenju memorijskih stranica (Memory pages) koje vodi kernel, mogu postati kontradiktorne, nakon velikiog broja spajanja stranica u memoriji - koje se nalaze između NUMA NODE-ova.
Stoga kombinacija numad i KSM tj. ksmtuned daemona/servisa često nije baš najbolje riješenje.
U slučajevima korištenja Linux virtualizacije pomoću KVM i/ili QEMU, najbolji rezultati se postižu bez numad jer i KVM i QEMU imaju opcije za prepoznavanje i rad s NUMA arhitekturom.
S obzirom da je potrebno pratiti stanje sustava s vremena na vrijeme (ponekad i konstantno) važno je upoznati se s alatima koji su nam dostupni na Linuxu, za tu namjenu.
Svi alati koje ćemo spomenuti, mogu se koristiti i na SMP i NUMA sustavima.
Većinu naredbi koje ćemo spomenuti, koristiti ćemo na napredni način
Ovaj primjer smo već vidjeli za SMP sustav ali ćemo ga ipak ponoviti:
Prvo moramo naći PID našeg pokrenutog procesa/programa.
U našem primjeru radi se o programu imena kvm koji pokreće jedno virtualno računalo na našem poslužitelju, ali se može raditi o bilo kojem programu za koji znamo da koristi više niti u radu.
pidof kvm 4071
Pronašli smo da je PID (Process ID) 4071.
Za ovu potrebu, koristiti ćemo naredbu ps ali sa dodatnim parametrima, s kojima ćemo moći vidjeti sve što nas zanima o našem pokrenutom procesu:
ps -mo pid,tid,fname,user,psr -p 4071
PID TID COMMAND USER PSR
4071 - kvm root -
- 4071 - root 5
- 4096 - root 3
- 4097 - root 5
- 4098 - root 3
- 4100 - root 3
Vidimo da naš proces (PID 4071) ima više niti - pogledajte Thread ID (TID) : 4071, 4096, 4097, 4098 i 4100 koje su trenutno aktivne (možda ih ima i više ali trenutno nisu aktivne) te kako se neke od njih pokreću na CPU jezgri 5 a neke na CPU jezgri 3.
Svako pokretanje gore navedene naredbe očitava trenutno stanje - u djeliću sekunde kada smo pokrenuli naredbu.
Opis prekidača naredbe ps koje smo koristili :
-mo Ispiši niti (Thread) poslije procesa (m) te nakon toga slijede dodatne opcije (o)pid Ispiši PID (Process ID) trenutnog (našeg) procesatid Ispiši TID (Thread ID) (ID od svake niti) trenutnog (našeg) procesafname Ispiši ime pokrenutog procesa/programa (vidljivo u stupcu ispod “COMMAND”)user Ispiši ime korisnika koji je pokrenuo ovaj (naš) proces/programpsr Ispiši procesor (CPU jezgru) na kojoj se trenutno izvršava nit
Za dodatne primjere upotrebe naredbe pogledajte poglavlje ”Procesi“
Pogledajte i naredbu sar, u poglavlju Naredba "sar".
Naredba top osim standardnog rada, može nam prikazati stanje točno određenog procesa (prema PID-u).
Stoga ćemo naredbu top pokrenuti s prekidačem -p iza kojega mora slijediti PID od procesa koji pratimo:
top -p 4071
Sada ćemo dobiti klasični ekran naredbe top:
top - 11:10:10 up 112 days, 12:19, 1 user, load average: 0.08, 0.07, 0.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.1 us, 0.7 sy, 0.0 ni, 97.2 id, 1.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 98990200 total, 84836948 used, 14153252 free, 1342968 buffers
KiB Swap: 91488252 total, 39116 used, 91449136 free, 63898336 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4071 root 20 0 8737m 7.8g 4060 S 7.7 8.3 2246:53 kvm
1. Pritisnimo tipku f
2. Odaberite (“korsorskim” tipkama - strelice gore/dolje) - P = Last Used Cpu (SMP)
3. Stisnite razmak (Space) kada ste došli na polje P = Last Used Cpu (SMP) , pojaviti će se znak * ispred odabranog polja.
4. Stisnite tipku q
Sada ćemo dobiti novi prikaz:
top - 11:13:33 up 112 days, 12:22, 1 user, load average: 0.00, 0.03, 0.04
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.2 us, 0.5 sy, 0.0 ni, 97.1 id, 1.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 98990200 total, 84837136 used, 14153064 free, 1342968 buffers
KiB Swap: 91488252 total, 39116 used, 91449136 free, 63898568 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND P
4071 root 20 0 8737m 7.8g 4060 S 7.3 8.3 2247:12 kvm 5
Pogledajte donji red, zadnji stupac P, u kojemu je vidljiv broj trenutne CPU jezgre koja obrađuje naš proces (PID 4071).
Vidimo kako se na kraju (desno) pojavio stupac P ispod kojega se za naš proces prikazuje CPU jezgra koja ga trenutno obrađuje (pričekajte malo i vidjeti ćete kako se mijenja).
Iz programa top se Izlazi s tipkom q
Dodatno, moguće je pratiti i opterećenja pojedinih CPU jezgri, u stvarnom vremenu. Izađimo it programa top i pokrenimo ga pnovno:
top
Sada pritisnite broj 1 te će se prikaz promijeniti u prikaz opterećenja CPU jezgri:
top - 10:25:29 up 107 days, 23:08, 1 user, load average: 0.06, 0.07, 0.01
Tasks: 557 total, 1 running, 556 sleeping, 0 stopped, 0 zombie
%Cpu0 : 9.7 us, 1.3 sy, 0.0 ni, 89.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 2.3 us, 1.0 sy, 0.0 ni, 96.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 10.7 us, 2.7 sy, 0.0 ni, 85.3 id, 1.3 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 1.7 us, 1.3 sy, 0.0 ni, 97.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu4 : 0.7 us, 0.7 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu5 : 1.3 us, 0.3 sy, 0.0 ni, 98.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu6 : 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu7 : 2.8 us, 0.3 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 98989844 total, 86677952 used, 12311892 free, 1974044 buffers
KiB Swap: 91488252 total, 128660 used, 91359592 free, 62241620 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
489972 48 20 0 234m 126m 2596 S 18.2 0.1 0:19.97 ruby
634197 500 20 0 6568m 2.5g 6872 S 9.9 2.6 11189:50 java
3881 root 20 0 13.6g 13g 3828 S 4.0 13.8 6522:53 kvm
3842 root 20 0 208m 39m 4324 S 2.6 0.0 1347:25 pvestatd
2274 root 10 -10 305m 98m 5996 S 0.7 0.1 564:37.30 ovs-vswitchd
3168 root 20 0 355m 26m 25m S 0.7 0.0 405:51.43 pmxcfs
3289 root 0 -20 264m 62m 42m S 0.7 0.1 398:53.59 corosync
499278 root 20 0 23532 2008 1188 R 0.7 0.0 0:00.07 top
... ... ... ...
Ispis je skraćen zbog potrebe prikaza ali u gornjem dijelu slike, vidljivo je opterečenje prema CPU jezgrama: CPU0 - CPU7 (ovo je računalo sa 8 CPU jezgri).
Za dodatne primjere upotrebe naredbe pogledajte poglavlje ”Procesi“
Za druge primjere i opis naredbe top, pogledajte primjere u poglavlju Procesi - pod Primjer upotrebe top naredbe
Ova naredba ponekada nije instalirana na sustav. Ako nije instalirana, instalirajte ju:
yum install htop
Pokrenimo ju :
htop
Stisnite F2 ,odaberite (s kursorkim tipkama - strelice gore/dolje i ENTER) :
1. Idite na Setup
2. Potom dolje na Columns
3. Idite desno na Available Coumns i idite dolje te označite polje PROCESSOR (ENTER), kao na slici>
4. Stisnite tipku ESC
Sada ćete vidjeti statistike za sve procese, s time da će se s lijeve strane u prvom stupcu vidjeti i koja CPU jezgra se trenutno koristi za koji proces (stupac CPU), kao na slici:
U gornjem dijelu ekrana je vidljiva i grafička reprezentacija upotrebe svake CPU jezgre kao i RAM memorije.
U donjem dijelu su informacije o svakom pokrenutom procesu, slično kao kod naredbe top.
Naredba sar, dolazi nam u paketu sysstat, koji je ponekad potrebno instalirati. Ova naredba nam nudi praćenje raznih statistika sustava a mi ćemo se fokusirati na dio u kojemu možemo vidjeti opterećenja pojedinih CPU jezgri. Za ovu potrebu ćemo koristiti: sar -P ALL
Dodatno ćemo pratiti statistiku svake sekunde (1) i to četiri (4) puta za redom.
sar -P ALL 1 4 ... 12:00:01 AM CPU %user %nice %system %iowait %steal %idle 12:10:01 AM all 0.01 0.00 0.00 0.06 0.00 99.93 12:10:01 AM 0 0.00 0.00 0.00 0.12 0.00 99.87 12:10:01 AM 1 10.01 0.00 0.00 0.00 0.00 89.98 12:10:01 AM 2 0.00 0.00 0.00 0.12 0.00 99.87 12:10:01 AM 3 0.01 0.00 0.00 0.00 0.00 99.98 ...
Skratili smo ispis, ali vidljivo je ukupno opterećenje sve četiri (0-3) CPU jezgre, koje imamo na našem računalu.
Naredba vmstat se koristi za prikaz statistika sustava virtualne memorije te dolazi u paketu sysstat. Međutim postoji i mala poveznica između sustava virtualne memorije, diskovnog podsustava i opterećenja CPUa. Kako ovdje govorimo o CPUu, pogledati ćemo i što nam ova naredba prikazuje, sa strane CPUa.
Za praćenje stanja diskovnog podsustava, pogledajte poglavlje: Praćenje performansi I/O sustava .
Prvo ćemo pokrenuti ovu naredbu, i to tako da se statistike prikupljaju svake dvije sekunde (2) i to pet puta za redom (5). Dodatno želimo ispis u MB (-S M prekidač):
vmstat -S M 2 5 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 1 10 13327 1939 61073 0 0 13 15 3 2 2 1 97 0 1 1 10 13327 1939 61073 0 0 8 13 19423 37877 1 1 98 1 0 1 10 13327 1939 61073 0 0 8 15 19201 37557 1 1 98 1 0 1 10 13327 1939 61073 0 0 8 1 19250 37555 1 1 98 1 1 1 10 13327 1939 61073 0 0 8 9 19836 38788 3 1 95 1
U ispisu ćemo se bazirati na stupcu –cpu–, u kojemu se prikazuju statistike vezane za opterećenje CPUa. Ovdje imamo četiri podstupca:
us - procesorsko (CPU) vrijeme koje se troši (CPU resursi) na obradu aplikacija na razini korisnika (ne na kernel razini)sy - - procesorsko (CPU) vrijeme koje se troši (CPU resursi) na obradu kernel zahtjeva i procesa na razini kernela (kernel threadovi primjerice)id - je takozvano idle vrijeme - kada je CPU neaktivan (kada/koliko ništa ne radi)wa - je takozvano waiting for IO vrijeme, koje označava koliko CPU čeka na I/O (ulazne ili izlazne) operacije prema diskovnom sustavu. Visoke vrijednosti ovog polja indiciraju kako je diskovni sustav preopterećen zapisivanjem ili čitanjem te da sustav (CPU) mora čekati prije nego išta zapiše ili pročita s diska.
Kod virtualnih računala se pojavljuje još jedan podstupac u CPU stupcu:
st - ovo je vrijeme ukradeno od CPUa virtualnog računala. Ukradeno od strane Hypervizora u slučajevima kada je Hypervizor preopterećen.
Linux se sastoji od sljedećih komponenti:
* Kernela odnosno jezgre operacijskog sustava, a koji sadrži:
* Razvojnog okruženja, koje se sastoji od:
* Korisničkog sučelja (Engl. User interface):
Logička shema rada Unix/Linux-a je vidljiva na slici:
Naredbeni redak (Shell), kao i svi programi, komuniciraju s linux kernelom, preko sistemskih poziva.
Kernel, dalje, preko svojih upravljačkih programa pristupa svom hardveru (disk kontroleri i diskovi, grafička, mrežna i druge kartice).
Dakle svaki program, pa tako i shell, preko sistemskih poziva, šalje određene naredbe kernelu. U trenutku kada primjerice iz našeg shella želimo pokrenuti neku naredbu, šalju se sistemski pozivi za pokretanje te naredbe (procesa). Kada se naredba pokrene (od strane kernela) i mora nešto zapisivati na disk, ponovno se šalju sistemski pozivi za pristup disku i tako dalje.
Linux kernel je jezgra operacijskog sustava Linux.
Linux kernel je zadužen za :
Linux je baziran na Linux kernelu i nizu sistemskih i drugih programa potrebnih za rad. Linux kernel koriste i razni uređaji poput usmjerivača, uređaja za pohranu podataka (engl. NAS ili SAN), Vetrozidi (engl. Firewalls) i drugi specijalizirani uređaji, poput pametnih mobitela ili satova.
Linux kernel je inicijalno razvio student računalnih znanosti, Helsinškog Sveučilišta iz Finske : Linus Tovalds u toku 1991 godine, za svoje osobno računalo.
Ovo je vijest koju je 25.8.1991 Linus Torvalds poslao na “News” grupu: “comp.os.minix”
I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since April, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things). ... ... ...
Vrlo brzo nakon ove vijesti dodani su i razni sistemski i pomoćni programi iz GNU projekta, te je nastao Linux operacijski sustav.
Već u 12.mj. 1991 izašla je prva verzija Linuxa : 0.11
Ubrzo nakon što je javno objavljen izvorni kod Linux kernela, kernel je prihvačala sve veća i veća zajednica ljudi te se počeo razvijati i za druge arhitekture procesora (ARM, MIPS, SPARC, …).
Danas ga aktivno razvija zajednica od nekih 12 000 aktivnih programera a od toga je aktivno i oko 1 200 tvrtki, od proizvođača hardvera do softverskih divova.
Slika prikazuje osnovnu logičku shemu rada Linuxa:
Linux kernelu se pristupa preko kernel API poziva (engl. Application Programming Interface) preko kojih aplikacije imaju interakciju s kernelom.
U osnovnoj funkcionalnosti Linux kernel uključuje upravljačke programe za raznovrstan hardver:
Upravljački programi, u Linux terminologiji znani kao kernel moduli, mogu biti ugrađeni u kernel koji koristimo i/ili mogu biti kao zasebni upravljački programi, koje možemo pozivati prema potrebi (engl. Loadable Kernel Modules (LKMs)). Dodatno, kernel moduli ne moraju isključivo samo imati funkcionalnost upravljačkih programa, već mogu imati bilo koju drugu funkcionalnost, poput funkcionalnosti vatrozida, nekog dodatnog mrežnog protokola ili funkcionalnosti, funkcionalnosti dijela datotečnog sustava i sl.
Službena maskota Linuxa je pingvin “Tux”:
Pogledajmo sada Linux kernel malo detaljnije:
Vidljivo je kako se kernel nalazi između aplikacija i hardvera (CPU, RAM, tvrdi disk, mreža , …). On je zadužen za rad cijelog operacijskog sustava i svih njegovih procesa (programa/aplikacija).
Sam kernel se sastoji od nekoliko logičkih cjelina:
Memory Manager je zadužen za sve operacije koje se tiću rada s virtualnom memorijom. Dakle svaki pristup, bilo da se radi o čitanju ili zapisivanju u RAM memoriju ili Swap disku kao proširenju RAM memorije, kao i dijeljenju memorije između procesa uz sve zaštitine mehanizmi, prolaze kroz ovu komponentu. Više o memory manageru i virtualnoj memoriji pogledajte u poglavlju ”Memory management u Linuxu“.Inter Process Manager je zapravo logički najviše povezan sa Memory managerom i on je zadužen za komunikaciju između procesa, kao i dio funkcionalnosti dijeljenja memorije između procesa. Osim toga njemu pristupa i Proces Management & Scheduler za kontrolu i upravljanje procesima.Proces Management & Scheduler je zadužen za cijeli životni ciklus svakog procesa. Proces management znan i kao “proces scheduler” odnosno “task scheduler”, pokreće svaki program (proces), brine se o njegovom prioritetu i nitima (engl. Thread) unutar procesa te prati i upravlja svakim procesom od početka do kraja. Za više detalja pogledajte cijelo poglavlje ”Procesi“. S obzirom na njegovu funkcionalnost on komunicira s CPUom i njegovim registrimaVirtual FIlesystem (VFS) komponenta je jednim dijelom zadužena za pristup Virtualnoj memoriji te je također najviše povezana i isprepletena s Memory managerom. Njena druga unutarnja komponenta je zadužena za komunikaciju s datotečnim sustavom. I u konačnici ona kroz I/O sustav komunicira (na slici prema dolje) preko upravljačkih programa s disk kontrolerima i tvrdim diskovima. Za više detalja o ovoj komponenti pogledajte poglavlje ”Napredno: Diskovni (I/O) podsustav“I/O Interface je zadužen za ulazno izlazni pristup (Engl. I/O) raznim uređajima bilo fizičkim ili logičkim (Disk okntroler/disk, blok uređaji, “character” uređaji , …).Virtual Network komponenta je zadužena za rad s mrežom odnosno za svu mrežnu komunikaciju, preko I/O sustava, do upravljačkih programa za mrežne kartice.Sve navedene komponente imaju komunikaciju s vanjskim svijetom, preko sistemskih poziva prema procesima/programima/aplikacijama a s druge strane direktnu vezu s hardverom, preko upravljačkih programa (Linux kernel modula).
Pogledajmo logičku shemu linux kernela i njegovih osnovnih komponenti:
Sada ćemo se fokusirati na donji dio gornje slike, odnosno na dio sa kernel modulima:
Vidljivo je kako su u grubo kernel moduli podijeljenji u dvije kategorije:
Za one kernel module koji su zapravo upravljački programi, imamo više kategorija, odnosno po jednu kategoriju za svaki pojedini uređaj, pa tako imamo (skratili smo listu i sliku zbog lakšeg razumijevanja):
CPU - podrška za CPU i večinu njegovih komponenti se već nalazi unutar kernela, dok su upravljački programi za neke komponente CPUa, dostupne kao vanjski kernel moduli, poput ovih koje smo naveli:procesor daje nam ACPI (Advanced Configuration and Power Interface) funkcionalnosti CPUaaesni-intel - daje nam (za Intel CPU) hardversku akceleraciju AES kriptografskih funkcija, koje su ugrađene u CPUrng-core - - daje nam hardversku akceleraciju funkcija generiranja slučajnih brojeva, koja je ugrađena u CPUChipset - ovdje se nalaze razne komponente chipseta, poput pcieport - upravljački program za PCI Express sabirnicu, ovaj modul je često unutar samog kernelauhci_hcd i ehci_hcd - ovo su upravljački programi za USB kontrolereagpgart-intel je upravljački program za AGP sabirnicui801_smbus je upravljački program za SMBUS (System Management Bus) sabirnicuDisk kontroleri - ovdje se nalaze upravljački programi za razne disk kontrolere (Pr. ATA/SATA/SCSI/SAS …)ata_piix je upravljački program za (P)ATA i SATA disk kontrolere (Pr. Intel: PIIX3/4, ICH/2/3/4/5/6/7/8/9/10, …)hpsa je upravljački program za Smart Array RAID kontrolere (P212/410/411/700M/712m/…), tvrtke HPmegaraid_sas je upravljački program za Mega RAID SAS RAID kontrolere (1078/2108/2008/2208/…) tvrtke LSIMrežne kartice - u ovom dijelu su upravljački programi za razne mrežne karticee1000e je upravljački program za 1Gbps mrežne kartice (82571, 82572, 82573, 82574, 82583, ICH8, ICH9, ICH10, PCH, PCH2, I217, I218, I21) tvrtke Inteltg3 je upravljački program za 1Gbps mrežne kartice (BCM 57xx) tvrtke Broadcomigb je upravljački program za 1Gbps mrežne kartice (82575, 82576, 82580, I210, I211, I350, I354, DH89xx) tvrtke IntelDruga kategorija su kernel moduli koji nisu upravljački programi a daju nam određene funkcionalnosti. Pogledajmo ih prema logičkim kategorijama, kojima pripadaju:
Diskovni podsustav - u ovoj kategoriji su kernel moduli koji su zaduženi za određene funkcionalnosti diskovnog podsustava. Za detalje o diskovnom podsustavu, pogledajte poglavlje: Napredno: Diskovni (I/O) podsustav i to cjelinu: “Dolazimo do nižih slojeva”. Ukratko u priči o kernel modulima i diskovnom podsustavu, kernel moduli koji su vidljivi ovdje, brinu se o cjelini, koja je logički iznad upravljačkih programa, pa se brine o:libata je kernel modul zadužen za pristup ATA funkcionalnostima i vrsti disk kontrolera, preko ATA upravljačkih programa (kernel modula)sd je vršni kernel modul koji je zadužen za pristup SCSI funkcionalnostima, preko SAS/SATA/ACSI upravljačkih programa (kernel modula). U tu kategoriju pripadaju i SAS i SATA disk kontroleri odnosno u konačnici diskovi. sg je također SCSI međusloj za komunikaciju pomoću SCSI naredbi, prema i od diskovnog sustavaDatotečni sustavi - u ovoj kategoriji su kernelm oduli koji su odgovorni za određene funkcionalnosti datotečnih sustava. Naime dio funkcionalnosti datotečnih sustava, koji može biti što bliže kernelu (zbog brzine rada), izrađuje se kao kernel modul, dok se drugi dio funkcionalnosti odrađuje na višoj razini operacijskog sustava . Ovdje nalazimo kernel module poput:ext3 ili ext4 - ovo su standardni Linux datotečni sustavi odnosno dio njihovih funkcionalnostixfs je dio dio funkcionalnosti XFS datotečnog sustava, kao što je zfs dio funkcionalnosti ZFS datotečnog sustavacifs i nfs su funkcionalnosti za mrežne datotečne sustave, redom za Windows SMB/CIFS protokol te za Unix/Linux NFS protokol.Mrežni protokoli i funkcionalnosti - ovdje imamo kernel module koji odrađuju funkcionalnosti raznih mrežnih protokola ili posebnih mrežnih funkcija, poput:8021q - ovaj kernel modul odrađuje funkcionalnosti potrebne za rad sa standardom 802.1Q, odnosno za rada s Virtualnim LAN mrežama (VLAN)bonding je kernel modul koji odrađuje funkcionalnost agregiranja mrežnih kartica, koje je još poznato pod imenima: Teaming, Bonding ili Link aggregation, koji podržava nekoliko protokola: LACP (802.3ad), balance-rr, active-backup, balance-xor, balance-tlb, balance-alb, …bridge - kernel modul zadužen za bridge funkcionalnostiip_tables je osnovni kernel modul zadužen za linux firewall mogućnosti, a koji za neke dodatne funkcionalnosti treba i druge module, poput:ip_table_nat - zadužen za NAT funkcionalnostnf_conntrack - zadužen za napredne funkcionalnosti praćenja stanja svake mrežne konekcijeDruge funkcionalnosti - ovdje su navedene neke od drugih funkcionalnostiedac_core zadužen je za EDAC (Error Detection And Correction) funkcionalnost unutar MMU dijela CPUa, a oslanja se na upravljački program za EDAC chip (ovo je zapravo dio MMU dijela CPUa)ac je zadužen za ACPI AC adapter- dio za napajanje (paljenje,gašenje i slično)fan je zadužen za mjerenja i kontrolu sistemskih ventilatora (preko ACPI funkcija)
Linux kernel je datoteka koja se nalazi na datotečnom sustavu u Linuxu.
Ona se nalazi unutar /boot direktorija.
Ta datoteka uglavnom ima ime oblika :
vmlinuz-VERZIJALINUXA
Kako to konkretno izgleda ?.
Ako je verzija kernela koji je pokrenut: 2.6.32-573.3.1.el6.x86_64 tada će kernel datoteka imati ime :
/boot/vmlinuz-2.6.32-573.3.1.el6.x86_64
Danas su u upotrebi sljedeće generacije Linux kernela
Unutar svake generacije razvijaju se razne podverzije o kojih se neke starije slabije razvijaju i održavaju dok se daje naglasak na novije. Zbog toga je unutar svake generacije odlučeno kako se određene podverzije proglase dugoročnim ili tkzv. LTS (engl. Long Term Support) verzijama.
Na tim “dugoročnim” verzijama su bazirane razne poslužiteljske verzije mnogih distribucija Linuxa. Naime poslužitelji se ne reinstaliraju svako malo u večini slučajeva jer želimo pouzdan i provjeren sustav na kojemu se neće svaki tren mijenjati krucijalni dijelovi sustava, koji bi mogli uzrokovati razne nestabilnosti i druge probleme.
Zbog toga je potrebno neko dugoročno rješenje za višegodišnje sigurne i pouzdane zakrpe i poboljšanja za takve verzije Linuxa. Upravo zbog toga i postoje LTS verzije Linux kernela.
Dugoročno podržane verzije linux kernela 1) su :
Provjerimo koju verziju Linux kernale imamo na račnualu s nardbom uname -r
uname -r 2.6.32-573.3.1.el6.x86_64
Što to znači :
Ako želimo vidjeti koji su sve kernel moduli odnosno upravljački programi/driveri učitani, pokrenimo naredbu lsmod
Ovo se odnosi na one kernel module koji nisu bili kompile-irani direktno u kernel već su učitani naknadno u procesu podizanja operacijskog sustava.
Pogledajmo što je sve učitano (ispis je skraćen za potrebe razumjevanja).
lsmod Module Size Used by iptable_filter 2793 1 ip_tables 17831 2 iptable_filter parport_pc 22658 0 parport 36209 2 parport_pc e1000e 230782 0 ext4 378683 1 cdrom 39085 1 sr_mod ata_piix 24409 2 pata_acpi 3701 0 ata_generic 3837 0 i915 1015889 2 video 21654 1 i915 output 2409 1 video ... ... ...
Objasniti ćemo samo nekoliko kernel modula s liste. S lijeve strane (Module) je ime kernel modula a s desne strane (Used by) je vidljivo koji drugi kernel modul ga koristi (ako jedan modul ovisi o drugom.
ip_tables je podrška za Linux firewallparport je upravljački program za paralelni port na računalue1000e je upravljački program za intelovu Gigabitnu mrežnu karticuext4 je upravljački program koji donosi podršku za Linux ext4 dattotečni sustavcdrom je upravljački program koji donosi podršku za CD/DVD-ROM uređajeata_piix i pata_acpi su upravljački programi za disk kontrolere (SCSI/ATA/PATA)i915 je pravljački program za Intel i915 integriranu grafičku karticuvideo i output su upravljački programi koji koriste grafičke kartice - u ovom slučaju :Intel i915
Kernel moduli se nalaze unutar direktorija /lib/modules/ unutar poddirektorija čije ime je jednako trenutnoj aktivnoj verziji kernela.
Iz ovoga je jasno da je moguće imati više verzija Linux kernela od kojih je samo jedna aktivna (ona u trenutnoj upotrebi)
Ako je naša trenutno aktivna verzija kernela :
uname -r 2.6.32-573.3.1.el6.x86_64
Tada se kernel moduli nalaze unutar sljedećeg direktorija:
/lib/modules/2.6.32-573.3.1.el6.x86_64 točnije : /lib/modules/2.6.32-573.3.1.el6.x86_64/kernel/
Za više informacija o pojedinom kernel modulu, pogledajte stranicu: https://www.kernel.org/doc/Documentation/. Kategorije su identične onima koje imate unutar svog /lib/module/KERNEL/kernel/ direktorija
Kao što smo rekli sam kernel može imati već unutar sebe kernel module (to su zapravo upravljački programi za hardver ili tkzv. “driveri”).
Spomenuli smo kako se sam kernel (mislim na datoteku), nalazi unutar /boot/ direktorija.
Unutar istog direktorija se nalazi i datoteka u kojoj su definirane sve funkcionalnosti i upravljački programi (kernel moduli), s kojima je kompajliran konkretan kernel.
Dakle ako je naš kernel : 2.6.32-573.3.1.el6.x86_64 tada je sam kernel zapravo datoteka:
/boot/vmlinuz-2.6.32-573.3.1.el6.x86_64
Na istoj putanji ( unutar /boot direktorija) nalazi se i spomenuta datoteka, koja ima ime po principu:
config-VERZIJAKERNELA , u našem slučaju to je :
/boot/config-2.6.32-573.3.1.el6.x86_64.
Unutar te datoteke su navedene sve funkcionalnosti i kernel moduli koje je moguće koristiti (ili ne koristiti) i to na nekoliko načina:
Kako to izgleda ?
Pogledajmo jedan manji dio ove datoteke:
CONFIG_X86_64=y CONFIG_X86=y ... ... ... # # SCSI device support # CONFIG_SCSI=y ... ... ... # # SCSI Transports # CONFIG_SCSI_AACRAID=m CONFIG_SCSI_AIC7XXX=m CONFIG_SCSI_AIC79XX=m ... ... ... CONFIG_ATA_ACPI=y CONFIG_SATA_AHCI=m CONFIG_ATA_PIIX=m ... ... ... # # USB Network Adapters # CONFIG_USB_RTL8150=m CONFIG_USB_NET_AX8817X=m ... ... ... # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_SERIAL=m ... ... ...
Vidljivo je da su neki kernel moduli ili funkcionalnosti uključene direktno u kernel a neke su dostupne kao kernel moduli.
Svi parametri koji imaju vrijednost =y su uključeni direktno u kernel. Ovo znači da su kompajlirani zajedno s kernelom i nalaze se u samom kernelu (u našem slučaju unutar datoteke /etc/vmlinuz-2.6.32-573.3.1.el6.x86_64 koja je Linux kernel)
Svi parametri koji imaju vrijednost =m su dostupni kao kernel moduli na disku i mogu se učitavati prema potrebi.
Informacije o nekom kernel modulu dobivamo s naredbom modinfo.
Recimo da nas zanima kernel modul za USB Ethernet (RJ-45) karticu baziranu na chipu Asix AX88772B, kernel modul je asix.
Ovo nas zanima jer smo kupili USB mrežnu karticu te želimo učitati njen upravljački program (kernel modul), kako bi uopće radila.
modinfo asix filename: /lib/modules/2.6.32-573.3.1.el6.x86_64/kernel/drivers/net/usb/asix.ko license: GPL description: ASIX AX8817X based USB 2.0 Ethernet Devices author: David Hollis srcversion: 41AB1B1334631410071EA9C alias: usb:v17EFp7203d*dc*dsc*dp*ic*isc*ip* ... ... ... depends: mii,usbnet vermagic: 2.6.32-573.3.1.el6.x86_64 SMP mod_unload modversions
Sada možemo vidjeti gdje se točno ovaj kernel modul (datoteka) nalazi, a što je vidljivo u prvom redu - sa filename:, te dali ovisi o nekom drugom kernel modulu. Što je opet vidljivo u depends:. Naime za neke kernel module je potrebno da se neki dugi kernel moduli učitaju prije njih, za što se kaže da za njih postoji neka ovisnost o drugim modulima (Engl. dependencies).
U našem slučaju, vidljivo je kako se prije njega moraju učitati kernel moduli mii i usbnet
Ovdje je još vidljivo i to kako se ovaj kernel modul zove asix.ko.
Naime svi Linux kernel moduli imaju ekstenziju .ko koja znači ”Kernel Object“.
Dodatno, za kernel module koji to dozvoljavaju, moguće im je poslati i neke parametre. Kako bi provjerili koje sve parametre podržava određeni kernel modul, to možemo saznati pomoću naredbe modinfo -p. Pogledajmo primjer za kernel modul e1000e - za određene Intelove gigabitne mrežne kartice (jer on konkretni podržava razne, dodatne parametre rada).
modinfo -p e1000e debug:Debug level (0=none,...,16=all) (int) copybreak:Maximum size of packet that is copied to a new buffer on receive (uint) TxIntDelay:Transmit Interrupt Delay (array of int) TxAbsIntDelay:Transmit Absolute Interrupt Delay (array of int) RxIntDelay:Receive Interrupt Delay (array of int) RxAbsIntDelay:Receive Absolute Interrupt Delay (array of int) InterruptThrottleRate:Interrupt Throttling Rate (array of int) IntMode:Interrupt Mode (array of int) SmartPowerDownEnable:Enable PHY smart power down (array of int) KumeranLockLoss:Enable Kumeran lock loss workaround (array of int) WriteProtectNVM:Write-protect NVM [WARNING: disabling this can lead to corrupted NVM] (array of int) CrcStripping:Enable CRC Stripping, disable if your BMC needs the CRC (array of int)
Parametri koji su trenutno postavljeni vidljivi su unutar /proc/ datotečnog sustava. Konkretno, za e1000e modul, unutar direktorija: /sys/module/e1000e/parameters/ i to jedna datoteka za jedan parametar. Dakle putanje je: /sys/module/IME-KERNEL-MODULA/parameters/.
Čisto za informaciju, nakon kompiliranja kernela, kreira se i datoteka imena: modules.dep u koju se zapisuju svi međusobne ovisnosti kernel modula (dependencies), Ova datoteke se nalazi u direktoriju: /lib/modules/VERZIJA-KERNELA/
U slučaju da ste nešto nehotice promijenili na datoteci modules.dep, te vam recimo sustav nakon prvog restarta ne radi kako treba, a što se može dogoditi jer ne može učitati dependencies module pa samim time i one koji dodatno ovise o njima, kao i one vršne, postoji jednostavno rješenje. Naime tijekom kompiliranja kernela kreira se i posebna tablica sistemskih simbola, koja se snima u datoteku imena: System.map-VERZIJA-KERNELA a koja se i kod instalacije novog kernela, kopira s kernelom u direktorij /boot/, u koji se obično kopira i sam kernel. Ova datoteka je dostupna pomoću poveznice: /boot/System.map-$(uname -r). U ovoj tablici simbola se nalazi sve potrebno kako bi se ponovno, za trenutno aktivni kernel, kreirala datoteka s tablicom ovisnosti kernel modula odnosno: modules.dep datoteka.
Slijedećom naredbom možemo ponovno kreirati datoteku modules.dep:
depmod -F /boot/System.map-$(uname -r)
Napredno
Kako ispisati listu svih dostupnih kernel modula na našem Linuxu.
S obzirom kako znamo lokaciju (putanju) na kojoj se nalaze svi kernel moduli (iako su grupirani u poddirektorije), možemo iz izlistati na jednostavan način:
ls -R /lib/modules/$(uname -r) ... ... ...
Što radi ova naredba :
ls -R rekurzivno izlistava sve direktorije i poddirektorije te sve datoteke unutar njih
/lib/modules/ je početna putanja odakle treba krenuti s izlistanjem, proširena sa :
$(uname -r) koji nam daje točnu verziju linux kernela koja je aktivna.
Ono što će zapravo Linux pokrenuti (u našem slučaju) je :
ls -R /lib/modules/2.6.32-573.3.1.el6.x86_64 ... ... ...
Sada smo dobili potpuno izlistanje.
Možemo sve i filtrirati, kako bi izvukli samo imena .ko datoteka (grep naredba), a potom da maknemo ekstenziju .ko (cut naredba) te sve poredamo po abecedi (sort naredba).
ls -R /lib/modules/$(uname -r) | grep "\.ko" | cut -f1 -d"." | sort ... ... ...
Postoje dvije metode ručnog učitavanja kernel modula, odnosno dvije naredbe za tu namjenu.
insmod naredba učitava navedeni kernel modul ali se ne brine o tome dali taj kenrel modul za rad traži prethodno učitavanje drugog kernel modula (tkzv. Dependency check).modprobe je slična kao i prethodna naredba s time da ona prije pokušaja učitavanja kernel modula provjerava da li je potrebno prethodno učitati neke druge kernel module, te ih ona učita (koliko go ih bilo) te na kraju učitava i naš kernel modul
U našem primjeru spajanja nove USB mrežne kartice, poput ove na slici, koja koristi ASIX AX88772B chip, za koju je potrebno učitati kernel modul (driver) asix ali i prije toga učitati kernel module (ako već nisu učitani) mii i usbnet, koristiti ćemo naredbu modprobe.
To izgleda ovako:
modprobe asix
Sada možemo provjeriti da li su se učitali svi potrebni kernel moduli:
lsmod |grep asix asix 15796 0 usbnet 36510 1 asix mii 5376 2 asix,usbnet
Vidimo da su se prvo učitali kernel moduli mii i usbnet te potom i asix.
usbnet koristi kernel modul asixmii koristi kernel module asix i usbnet
Sve je u redu, naša nova USB mrežna kartica bi sada trebala raditi i biti vidljiva kao neki od ethxy portova.
Kako smo vidjeli u cjelini od maloprije, određeni kernel moduli daju nam mogućnost da im definiramo određene parametre.
To je moguće napraviti na dva načina:
1. Ručno, u tijeku ručnog učitavanja kernel modula, prema principu:
modprobe IME-MODULA IME-PARAMETRA=VRIJEDNOST-PARAMETRA
Za upravljački program za intelovu pro 1000 mrežnu karticu (kernel modul e1000e). To bi moglo izgledati ovako (ako želimo povećati posebni buffer (copybrake)):
modprobe e1000e copybreak=256
Samo za informaciju: isti kernel modul, daje nam i druge korisne opcije, recimo poput promijene rada sa signalima prekida (interrupta). Ova opcija se za ovaj kernel modul zove: IntMode te nudi tri vrijednosti:
0 - rad sa klasičnim interruptima1 - rad sa MSI interruptima2 - rad sa MSI-X interruptima
Za provjeru možete pogledati kako se koriste interrupti (cat /proc/interrupts) ili poglavlje o interruptima.
Gore navedene primjere ne testirajte za sustavima u aktivnoj upotrebi !.
2. Moguće je željene parametre pohraniti u datoteci, koja će se čitati u tijeku inicijalizacije kernel modula. Ova datoteka, mora se nalaziti u direktoriju: /etc/modprobe.d/. Pravilo je da se za svaki kernel modul, za koji želimo trajno postaviti neku opciju, kreiramo datoteku, imena istog kao i kernel modul, ali sa nastavkom .conf.
U gore navedenom slučaju bi morali kreirati datoteku imena:
/etc/modprobe.d/e1000e.conf, a koja bi sadržavala (za prvi primjer od gore):
options e1000e copybreak=256
Dakle počinje se sa ključnom riječi options, nakon koje slijedi ime kernel modula te dio sa parametrom i njegovom vrijednosti, koju želimo trajno postaviti.
Druge opcije unutar datoteka, koje se nalaze u direktoriju: /etc/modprobe.d/
U gore navedenom direktoriju, moguće je kreirati i datoteke koje će imati drugu namjenu, osim dodavanja parametara kernel modulima, u trenutku pokretanja cijelog operativnog sustava. Moguće je :
alias iza koje slijedi skraćeno ime modula a potom stvarno ime kernel modula. Naime aliasi za kernel module su skraćena imena kernel modula, koja se također mogu koristiti, zbog lakšeg snalaženja. To može izgledati ovako:alias gre0 ip_gre
Pri čemu je gre0 alias na pravi kernel modul imena ip_gre (ovaj konkretni modul se koristi za neke VPN tunele)
blacklist nakon koje mora slijediti ime kernel module za koji NE ŽELIMO DA SE UČITA u trenutku pokretanja operativnog sustava. Pogledajmo jedan primjer, u kojemu ne želimo učitavanje kenrel modula zaduženog za rad PC zvučnika (onog koji se nalazi u kučištu ili matičnoj ploči):blacklist pcspkr
Sve aliase i blaclistane kernel module možemo izlistati s naredbom: modprobe -c.
Automatsko učitavanje kernel modula se u većini slučajeva odvija bez intervencije korisnika, jer se kod prepoznavanja novog hardvera udev servis/daemon brine o tome kako bi se učitao svaki potrebni kernel modul (driver). Međutim u nekim slučajevima, to moramo ili želimo napraviti sami.
Dodatno, u slučajevima kada želimo automatsko učitavanje kernel modula, koji mogu i ne moraju biti upravljački programi, već dodatne funkcionalnosti, tada unutar direktorija /etc/modprobe.d/, također možemo kreirati običnu tekstualnu datoteku ekstenzije .conf i u nju ubacivati, red po red, željene kernel module, a za koje želimo da se učitavaju tijekom pokretanja operativnog sustava.
Za primjer, možemo kreirati datoteku: /etc/modprobe.d/nasi-moduli.conf i u nju prvo dodati primjerice upravljački program za našu ASIX USB mrežnu karticu:
# USB Mrezna asix
Potom u novi red možemo dodati modul za recimo Linux firewall (iptables) a pomoću kojega ćemo dobiti linux firewall funkcionalnosti:
# Mrezni firewall ip_tables
Redovi koji počinju sa znakom #, se ignoriraju, odnosno služe samo kako komentar.
U RedHat baziranim linuxima, postoji još jedan direktorij, u koji možemo ubacivati datoteke, koje sadrže kernel modul, za koje želimo da se učitaju tijekom pokretanja operacijskog sustava ali prema principu shell skripte. Radi se o direktoriju: /etc/sysconfig/modules/ u kojemu možemo kreirati datoteku bilo kojeg imena, ali ekstenzije: .modules.
Ova datoteka mora zadovoljiti par uvjeta:
#!/bin/bashcd /etc/sysconfig/modules/ chmod +x IME-DATOTEKE.modules
Dakle ova datoteka može izgledati ovako (ako u nju želimo upisati iste stvari kao iz primjera gore):
#!/bin/bash # Ucitivamo USB ASIX mreznu karticu (driver) /sbin/modprobe asix # Ucitivamo kernel modul za firewall /sbin/modprobe ip_tables
U ovom direktoriju (/etc/sysconfig/modules/) kreiramo datoteke samo ako želimo postaviti neke uvjete, petlje ili slično, koje možemo riješiti samo sa shell skriptom, a ne samo učitavati kernel module (kao na primjeru). Naime standardno mjesto za samo učitavanje kernel modula je direktorij: /etc/modprobe.d/
Dakle konkretan primjer upotrebe bi mogao biti:
#!/bin/bash
if [ ! -c /dev/input/uinput ] ; then
exec /sbin/modprobe uinput >/dev/null 2>&1
fi
U ovom primjeru se provjerava da li postoji uređaj: /dev/input/uinput, a ako ne postoji tada se pokreće naredba:
/sbin/modprobe uinput koja učitava kernel modul imena uinput.
Ako nam nedostaje neki upvaljački program, moguće je nači izvorni kod upravljačkog programa te ga kompajlirati i instalirati. Sada nećemo objašnjavati ovaj proces ali u slučaju da ste to napravili, novi upravljački program tj. kernel modul će se sam ubaciti negdje unutar strukture direktorija /lib/modules/$(uname -r)/ te će se upisati/nadodati u datoteku : /lib/modules/$(uname -r)/modules.dep. Ova datoteka je zapravo samo lista s popisom kernel modula i njihovom putanjom.
U slučaju da smo recimo morali kompajlirati i dodati kernel modul asix.ko on bi dodao ovaku liniju u datoteku:
/lib/modules/$(uname -r)/modules.dep
kernel/drivers/net/usb/asix.ko: kernel/drivers/net/usb/usbnet.ko kernel/drivers/net/mii.ko
Vidljivo je da osim putanje do samog kernel modula, slijede putanje do kernel modula o kojima ovisi (koji se moraču učitati prije njega)
Nakon toga potrebno je osvježiti bazu kernel modula sa naredbom:
depmod -a
I to je to, novi kernel modul je spreman za korištenje.
U svakom Unix (Linux) operacijskom sustavu, gotovo sve stvari, odrađuju se korištenjem neke datoteke. Čak se i pristup i rad s raznim uređajima, odrađuje preko posebnih datoteka, koje ih indirektno predstavljaju.
Kako ćemo nešto kasnije naučiti, osnovne vrste datoteka u Linuxu, mogu biti:
characterblock Pipe i Named PipeSocketsimbolićki link
Pogledajmo i logičku shemu ovog sustava, na primjeru upotrebe programa za formatiranje (mkfs.ext4) prve particije diska sdb: dakle /dev/sdb1:
Naredba koju izvršavamo:
mkfs.ext4 /dev/sdb1
S gore navedenom naredbom formatirati ćemo prvu particiju na prvom SATA (može biti i SCSI ili SAS vrsta diska) tvrdom disku, a koji je u linuxu vidljiv kao posebna datoteka: /dev/sdb odnosno njegova prva particija je vidljiva kao posebna datoteka/dev/sdb1.
Kako logički izgleda pozivanje naše naredbe:
Dolje u tekstu ćemo govoriti o ovoj posebnoj vrsti datoteka, u /dev/ direktoriju, a koje predstavljaju hardverske uređaje, te ćemo se ukratko upoznali i sa linux uređajima (Engl. devices). Pod linux uređajima (linux devices) podrazumijevamo posebne datoteke koje preko upravljačkih programa direktno pristupaju određenom hardveru odnosno fizičkim uređajima našeg računala. Naime uređaje u Linuxu, predstavljaju ove posebne datoteke koje se nalaze unutar /dev/ direktorija. Ove datoteke prema načinu rada, odnosno načinu pristupa samom hardveru, mogu raditi na dva načina :
character datoteke, koje od i prema uređajima šalju ili primaju podatke u nizu charactera odnosno znakova iliblock datoteke, koje od i prema uređajima šalju ili primaju podatke u blokovima podataka. Stoga se i uređaji koji ih koriste zovu blok uređaji
Upoznajmo se s nekoliko osnovnih kategorija uređaja pod linuxom:
Diskovi
Slijedeće posebne datoteke predstavljaju disk uređaje (oni su blok uređaji):
/dev/hd* - ATA (IDE) tvrdi disk. “hda” označava primarni master disk. “hda1” označava prvu particiju na primarnom master tvrdom disku. “hdb” označava primarni “slave” disk. “hdb1” označava prvu particiju na primarnom “slave” disku itd./dev/sd* - SATA, SCSI ili SAS tvrdi disk. “sda” je prvi disk , “sdb” je drugi disk , “sdc” treći i tako dalje. Brojevi iza slova označavaju broj particije diska - isto kao kod ATA diskova.Terminali
Slijedeće posebne datoteke predstavljaju terminale (oni su character uređaji):
/dev/tty* - Terminali koji se koriste za ispisivanje (engl. Text output) na monitor/ekran./dev/tty - Predstavlja trenutni kontrolni terminal trenutno pokrenutog procesa. Ako neki program čita ili piše na terminal, koristi se upravo ovaj terminal uređaj./dev/pts/* - Pseudo terminali su emulirani terminali koji se ponašaju poput stvarnih terminala ali se koriste za ispis ili preusmjeravanje prema nekom procesu poput nove komandnolinijske ljuske (Shell) ili udaljenog pristupa (pr. SSH).Serijski portovi
Slijedeće posebne datoteke predstavljaju serijske portove (oni su character uređaji):
/dev/ttyS* - Serijski portovi (COM portovi pd Windows OS-om). “ttyS1” je prvi serijski port. “ttyS2” je drugi serijski port itd. Brzine rada su obično 9 600, 14400, 28800, 33600, … bps. Koristili su se za spajanje modema. Danas se uglavnom koriste za spajanje na “konzole” mrežnih uređaja (Switcheva, Routera i sl)Paralelni portovi
Slijedeće posebne datoteke predstavljaju paralelne portove (oni su character uređaji):
/dev/lp* - Paralelni portovi. “lp0” je prvi paralelni port, “lp1” je drugi paralelni port. Koristili su se za spajanje pisača.Floppy disk
Slijedeće posebne datoteke predstavljaju floppy disk (on je blok uređaj)
/dev/fd* - Floppy diskovi. “fd0” je prvi floppy disk, “fd1” je drugi itd. Audio uređaji
Slijedeće posebne datoteke predstavljaju audio uređaje:
/dev/mixer - Dio OSS (Open Sound System) upravljačkog programa za zvučnu karticu./dev/dsp - Digital Signal Processor. Predstavlja vetu između programa i zvučne kartice koja generira zvuk.Posebni memorijski uređaji (oni su character uređaji)
/dev/null - Uređaj u koji se mogu slati podaci kao u “crnu rupu” - iz nje se više ništa ne može vratiti. Korisno ako želimo pokrenuti neki program ali nas ne zanima njegov izlaz - pa ga možemo redirektirati u ”/dev/null“/dev/zero - Generator nula. Za razliku od ”/dev/null“ on ne briše sve podatke koji ulaze u njega već on kreira nule (0)/dev/random - Nedeterministički generator “slučajnih” odnosno “Random” brojeva. Prilično je spor jer koristi entropiju (nepredvidivost) hardverskih komponenti, poput nepravilnosti u osciliacijama generatora takta U slučaju da dovoljan nivo entropije nije nostupan on mora čekati kako bi se ona pojavila ili očekuje dodatno slučajno pomicanja miša ili sl, da bi entropija bila što veća. Postoje i hardverski uređaji koji mogu generirati što nepredvidljiviji niz generiranih podataka. Koristi se za kriptiranje podataka i slične namjene./dev/urandom također radi kao i /dev/random ali kada se dosegne donji prag entropije, on ne čeka več počinje koristiti takozvani pseudo random number generating formulu da bi simulirao što “slučajniji” i što nepredvidljiviji niz podataka. Ovaj uređaj radi višestruko brže od /dev/random ali je poprilično nepouzdan odnosno prilično je predvidiv.
U trenutku pokretanja operacijskog sustava, kernel je taj koji prepoznaje instalirani hardver: matična ploča, disk kontroler, grafička kartica i sve ostalo. On se u tom trenutku brine i o tome da za prepoznati hardver učita i njegov upravljački program (kernel modul), koji je već ugrađen u sam kernel. Naime linux kernel standardno dolazi sa ugrađenim tisućama i tisućama upravljačkih programa, za osnovni hardver, a dodatno se svi ostali upravljački programi nalaze kao posebne datoteke na datotečnom sustavu, u direktoriju : /lib/modules/-VERZIJA-KERNELA/kernel/drivers/ koje je moguće pokrenuti i naknadno. I na kraju, bilo da se radi o upravljačkom programu već ugrađenom u linux kernel ili onom učitanom iz posebne datoteke, u tom procesu, kreira se i posebna struktura direktorija /dev/, u kojem se potom kreiraju i posebne datoteke koje predstavljaju te upravljačke programe i u konačnici konkretan hardver.
U trenutku nakon pokretanja Linux operacijskog sustava, poseban program (daemon) koji se zove udevd zadužen je za prepoznavanje dodatnih hardverskih komponenti sustava (USB disk, USB memorija, mrežna kartica i sl) te kreiranja zasebnih unosa u posebnom direktoriju /dev/, a koji se potom vežu za upravljački program (driver) odnosno kako se to pod Linuxom naziva kernel modul, za svaki pojedini uređaj.
udevd je prema tome servis, odnosno prema Linux/Unix terminologiji daemon koji se naziva Device Managerom odnosno menadžerom za hardver odnosno sve uređaje. On je zadužen za kreiranje posebnih datoteka u direktoriju /dev/, a od kojih, kako smo vidjeli u poglavlju prije, svaka predstavlja neki uređaj. U trenutku kada smo isključili neki od tih uređaja (primjerice USB disk), udevd potom briše i posebnu datoteku u /dev/ direktoriju, koja se referencira na taj disk (preko upravljačkog programa).
Pošto se udevd program izvršava u korisničkom memorijskom prostoru (izvan kernelovog prostora), moguće su određene intervencije od strane korisnika, pošto udevd ovisi o posebnom virtualnom datotečnom sustavu sysfs.
Moguće je mijenjati imena tih uređaja, korištenjem takozvanih udev rules konfiguracijskih datoteka, koje se nalaze u direktoriju /etc/udev/rules.d/.
U priči o dodavanju novog ili isključivanju hardvera, zadatak je samog kernela da otkrije novi uređaj (hardver).U svakom slučaju kernel za sav hardver, kreira određene unose (posebne datoteke) koje su vidljive unutar sysfs datotečnog sustava, koji se nalazi u direktoriju /sys/, a upravo koji i prati program udevd.
U obije priče, bez obzira da li se neki hardver inicijalizirao u trenutku pokretanja sustava ili kasnije, prije trenutka učitavanja upravljačkog programa, kreira se posebna datoteka, koja predstavlja taj upravljački program odnosno hardver koji stoji iza njega i to prema posebnim pravilima, o kojima ćemo sada govoriti.
Važno je znati i kako je moguće ručno kreirati posebnu datoteku unutar direktorija /dev/, koja predstavlja određeni hardver, a koja se zove i node. Naravno da je naredba za to, upravo mknod (kao Make NODE).
Pogledajte i poglavlje Rad s kernel modulima.
Dakle svaki device file odnosno posebna datoteka unutar direktorija /dev/, ima dvije posebne oznake. Pogledajmo datoteku koju predstavlja prvi i drugi SATA disk (sda i sdb):
ls -al /dev/sda /dev/sdb brw-rw---T 1 root disk 8, 0 Dec 2 18:13 /dev/sda brw-rw---T 1 root disk 8, 16 Dec 2 18:13 /dev/sdb
Prvo slovo (b) govori nam kako se radi o blok uređajima. Druga moguća kategorija su character uređaji, koji bi imali prvo slovo (c).
U petom stupcu za disk sda vidimo brojeve: 8,0 a za disk sdb vidimo brojeve 8,16. Ovi brojevi se zovu redom:
Radi se o tome, kako prvi (Major) broj identificira upravljački program, koji se mora koristiti, dok drugi broj (Minor) identificira sam uređaj, za koji ga koristimo.
Gdje se nalazi poveznica između posebne datoteke u /dev/ direktoriju, koja predstavlja uređaj sa pripadajućim Major i Minor brojevima ?
Odgovor je: nalazi se u /sys/dev/ direktoriju, i to u jednom od dva poddirektorija:
block - ako se radi o blok uređajucharacter - ako se radi o character uređaju.
U našem slučaju pogledajmo prvo disk /dev/sda/: 8,0. Koristiti ćemo naredbu readlink zbog ljepšeg ispisa, ali mogli smo koristiti i naredbu ls :
readlink /sys/dev/block/8\:0/device/driver ../../../../../../bus/scsi/drivers/sd
Za blok uređaje, ova informacija se nalazi i u direktoriju /sys/block/OZNAKA-DISKA/device/driver:
readlink /sys/block/sda/device/driver
Dakle radi se o vršnom upravljačkom programu sd, koji je konkretno došao sa samim kernelom odnosno ugrađen je u njega ali u slučaju SATA/SCSI ili SAS diskova, ovo je malo složenije priča jer se radi o funkcioniranju na dvije osnovne razine:
sd komponenta, a koja se oslanja na upravljački program za disk kontroler (dolje)
Saznali smo prvu razinu (sd), sada nas zanima konkretan upravljački program za disk kontroler, na koji je spojen disk. Detaljne informacije možemo dobiti pomoću programa udevadm. Pogledajmo i kako (ispis ćemo maksimalno skratiti samo na polja koja sadrže ključnu riječ “DRIVERS”):
udevadm info -a -n /dev/sda |grep DRIVERS
DRIVERS=="sd"
...
DRIVERS=="ata_piix"
...
Dakle došli smo do toga kako se radi o upravljačkom programu imena: ata_piix, što je upravljački program najniže razine za SATA disk kontroler (Intel PIIX/ICH (S)ATA).
Više informacija o diskovnom I/O podsustavu i njegovim dijelovima, pogledajte u poglavlju: Diskovni I/O sustav
Pogledajmo i osnovnu (skraćenu tablicu) linux uređaja sa pripadajućim Major i Minor brojevima:
| Major broj | Tip (block/character) | Vrsta uređaja | Minor broj | Uređaj | Opis | |
|---|---|---|---|---|---|---|
| 1 | char | Memorijski uređaji | 1 | /dev/mem | predstavlja pristup memoriji | |
| 3 | /dev/null | predstavlja prazan uređaj, koji može primati podatke (u prazno) | ||||
| 5 | /dev/zero | predstavlja generator nula | ||||
| 8 | /dev/random | predstavlja nedeterministički generator slučajnih brojeva | ||||
| 9 | /dev/urandom | predstavlja jednostavni (brzi) generator slučajnih brojeva | ||||
| … | … | … | ||||
| 1 | block | RAM disk | 0 | /dev/ram0 | prvi RAM disk | |
| 1 | /dev/ram1 | drugi RAM disk | ||||
| … | … | … | ||||
| 3 | block | ATA (IDE) disk | 0 | /dev/hda | Master disk | |
| 64 | /dev/hdb | Slave disk | ||||
| 1 | /dev/hd*1 | Prva particija bilo kojeg hd (ATA) diska | ||||
| 2 | /dev/hd*2 | Druga particija bilo kojeg hd (ATA) diska | ||||
| … | … | … | ||||
| 4 | char | TTY uređaji (terminali/konzole) | 0 | /dev/tty0 | Trenutna konzola za rad | |
| 1 | /dev/tty1 | Prva konzola/terminal | ||||
| 2 | /dev/tty2 | Druga konzola/terminal | ||||
| … | … | … | ||||
| 5 | char | Drugi TTY uređaji | 0 | /dev/tty | Trenutna konzola za rad | |
| 1 | /dev/console | Sistemska konzola | ||||
| … | … | … | ||||
| 6 | char | Paralelni printeri | 0 | /dev/lp0 | Printer na prvom paralelnom portu | |
| 1 | /dev/lp1 | Printer na drugom paralelnom portu | ||||
| … | … | … | ||||
| 7 | block | Loopback uređaji | 0 | /dev/loop0 | Prvi loop uređaj | |
| 1 | /dev/loop1 | Drugi loop uređaj | ||||
| … | … | … | ||||
| 8 | block | SCSI disk uređaji | 0 | /dev/sda | Prvi SCSI/SAS/SATA disk (cijeli disk) | |
| 1 | /dev/sda1 | Prvi SCSI/SAS/SATA disk, prva particija na njemu | ||||
| 2 | /dev/sda2 | Prvi SCSI/SAS/SATA disk, druga particija na njemu | ||||
| 3 | /dev/sda3 | Prvi SCSI/SAS/SATA disk, treća particija na njemu | ||||
| … | … | … | ||||
| 16 | /dev/sdb | Drugi SCSI/SAS/SATA disk (cijeli disk) | ||||
| 32 | /dev/sdc | Treći SCSI/SAS/SATA disk (cijeli disk) | ||||
| … | … | … | ||||
| 9 | char | SCSI tračni uređaji | 0 | /dev/st0 | Prvi SCSI/SAS/SATA tračni uređaj, mode 0 | |
| 1 | /dev/st1 | Drugi SCSI/SAS/SATA tračni uređaj, mode0 | ||||
| 32 | /dev/st0l | Prvi SCSI/SAS/SATA tračni uređaj, mode 1 | ||||
| 33 | /dev/st1l | Drugi SCSI/SAS/SATA tračni uređaj, mode 1 | ||||
| … | … | … | ||||
| 9 | block | Metadiskovi (RAID) | 0 | /dev/md0 | Prva metadisk grupa | |
| 1 | /dev/md1 | Druga metadisk grupa | ||||
| … | … | … | ||||
| 14 | char | Open Sound System (OSS) | 0 | /dev/mixer | Audio mikser | |
| 1 | /dev/sequencer | Audio sequencer | ||||
| 2 | /dev/midi | Prvi audio MIDI port | ||||
| 3 | /dev/dsp | Digitalni audio | ||||
| … | … | … | ||||
| 22 | block | Drugi ATA kanal | 0 | /dev/hdc | Master disk | |
| 64 | /dev/hdd | Slave disk | ||||
| … | … | … | ||||
| 29 | char | Universal frame buffer | 0 | /dev/fb0 | Prvi frame buffer | |
| 1 | /dev/fb1 | Drugi frame buffer | ||||
| … | … | … | ||||
| 81 | char | Video for Linux | 0 | /dev/video0 | Prvi video capture uređaj | |
| 1 | /dev/video1 | Drugi video capture uređaj | ||||
| … | … | … | ||||
| 180 | char | USB uređaji | 0 | /dev/usb/lp0 | Prvi USB printer | |
| … | … | … | ||||
| 48 | /dev/usb/scanner0 | Prvi USB scanner | ||||
| … | … | … | ||||
| 188 | char | USB serijski uređaji | 0 | /dev/ttyUSB0 | Prvi USB serijski port | |
| 1 | /dev/ttyUSB1 | Drugi USB serijski port | ||||
| … | … | … | … | … | … | |
| 203 | char | CPU | 0 | /dev/cpu/0/cpuid | Prva jezgra CPUa - info | |
| 1 | /dev/cpu/1/cpuid | Druga jezgra CPUa - info | ||||
| … | … | … | … | … | … |
Više detalja možete pronaći na http://elixir.free-electrons.com/linux/latest/source/Documentation/admin-guide/devices.txt.
U cjelini prije, govorili smo kako je sistemski servis odnosno daemon udevd zadužen za prepoznavanje svog hardvera, te kako je on, nakon što je hardver prepoznat, zadužen za instaliranje njegovog pripadajućeg upravljačkog programa, odnosno prema linux terminologiji, kernel modula. Dodatno, postoje i takozvana udev rules odnosno udev pravila, za razni hardver, a koja opisuju taj hardver detaljnije, te pomažu udevd daemonu, kako bi se nađeni hardver bolje inicijalizirao i konfigurirao.
Cijeli niz ovih pravila koja koristi udevd, za razne uređaje, nalazi se unutar direktorija: /lib/udev/rules.d/.
udev daemon kada je pronašao sav hardver, obično kreira nekoliko permanentnih udev rules datoteka, u kojima opisuje taj hardver te ga konfigurira, a čiji parametri se kod slijedećeg pokretanja operacijskog sustava čitaju iz tih datoteka.
Jedna od osnovnih datoteka je ona koja opisuje mrežne kartice: /etc/udev/rules.d/70-persistent-net.rules.
Pogledajmo jednu ovakvu datoteku, na računalu s dvije mrežne kartice:
eth0 je Broadcom mrežna kartica, koja koristi kernel modul (driver) tg3eth1 je Intel mrežna kartica, koja koristi kernel modul (driver) e1000e...
# PCI device 0x14e4:/sys/devices/pci0000:00/0000:00:1c.2/0000:07:00.0 (tg3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:30:05:ae:8d:d7", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:1c.3/0000:09:00.0 (e1000e)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:08:60:00:79:20", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
...
Ovdje je vidljiva lokacija uređaja na PCI sabirnici (PCI device) te MAC adresa pripadajuće mrežne kartice (Pr. za eth0 : ATTR{address}==“00:08:60:00:79:20”) te ime pripadajuće mrežne kartice (NAME). Osim toga i ovdje je moguće mijenjati željene parametre.
U konkretnu datoteku se trajno (permanentno) zapisuju sve pronađene mrežne kartice. Prema ovim pravilima u datoteci, se mrežna kartica, odnosno njen upravljački program (kernel modul) povezuje s imenom mrežne kartice (pr. eth0, eth1 i sl.). Dakle poveznica je: Adresa PCI kartice - MAC adresa - eth ime kaartice.
Međutim, dodatno je moguće za svaki pronađeni hardver, i ručno mijenjati konfiguracijske parametre. Navesti ćemo samo par primjera. Prvo pogledajmo koje sve parametre određeni uređaji nude:
udevadm info -a -n /dev/sdb
udevadm info -a -p /sys/class/net/eth0
Opcije i parametri koji su dostupni i koje je moguće mijenjati, navedeni su za svaki uređaj, u ispisu naredbe: udevadm, koje smo naveli gore, i to u polju: ATTRS (atributi).
Dodatno, pomoću ovih naredbi možemo doći i do mnogih detalja o našem hardveru. Primjerice za našu mrežnu karticu eth0 pogledajmo koji kernel modul koristi:
udevadm info -a -p /sys/class/net/eth0 | egrep "DRIVERS|KERNEL"
KERNEL=="eth0"
KERNELS=="0000:07:00.0"
DRIVERS=="tg3"
KERNELS=="0000:00:1c.2"
DRIVERS=="pcieport"
KERNELS=="pci0000:00"
DRIVERS==""
Vidimo kako mrežna kartica eth0 koristi kernel modul tg3. To možemo potvrditi sa naredbom lspci -v, ako pronađemo traženu mrežnu karticu, pod Ethernet controller, ali s lspci -v ne vidimo jeli to eth0, eth1 ili neka druga mrežna kartica.
Par pravila, ako samo kreiramo novu udev rules datoteku (OPREZ - Pazite što radite):
/etc/udev/rules.d.rulesU konačnici ime datoteke mora biti oblika: BROJ-NEKO-IME.rules. Primjer bi bio: 98-optimizacija-diska.rules. Ako želite da se vaša datoteka zadnja izvrši, dodijelite joj broj u imenu veći od 90.
Napraviti ćemo udev rule za naš SSD disk /dev/sda, u kojemu ćemo promijeniti disk scheduler na Deadline. Za detalje, pogledajte poglavlje: Optimizacija Generic Block Layer i Schedulera.
Dodatno, prvo provjerimo da li smo stvarno odabrali SSD disk - tražimo onaj s vrijednosti 0 (koji nije rotacijski/mehanički disk):
for f in /sys/block/sd?/queue/rotational; do printf "$f is "; cat $f; done /sys/block/sda/queue/rotational is 0 /sys/block/sdb/queue/rotational is 1 /sys/block/sdc/queue/rotational is 1
Kreirati ćemo datoteku imena: 80-ssd-disk-optimizacija.rules, slijedećeg sadržaja:
# Postavimo DEADLINE scheduler jer je bolji za SSD diskove
ACTION=="add|change", KERNEL=="sda", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"
Restartajmo sustav te sada provjerimo disk schedulere:
for f in /sys/block/sd?/queue/scheduler; do printf "$f is "; cat $f; done /sys/block/sda/queue/scheduler is noop anticipatory [deadline] cfq /sys/block/sdb/queue/scheduler is noop anticipatory deadline [cfq] /sys/block/sdc/queue/scheduler is noop anticipatory deadline [cfq]
Vidimo kako je naš SSD disk (/dev/sda) sada odabrao deadline disk scheduler a druga dva mehanička/rotacijska diska i dalje imaju odabran cfq disk scheduler.
Uz samu instalaciju upravljačkog programa (kernel modula) neki uređaji odnosno hardver, za rad trebaju i takozvani firmware ili microcode, kako bi uređaj bio uopće funkcionalan ili kako bi imao dodatne funkcionalnosti. Ovo je najčešće slučaj s raznim mrežnim karticama ali i drugim hardverom, poput grafičkih kartica, disk i RAID kontrolera, USB uređaja i slično. Kod nekih uređaja, bez učitavanja firmwarea rade samo osnovne funkcionalnosti, dok one napredne ne rade, a kod drugih ne rade niti osnovne funkcionalnosti uređaja.
Stariji i neki posebni uređaji (pr. RAID kontroleri) su imali ili imaju takav dizajn, u kojemu se njihov firmware nalazio već programiran odnosno upisan u EEPROM/FLASH memoriju na uređaju, što daje osnovne ali i sve napredne funkcionalnosti rada uređaja. U takvom dizajnu, mogli smo i sami napraviti nadogradnju njihovog firmwarea. U današnje vrijeme, sve više uređaja ili uopće nema takav firmware ili on nudi samo najosnovnije funkcije, pa je stoga potreban i dodatan firmware, sa svim ostalim funkcijama. Stoga je za ovu zadaću potrebna funkcija operativnog sustava, koji kod svakog pokretanja, učitava i firmware za razne uređaje.
Za CPU microcode, koji također možemo nazvati i firmware, pogledajte poglavlje CPU microcode.
Važno je razumjeti, kako uz standardnu instalaciju linuxa, ne smiju doći sve verzije firmwarea, za razne uređaje. To je stoga što neki od proizvođača uređaja i njihovog pripadajućeg firmwarea, objavljuju svoj firmware pod licencama, koje zabranjuju njihovu distribuciju, unutar instalacije linuxa. Za takav hardver, potrebno je stoga:
Za osnovni slučaj u kojemu firmware dolazi s linuxom, on obično dolazi uz instalaciju kernela, u paketu: kernel-VERZIJA-KERNELA, koji raspakirava firmware datoteke u direktorij: /lib/modules/VERZIJA-KERNELA/kernel/drivers/firmware te dodatno u pratećem paketu, imena: kernel-firmware-VERZIJA-KERNELA, koji sadrži veću količinu firmwarea, a koji će se raspakirati u direktorij: /lib/firmware/. Dodatno je moguće da firmware dolazi i u paketu s alatima za nadogradnju firmwarea odnosno microcodea, poput paketa: microcode_ctl.
Za slučaj (1) u kojemu morate sami instalirati paket u kojem se nalazi firmware, neke od njih možete promaći na dostupnim repozitorijima, vašeg Linuxa. Pogledajmo listu onih koji su dostupni na ovaj način, pomoću naredbe: yum search firmware.
Koja je procedura učitavanja firmwarea
Naime za automatsko učitavanje firmwarea je također zadužen udevd, a procedura je slijedeća:
udev učitava driver (upravljački program) za hardverudev servisu, u kojemu se traži firmware za konkretan uređajudev pokreće skriptu (obično: /lib/udev/firmware.sh) koja iz firmware datoteke izvlači podatke u formatu, koji mu je prihvatljiv i zapisuje ih u posebnu privremenu datotekuKod ručnog učitavanja drivera (kernel modula), firmware će također biti automatski učitan (ako postoji).
Za potrebe debuggiranja, ako ručno učitavamo neki novi kernel modul, moguće je prije nego smo učitali kernel modul uključiti logiranje udevd servisa. Na taj način ćemo moći vidjeti jeli sve prošlo kako treba te da li je učitan potrebni firmware:
udevadm monitor --property
Sada, u drugom shellu/prozoru možemo učitati kernel modul te ćemo u realnom vremenu, u prvom - u kojem smo pokrenuli naredbu udevadm monitor –property, vidjeti što se događa.
Kada budemo pratili učitavanje firmwarea, sama firmware datoteka će biti vidljiva u redu FIRMWARE, poput ovoga dolje:
... FIRMWARE=e100/d101m_ucode.bin ...
Podrazumijeva se kako se radi o vršnom direktoriju: /lib/firmware/ unutar kojega se trebaju nalaziti ili firmware datoteke ili poddirektoriji u kojima se nalaze datoteke. Firmware datoteke su obično ekstenzija:
.dat.ucode.fw.bin
udevadm monitor –property prekidamo sa stisnutim tipkama: CTRL i C.
Pogledajmo listu, samo nekih od mrežnih kartica (kernel modula) koje traže učitavanje odnosno podršku firmwarea:
tg3, bnx2 i bnx2x (deseci mrežnih kartica)cxgb3, cxgb4 (niz mrežnih kartica: T3 i T4)myri10ge (niz 10Gbps mrežnih kartica)
Izvori informacija: (147), (148), (149)
Što su sistemske i dijeljene biblioteke (Engl. Librarys) ?
Svaki program, pisan u bilo kojem programskom jeziku (C/C++/Java/Scala/ …) sastoji se od većeg broja logičkih cjelina. Vrlo često svi programi koriste veliki broj logičkih cjelina koje su im svima zajedničke. Primjerice svi matematički kalkulatori moraju imati napisane funkcionalnosti za matematičke operacije zbrajanja, oduzimanja, množenja, dijeljenja itd. Raznih kalkulatora postoji na stotine, kao i drugih programa koji imaju potrebu raditi navedene matematičke operacije. Nadalje svi drugi programi koriste na stotine ili tisuće funkcionalnosti koje su im zajedničke.
Logično bi prema tome bilo napraviti neki program koji bi na najbolji i najbrži način mogao odrađivati te funkcionalnosti, a da ga mi iz svog “glavnog” programa samo možemo pozivati i koristiti.
Dijeljene biblioteke
Upravo tome i služe dijeljene biblioteke. Svaka od njih ima određeni broj funkcionalnosti koje možemo koristiti u našem (ili bilo kojem) programu. U praksi postoje cijeli paketi dijeljenih biblioteka sa tisućama i tisućama (i milijunima) implementiranih funkcionalnosti : od matematičkih operacija, operacija za baratanje mrežnim paketima, do svih drugih mogućih (ili nemogućih) funkcionalnosti.
Prednost upotrebe dijeljenih biblioteka je u tome što naš program postaje manji i jednostavniji. Osim toga, pošto veliki broj programa koristi iste dijeljene biblioteke, više nema potrebe kako bi se iste kopirale unutar svakog programa i zauzimaju mjesto, već više programa može koristiti istu dijeljenu biblioteku. Odatle i naziv dijeljene biblioteke.
Dijeljene biblioteke imaju ekstenziju .so (Engl. Shared Object)
Statičke biblioteke su suprotnost dijeljenima. One mogu biti biblioteke koje su vidljive i dijeljene s drugima ali su u procesu kopiliranja programa statički “Linkane” odnosno nakon tog procesa one postaju njegov sastavni dio (nalze se unutar njega).
To znači da je njihova funkcionalnost tada dostupna samo programu unutar kojega se nalaze.
Statičke biblioteke obično imaju ekstenziju .a.
Statičke
Statičke odnosno “Statički povezane” biblioteke se nalaze unutar samog programa, pa stoga ako imamo deset programa od kojih svaki ima statičke biblioteke unutar sebe, praktično imamo deset kopija tih biblioteka. Samim time raste i veličina programa koji koristi statičke biblioteke (Engl. Static Librarys).
S druge strane programi koji imaju statičke biblioteke se mogu lako kopirati na drugi sustav i pokrenuti bez problema.
Dijeljene
Programi koji koriste dijeljene biblioteke, samo se referenciraju na njih te svi programi koji trebaju određenu dijeljenu biblioteku imaju samo referencu na tu (pojedinu) dijeljenu biblioteku, koju ne moraju sadržavati unutar sebe.
Mana ovog modela je u tome što prebacivanjem odnosno kopiranjem programa koji koristi dijeljene biblioteke na drugo računalo, na drugom računalu program neće raditi ako na njemu nisu dostupne sve dijeljene biblioteke koje su mu potrebne.
Kod pokretanja svakog programa koji koristi dijeljene biblioteke (u pravilu to je većina programa) prvo se provjerava da li program može doći do dijeljenih biblioteka koje su mu potrebne.
Kao što se za izvršne datoteke provjerava sistemska varijabla PATH i provjeravaju sve putanje direktorija navedene u njoj. U ovom slučaju se traži dostupnost izvršnih programa u bilo kojoj navedenoj putanji, tako se i za sve dijeljene biblioteke pretražuju točno definirane putanje do direktorija koji ih sadrže.
Standardno se za većinu Linuxa provjerava dostupnost dijeljenih biblioteka unutar sljedečih direktorija:
Dakle svaki program pri pokretanju prvo provjeri da li može pronaći sve dijeljene biblioteke u gore navedenim direktorijima, te ako ne može, izbaci grešku, s podatkom koja točno biblioteka mu nedostaje.
Zapravo se o dostupnosti i pokretanju dijeljenih biblioteka, za svaki program, brine proces koji se zove “Dynamic Linker”.
S naredbom ldconfig možemo vidjeti koji direktoriji su dodani kao izvori dijeljenih biblioteka (i koje su to biblioteke u njima).
Pogledajmo skraćeni ispis :
ldconfig -v
/lib:
libc.so.6 -> libc-2.12.so
libutil.so.1 -> libutil-2.12.so
libselinux.so.1 -> libselinux.so.1
libz.so.1 -> libz.so.1.2.3
... ... ...
/lib64:
libplds4.so -> libplds4.so
libsemanage.so.1 -> libsemanage.so.1
libdbus-1.so.3 -> libdbus-1.so.3.4.0
libsepol.so.1 -> libsepol.so.1
libc.so.6 -> libc-2.12.so
libutil.so.1 -> libutil-2.12.so
libselinux.so.1 -> libselinux.so.1
... ... ...
/usr/lib:
libgamin-1.so.0 -> libgamin-1.so.0.1.10
libformw.so.5 -> libformw.so.5.7
libform.so.5 -> libform.so.5.7
libtic.so.5 -> libtic.so.5.7
libmenu.so.5 -> libmenu.so.5.7
libpanelw.so.5 -> libpanelw.so.5.7
libxml2.so.2 -> libxml2.so.2.7.6
... ... ...
... ... ...
... ... ...
U normalnom radu, kod instalacije novog programa koji prema potrebi instalira i nove dijeljene biblioteke, sustav ih u pravilu kopira upravo u neki od gore navedenih direktorija (ili poddirektorija).
Dynamic linker je dio operacijskog sustava koji kod pokretanja svakog programa koji koristi dijeljene biblioteke, prije samog pokretanja programa pokušava pronaći sve dijeljene biblioteke koje su mu potrebne.
On potom sve tražene dijeljene biblioteke učitava s diska u RAM memoriju, i kreira sve potrebno kako bi se program mogao uspješno izvršiti i pristupiti tim bibliotekama u RAM memoriji. Drugim riječima on dinamički povezuje dijeljene biblioteke s našim (pokrenutim) programom.
Ovdje postoji još jedan pojam koji bi bilo dobro razumjeti:
Linking ili povezivanje, je proces koji povezuje sve biblioteke u trenutku kompiliranja/prevođenja (Engl. Compile) programa, da bi se program uopće mogao prevesti u izvršni kod, koji mi kao korisnici vidimo kao izvršnu binarnu datoteku.
U Linux sustavu se izvršne binarne datoteke zovu “ELF” (Engl. Executable and Linkable Format https://en.wikipedia.org/wiki/Executable_and_Linkable_Format ).
Pogledajmo primjerice informacije o našem BASH Shellu, koji je također kompiliran i dolazi nam kao binarna izvršna datoteka. Za ovu potrebu ćemo koristiti naredbu file, koja nam daje informacije o tipu (vrsti) datoteke koju provjeravamo.
file /bin/bash /bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
Vidimo da je tip (vrsta) : “ELF” te da je dinamčki povezana (dynamically linked) odnosno da koristi dijeljene biblioteke.
Vratimo se na naredbu ldconfig
Naredba ldconfig kod prvog pokretanja (inicijalizacije) zapravo prosljeđuje putanje do svih dostupnih biblioteka “Dynamic Linkeru” koji ih kasnije može koristiti za potrebe svih programa. To znači kako se ova naredba ne treba pokretati ako nismo dodali novi direktorij za dijeljene biblioteke.
Kod instalacije novih programa koji tijekom same instalacije instaliraju i nove dijeljene biblioteke u standardne direktorije nije potrebno napraviti ništa dodatno.
Čak i u slučaju kada se instaliraju nove biblioteke u neki novi direktorij, u većini slučajeva instalacijska procedura odrađuje ostatak posla odnosno dodaje novi direktorij u “putanju” za dijeljene biblioteke.
Primjer ovakvog rada je mySQL relacijska baza podataka, odnosno njena instalacija ili instalacija klijenta za ovu bazu, koja instalira nekoliko dijeljenih biblioteka u novi direktorij (koji do tog trenutka nije postojao). Stoga instalacijska procedura kreira novi unos koji govori ”Dynamic Linkeru“ kako se pojavio dodatni direktorij s dijeljenim datotekama.
Pogledajmo kako izgleda lista direktorija za dijeljene biblioteke nakon instalacije mySQL baze podataka (izbacili smo veći ispisa da bi se fokusirali na ono što nam je sada važno)
ldconfig -v
... ... ...
/usr/lib:
libgamin-1.so.0 -> libgamin-1.so.0.1.10
libformw.so.5 -> libformw.so.5.7
... ... ...
/usr/lib64:
libcups.so.2 -> libcups.so.2
libLLVM-3.4-mesa.so -> libLLVM-3.4-mesa.so
libFLAC++.so.6 -> libFLAC++.so.6.2.0
... ... ...
... ... ...
/usr/lib64/mysql:
libmysqlclient_r.so.16 -> libmysqlclient_r.so.16.0.0
libmysqlclient.so.16 -> libmysqlclient.so.16.0.0
... ... ...
Vidimo kako se pojavio direktorij /usr/lib64/mysql sa dijeljenim bibliotekama unutar njega.
Ali kako to radi ?
Unutar direktorija : /etc/ld.so.conf.d/ se nalaze datoteke - po jedna za svaki program koji dodaje svoj biblioteke u neki zaseban (novi) direktorij koji nije neki od standardnih ( /lib/ , /lib64/ , /usr/lib/ ili /usr/lib64/ ).
U našem slučaju mySQL je ovdje kreirao svoju datoteku imena mysql-x86_64.conf.
Pogledajmo sadržaj ove datoteke
cat /etc/ld.so.conf.d/mysql-x86_64.conf /usr/lib64/mysql
Dakle ona ima samo upisanu novu putanju direktorija unutar kojeg se nalaze njene dijeljene biblioteke.
Nakon samog kreiranja nove datoteke, ništa se nije promijenilo te je potrebno pokrenuti naredbu ldconfig bez parametara, da bi ona mogla dodati novi direktorij “Dynamic Linkeru”.
To bi trebalo napraviti ovako :
ldconfig
U slučaju instalacije mySQL-a on je to napravio na kraju instalacije, za nas.
Ako imamo potrebu sami dodavati novi direktorij sa nekim našim bibliotekama, procedura je ista :
/etc/ld.so.conf.d/ldconfig, kako bi se osvježila lista direktorija za biblioteke
Nakon što se pokrene naredba ldconfig, ona zapravo radi sljedeće:
/etc/ld.so.conf u kojoj se zapravo nalazi definicija gdje sve je potrebno tražiti nove konfiguracijske datoteke za nove putanje. Ovdje se standardno nalazi samo definiran direktorij /etc/ld.so.conf.d/ sa svim datotekama unutar njega, koje imaju ekstenziju .conf/etc/ld.so.cache. Ova datoteka je u posebnom formatu (nije ju “moguće” pročitati)“Dynamic linker” se zapravo nalazi u datoteci
/lib/ld-linux.so.* za 32.bitne Linuxe/lib64/ld-linux-x86-64.so.* za 64.bitne Linuxe.Sadržaj cache datoteke je moguće i izlistati - tj. sve dijeljene biblioteke koje se nalaze u njemu. U ovoj datoteci se nalaze i sve datoteke koje su trenutno učitane u RAM memoriju.
Dakle naredba ldconfig -p nam zapravo daje listu svih dijeljenih biblioteka koje se trenutno nalaze učitane u RAM memoriju.
ldconfig -p
605 libs found in cache `/etc/ld.so.cache'
libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
libz.so.1 (libc6) => /lib/libz.so.1
libz.so (libc6,x86-64) => /usr/lib64/libz.so
libyajl.so.1 (libc6,x86-64) => /usr/lib64/libyajl.so.1
libxul.so (libc6,x86-64) => /usr/lib64/xulrunner/libxul.so
libxtables.so.4 (libc6,x86-64) => /lib64/libxtables.so.4
libxslt.so.1 (libc6,x86-64) => /usr/lib64/libxslt.so.1
libxpcom.so (libc6,x86-64) => /usr/lib64/xulrunner/libxpcom.so
libxml2.so.2 (libc6,x86-64) => /usr/lib64/libxml2.so.2
libxml2.so.2 (libc6) => /usr/lib/libxml2.so.2
libxcb.so.1 (libc6,x86-64) => /usr/lib64/libxcb.so.1
libxcb.so (libc6,x86-64) => /usr/lib64/libxcb.so
... ... ...
... ... ...
U slučajevima kada želimo za određenu izvršnu binarnu datoteku (ELF) provjeriti koje dijeljene biblioteke su joj potrebne, za tu namjenu možemo koristiti naredbu ldd (Engl. List Dynamic Dependencies).
Pogledajmo recimo BASH Shell (datoteka je ”/bin/bash“).
Naredbi ldd je potrebno proslijediti punu putanju do željene datoteke.
ldd /bin/bash
linux-vdso.so.1 => (0x00007ffc6eeef000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007feff03f8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007feff01f4000)
libc.so.6 => /lib64/libc.so.6 (0x00007fefefe5f000)
/lib64/ld-linux-x86-64.so.2 (0x00007feff0626000)
Vidimo da je za BASH Shell, tj. izvršnoj datoteci koja (je) pokreće Shell ”/bin/bash“ potrebno nekoliko dijeljenih biblioteka, za rad.
Osim toga točno za svaku od njih vidimo gdje je locirana na disku (/lib/* … ) te na kojoj memorijskoj lokaciji unutar sustava virtualne memorije, se i nalazi (0xXXXXXXXXXXXXX).
Osim naredbe ldd za provjeru ovisnosti o dijeljenim bibliotekama, moguće je istu funkcionalnost dobiti direktno sa “Dynamic Linkerom”.
Pogledajmo iste primjere za BASH Shell
Za 32.bitni linux:
/lib/ld-linux.so.2 --list /bin/bash
linux-vdso.so.1 => (0x00007ffd38ba4000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fddff909000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fddff705000)
libc.so.6 => /lib64/libc.so.6 (0x00007fddff370000)
/lib/ld-linux.so.2 (0x00007fddffb37000)
Za 64.bitni linux:
/lib64/ld-linux-x86-64.so.2 --list /bin/bash
linux-vdso.so.1 => (0x00007ffc7adaf000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007feec1754000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007feec1550000)
libc.so.6 => /lib64/libc.so.6 (0x00007feec11bb000)
/lib64/ld-linux-x86-64.so.2 (0x00007feec1982000)
Osim lokacije (putanje na disku) dijeljenih biblioteka, vidljive su još dvije stvari:
linux-vdso.so.1 biblioteka nema svoju lokaciju na disku (odakle se onda učitala ?)1.
linux-vdso.so.1 ili VDSO (Virtual Dynamic Shared Object) predstavlja virtualnu dijeljenu biblioteku, koju nam dodjeljuje linux kernel i koja se nalazi u memorijskom adresnom prostoru našeg programa (iz sigurnosnih razloga).
Ova virtualna dijeljena biblioteka je nekada vidljiva i kao linux-gate.so.1. Osnovna funkcija ove virtualne biblioteke je omogućavanje pristupa rutinama koje su na razini kernela a koje se nalaze u izoliranom memorijskom prostoru kernela (Engl. Kernel Space). Zapravo se radi o sistemskim pozivima koji bi se morali izvršiti što prije.
Pristup ovim rutinama (pozivima) na ovakav način je važan jer se za neke rutine (funkcionalnosti) tako preskaču mnogi slojevi linux komponenti, koje u slučaju ovih funkcionalnosti nisu potrebne.
Pošto se sve događa preko VDSO modela, sve je i dalje sigurno i zaštićeno jer nigdje nema direktnog pristupa izoliranom memorijskom prostoru linux kernela.
2.
Memorijske lokacije, na kojima se nalaze dijeljene biblioteke, se mijenjaju jer nam kod provjere “Dynamic Linker” dodjeli novi pokazivač - na novu memorijsku lokaciju. Svaki puta na neku drugu, kada ponovno pokrenemo provjeru.
Ovo ne znači da će se i programu koji je već pokrenut promijeniti memorijske adrese biblioteka - u radu.
To znači samo to da će se kod svakog novog pokretanja bilo kojeg programa, lokacija na koju će se učitati dijeljene biblioteke ili programi, učitati u drugi dio virtualne memorije - iz sigurnosnoh razloga (ovo odrađuje ASLR mehanizam zaštite). Dakle samo kod prvog pokretanja programa ili nakon njegovog stopiranja pa ponovnog pokretanja.
Pogledajmo naš BASH Shell, ali ovaj puta onaj u kojemu radimo.
Prvo pronađimo njegov PID :
pidof bash 19849
Sada ćemo korištenjem /proc sustava ispisati sve memorijske lokacije koje koristi naš trenutni BASH proces sa PID-om 19849.
Dakle za svaki Proces ID (PID), unutar /proc direktorija, nalazi se datoteka koja sadrži tablicu mapiranja, imena map.
U njoj su mapiranja :
Memorijska adresa (lokacija) u virtualnoj memoriji ← → biblioteka ili proces/naredba/datoteka
cat /proc/19849/maps 00400000-004d4000 r-xp 00000000 fd:02 15207210 /bin/bash 006d4000-006dd000 rw-p 000d4000 fd:02 15207210 /bin/bash 006dd000-006e3000 rw-p 00000000 00:00 0 0196d000-019cf000 rw-p 00000000 00:00 0 [heap] 7fc7f0673000-7fc7f067f000 r-xp 00000000 fd:02 15206978 /lib64/libnss_files-2.12.so 7fc7f067f000-7fc7f087f000 ---p 0000c000 fd:02 15206978 /lib64/libnss_files-2.12.so 7fc7f087f000-7fc7f0880000 r--p 0000c000 fd:02 15206978 /lib64/libnss_files-2.12.so 7fc7f0880000-7fc7f0881000 rw-p 0000d000 fd:02 15206978 /lib64/libnss_files-2.12.so 7fc7f0881000-7fc7f6712000 r--p 00000000 fd:02 15470584 /usr/lib/locale/locale-archive-rpm 7fc7f6712000-7fc7f689c000 r-xp 00000000 fd:02 15206962 /lib64/libc-2.12.so 7fc7f689c000-7fc7f6a9c000 ---p 0018a000 fd:02 15206962 /lib64/libc-2.12.so 7fc7f6a9c000-7fc7f6aa0000 r--p 0018a000 fd:02 15206962 /lib64/libc-2.12.so 7fc7f6aa0000-7fc7f6aa1000 rw-p 0018e000 fd:02 15206962 /lib64/libc-2.12.so 7fc7f6aa1000-7fc7f6aa6000 rw-p 00000000 00:00 0 7fc7f6aa6000-7fc7f6aa8000 r-xp 00000000 fd:02 15206968 /lib64/libdl-2.12.so 7fc7f6aa8000-7fc7f6ca8000 ---p 00002000 fd:02 15206968 /lib64/libdl-2.12.so 7fc7f6ca8000-7fc7f6ca9000 r--p 00002000 fd:02 15206968 /lib64/libdl-2.12.so 7fc7f6ca9000-7fc7f6caa000 rw-p 00003000 fd:02 15206968 /lib64/libdl-2.12.so 7fc7f6caa000-7fc7f6cc7000 r-xp 00000000 fd:02 15210225 /lib64/libtinfo.so.5.7 7fc7f6cc7000-7fc7f6ec6000 ---p 0001d000 fd:02 15210225 /lib64/libtinfo.so.5.7 7fc7f6ec6000-7fc7f6eca000 rw-p 0001c000 fd:02 15210225 /lib64/libtinfo.so.5.7 7fc7f6eca000-7fc7f6ecb000 rw-p 00000000 00:00 0 7fc7f6ecb000-7fc7f6eeb000 r-xp 00000000 fd:02 15204365 /lib64/ld-2.12.so 7fc7f70da000-7fc7f70dd000 rw-p 00000000 00:00 0 7fc7f70e0000-7fc7f70e2000 rw-p 00000000 00:00 0 7fc7f70e2000-7fc7f70e9000 r--s 00000000 fd:02 16124866 /usr/lib64/gconv/gconv-modules.cache 7fc7f70e9000-7fc7f70ea000 rw-p 00000000 00:00 0 7fc7f70ea000-7fc7f70eb000 r--p 0001f000 fd:02 15204365 /lib64/ld-2.12.so 7fc7f70eb000-7fc7f70ec000 rw-p 00020000 fd:02 15204365 /lib64/ld-2.12.so 7fc7f70ec000-7fc7f70ed000 rw-p 00000000 00:00 0 7fffc700a000-7fffc701f000 rw-p 00000000 00:00 0 [stack] 7fffc7147000-7fffc7149000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Shell ili komandnolinijska ljuska je sučelje između korisnika i operativnog sustava, iz nje pokrećemo razne programe i upravljamo cijelim sustavom.
Shellova postoji ih veći broj,od kojih svaki ima neke specifičnosti, neki od češće korištenih su:
bash shell (bash) je Unix shell (command language interpreter [CLI]) napisan za GNU Projekt kao zamjena za Bourne shell (sh). u 1989.g.. Široko se koristi i danas je standardni (default) shell za Linux i Mac OS X.
Portan je i na Microsoft Windows, Novell NetWare i Android kroz razne terminal emulatore (aplikacije).
Dakle bash je naredbeni (command) processor, koji se pokreće u tekstualnom prozoru te omogućava korisnicima da pokreću razne Unix/Linux naredbe. Bash također može čitati naredbe iz datoteke, zvane skripte.
Kod logiranja na sustav vrlo je vjerojatno da ćete koristiti upravo bash shell. Definicija raznih parametara logiranja za bash shell se nalazi u datotekama (za svakog korisnika ~ [home dir] ), koje se učitavaju ovim redosljedom:
/etc/profile za sve korisnike,
Globalnu konfiguracijsku datoteku ( /etc/profile) konfigurira administrator i kod logiranja se ona prva učitava.
Vrijednosti postavjene u /etc/profile datoteci mogu se u .bashrcpromjeniti samo ako nisu postavljene kao readonly od strane administratora. Dakle moguće je konfigurirati određene vrijednosti (varijable) koje se definiraju u /etc/profile da budu “readonly”, tako da ih korisnici u svojoj konfiguraciji ( .bashrc) ne mogu zaobići ili mijenjati.
Za više detalja o varijablama, pogledajte poglavlje : ”Sistemske Environment varijable“
Potom se učitava konfiguracijska datoteka specifična za svakog pojedinog korisnika, iz njegovog home direktorija i to prva od sljedećih koja postoji:
~/.bash_profile~/.bash_login~/.profile
U slučaju kada se bash ne koristi kao login shell, učitava se : ~/.bashrc
~ znak označava vaš home direktorij
Bash shell nam daje mogućnost korištenja kratica na tipkovnici:
CTRL a - skoči na početak redaCTRL e - skoči na kraj redaCTRL c - prekini izvršavanje naredbeCTRL d - odlogiraj seCTRL d - još znači i pošalji End of File trenutnom procesuCTRL ALT Fn - prebaci se na n-ti terminal (n=1…6) : pr CTRL ALT F1CTRL z - privremeni prekid rada procesa (suspend)Kako izgleda Shell (komandna linija):
root@Server1 :~$
U ovom poglavlju upoznati ćemo se s osnovama rada u shellu
Da bi se uopće mogli logirati u sustav,vaš korisnički račun (Engl. Account) mora biti kreiran od strane administratora (root korisnika).
Kod logiranja na sustav, razlikuju se velika i mala slova. Dakle vaše korisničko ime, kao i pripadajuća lozinka osjetljivi su na velika i mala slova.
Osim toga :
passwdexit , logout CTRL d
Važno je znati kako svaki korisnički račun ima neke svoje specifičnosti:
Kako provjeriti pripadnost korisničkog računa grupi/grupama korisnika:
id -a uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon)
Dakle ovdje vidimo da je korisnik root
… da pripada primarnoj grupi (gid) root
… da pripada i dodatnim grupama (groups) : bin i daemon
U radu sa shellom, možemo koristiti osnovne kontrolne naredbe, poput:
CTRL a - skoči na početak redaCTRL e - skoči na kraj redaCTRL c - prekini izvršavanje naredbeCTRL d - odlogiraj seCTRL d - još znači i pošalji End of File trenutnom procesuCTRL ALT Fn - prebaci se na n-ti terminal (n=1…6)CTRL z - privremeni prekid rada procesa (suspend)
Aliasi se koriste za dodjeljivanje niza naredbi nekoj novoj (alias) naredbi. Možemo ih zamisliti kao postavljanje nama razumljive naredbe koja u pozadini poziva cijeli niz naredbi, zbog bržeg/lakšeg rada. Dakle moguće jepostaviti alias naredbu, čijim pokretanjem, zapravo pokrećemo neku drugu naredbu, drugu naredbu s nizom prekidača, opcija i parametara ili cijeli niz naredbi. Aliasi se koriste zbog jednostavnosti rada u shellu. Naime ponekad pozivamo određene naredbe s cijelim nizom prekidača, opcija i parametara, za čije tipkanje treba dosta vremena. Ako takve naredbe koristimo više puta, jednostavnije je od njih napraviti alias, te njega pozivati.
Primjer
Stvorimo alias imena ll koji će pokrenuti naredbu ls -alhi
alias ll=´ls -alhi´
Za izlistanje svih postavljenih aliasa koristi se naredba alias:
Primjer
Izlistajmo sve trenutno postavljene aliase (na kraju je i naš novo kreirani):
alias alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias ll='ls -alhi'
Za brisanje aliasa koristi se naredba unalias
Primjer
Obrišimo alias ll
unalias ll
Od trenutka logiranja na sustav, a to je i trenutak kada se pokreće komandna ljuska (shell), pamte se sve naredbe koje smo pozvali.
Naredbe koje smo pozivali moguće je:
Naredbom history izlistavamo sve naredbe koje smo pozivali u prošlosti.
Moguće je definirati koliko zadnjih naredbi će sistem pamtiti:
set HISTSIZE = xxx Podešavanje koliko zadnjih naredbi ( xxx ) će se pamtiti
Primjer
History size je obično postavljen na pamćenje zadnjih 1.000 naredbi, to ćemo povećati na 5.000
set HISTSIZE = 5000
Još neke od korisnih mogućnosti su :
!123 pozovi naredbu iz povijesti pod rednim brojem 123!ls pozovi zadnju naredbu iz povijesti koja počinje sa lsCTRL r – pretraži history (ovo važi za bash shell) nakon ovog se upisuje pojam/naredba koja se traži iz historyja
S vremena na vrijeme želimo saznati tko nam je sve logiran na sustav (u shell) i što sve radi.
To možemo saznati pomoću slijedećih naredbi:
who prikazuje nam tko je sve logiran na sustav (uz još neke informacija)w prikazuje tko je logiran u sustav te koje je sve procese pokrenuolast prikazuje tko je sve bio logiran u sustav
Sada ćemo se upoznati s navedenim naredbama.
Naredba who daje nam detaljne informacije o korisnicima logiranim u sustav
Najčešći prekidaći ove naredbe su:
-a Ispiši sve detalje-b ispiši samo informaciju kada se operativni sustav startao-m ispiši samo kombinaciju hostname (ime računala) i username (korisničko ime)-r ispiši trenutni Runlevel-u ispiši koji su sve korisnici logirani
Primjeri
1. Ispiši sve dostupne podatke (-a)
who -a
system boot 2014-07-31 20:05
run-level 3 2014-07-31 20:05
LOGIN tty1 2014-07-31 20:06 1184 id=1
LOGIN tty2 2014-07-31 20:06 1186 id=2
LOGIN tty3 2014-07-31 20:06 1188 id=3
LOGIN tty4 2014-07-31 20:06 1190 id=4
LOGIN tty5 2014-07-31 20:06 1192 id=5
LOGIN tty6 2014-07-31 20:06 1194 id=6
root + pts/0 2014-07-31 20:17 . 1199 (10.0.2.2)
ucenik + pts/1 2014-07-31 20:38 . 1419 (10.0.2.2)
Opis:
Vidljivo je :
root i ucenik , preko pts/0 i pts/1 (udaljeni pristup - u ovom slučaju ssh), vremena kada su se logirali i njihove IP adrese (10.0.2.2)2. Ispiši samo tko je sve logiran na sustav
who -u root pts/0 2014-07-31 20:17 . 1199 (10.0.2.2) ucenik pts/1 2014-07-31 20:38 00:01 1419 (10.0.2.2)
Naredba w daje nam informacije o tome koje procese (programe) je pokrenuo koji logirani korisnik.
Samim pokretanjem (bez argumenata) naredbe w , dobivamo informacije u svim logiranim korisnicima te procesima (programima) koje su pokrenuli-
Primjeri
1. Ispišimo sve korisnike logirane na sustav te procese koje su pokrenuli:
w 20:56:20 up 51 min, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.0.2.2 20:17 0.00s 0.47s 0.03s w ucenik pts/1 10.0.2.2 20:38 3.00s 0.11s 0.06s /usr/bin/mc -P /tmp/mc-ucenik/mc.pwd.1423
Opis:
Vidimo da je korisnik root pokrenuo naredbu w (to smo mi)
Također je vidljivo da je korisnik ucenik pokreuo naredbu mc (Midnight Commander) s određenim prekidačima, uz sve detalje o proesima i vremenu pokretanja naredne/procesa te IP adrese s koje se spojio.
2. Ispišimo podatke o pokrenutim procesima samo za korisnika ucenik
w ucenik 21:00:44 up 55 min, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT ucenik pts/1 10.0.2.2 20:38 4:27 0.11s 0.06s /usr/bin/mc -P /tmp/mc-ucenik/mc.pwd.1423
Naredba last daje nam informacije o tome tko se sve logirao na sustav i kada.
Pokretanjem naredbe, bez argumenata, dobivamo informacije o tome s kojim korisničkim računima je ostvareno uspješno logiranje na sustav, kako lokalno tako i s udaljenim pristupom (pr. telnet ili ssh).
Zapravo se sve statistike izvlaće iz sistemske log datoteke u koju se upisuju sve statistike vezane za logiranje na sustav ( /var/log/wtmp ).
Pogledajmo kako to izgleda (ostavljeno je samo par statistika zbog jednostavnijeg prikaza):
last ... ... ... root pts/0 142.158.247.12 Wed Mar 25 21:15 - 22:59 (01:44) root pts/0 142.158.247.12 Wed Mar 25 20:12 - 20:55 (00:42) ivan pts/0 213.147.100.123 Wed Mar 25 12:12 - 17:06 (04:53) root pts/0 213.147.100.123 Wed Mar 25 12:02 - 12:07 (00:05) pero pts/0 213.147.100.123 Wed Mar 25 11:57 - 12:00 (00:02) root pts/0 213.147.100.123 Wed Mar 25 11:55 - 11:56 (00:01) pero pts/0 207.117.125.45 Mon Mar 23 23:06 - 00:45 (01:39) root pts/0 207.117.221.78 Sun Mar 22 12:27 - 17:53 (05:25) ... ... ... ... ... ...
Opis:
Moguće je tražiti samo statistiku spajanja za određenok korisnika. Pogledajmo sada statistiku za korisnika “root”
Sada kao prvi parametar naredbi last moramo dodati korisnički račun (u ovom slučaju “root”).
last root ... ... ... root pts/0 142.158.247.12 Wed Mar 25 21:15 - 22:59 (01:44) root pts/0 142.158.247.12 Wed Mar 25 20:12 - 20:55 (00:42) root pts/0 213.147.100.123 Wed Mar 25 12:02 - 12:07 (00:05) root pts/0 213.147.100.123 Wed Mar 25 11:55 - 11:56 (00:01) root pts/0 207.117.221.78 Sun Mar 22 12:27 - 17:53 (05:25) ... ... ... ... ... ...
Pomoću prekidača -n moguće je ograničiti samo zadnje unose iz statistike.
Ograničimo se na zadnja četiri unosa
last -n4 root pts/0 142.158.247.12 Wed Mar 25 20:12 - 20:55 (00:42) root pts/0 213.147.100.123 Wed Mar 25 12:02 - 12:07 (00:05) root pts/0 213.147.100.123 Wed Mar 25 11:55 - 11:56 (00:01) root pts/0 207.117.221.78 Sun Mar 22 12:27 - 17:53 (05
Moguće je i vidjet točno vrijeme kada je sustav restartan. Pogledajmo kako
last reboot ... ... ... reboot system boot 2.6.32-44-pve Wed Mar 16 21:51 - 13:17 (1+15:25) reboot system boot 2.6.32-44-pve Wed Mar 16 21:20 - 21:46 (00:26) reboot system boot 2.6.32-44-pve Thu Jan 21 15:57 - 21:46 (55+05:48) reboot system boot 2.6.32-43-pve Sat Jan 16 20:25 - 15:52 (4+19:27) reboot system boot 2.6.32-43-pve Fri Dec 11 09:37 - 15:52 (41+06:14) ... ... ... ... ... ...
Na gotovo svakom Unix ili Linux sustavu možete pronači dvije naredbe (programa) s kojima možete slati poruke drugim korisnicima koji su logirani na sustav.
write naredba se koristi za slanje poruke željenom korisniku (koji mora biti logiran na sustav).
Upotreba je :
write username tty
username je ime korisnika (korisničkog računa) kojem želimo poslati porukutty je ime terminala na koji je taj korisnik spojen (ako ne navedemo ime terminala, poruka će biti poslana na sve terminale na koje je taj korisnik spojen )Primjer :
Kao korisnik root pošaljimo poruku “Ovo je poruka” , korisniku pero
write pero Ovo je poruka
Završetak pisanja poruke, dobiva se kombinacijom tipki CTRL d.
S druge starne korisnik pero dobiva slijedeću poruku
Message from root@localhost.localdomain on pts/1 at 17:33 ... Ovo je poruka EOF
Što ako ne želimo primati poruke od drugih korisnika preko naredbe write ?
Za tu namjenu postoji naredba kojom svaki korisnik može onemogućiti primanje ovakvih poruka.
Onemogućavanje primanja poruka:
mesg n
Ponovno omogućavanje primanja poruka:
mesg y
Kako provjeriti tko je onemogućio primanje poruka ?
Za provjeru tko ima omogućeno a tko onemogućeno primanje poruka, možemo pokrenuti naredbu : who -T.
Pogledajmo kako to izgleda:
who -T root + tty1 2016-05-23 17:19 (:0) root + pts/0 2016-05-23 17:19 (:0.0) root - pts/1 2016-05-23 17:20 (:0.0) pero + pts/2 2016-05-23 17:26 (192.168.11.42)
Vidimo da je korisnik root spojen na terminal (pts/1) onemogućio primanje poruka (ima znak - ispred imena terminala).
wall naredba (Engl. Write to All) koristi se za slanje poruka svim logiranim korisnicima. Najčešće se koristi za slanje poruke o gašenju cijelog sustava (poslužitelja) i to od strane administrator (root korisnika).
Moguća su dva način upotrebe ove naredbe, koja može prihvatiti ulaznu poruku :
write.Pogledajmo oba primjera.
Slanje poruke preko standardnog ulaza. Poruka je “Gasimo sustav za 5.minuta”.
echo "Gasimo sustav za 5.minuta" | wall
Dakle sve što šaljemo preko echo naredbe dolazi kao standardni ulaz (preko “pipe”-a | ) na naredbu wall koja onda taj tekst šalje kao poruku svima.
Drugi primjer je slanje poruke poput naredbe write. S time da prvo pokrenemo naredbu wall (ENTER) pa potom pišemo poruke. Kraj pisanje poruka je isto kombinacijom tipki CTRL d
wall Gasimo sustav za 5.minuta
wall poruke primaju svi logirani korisnici kojima je postavljen : mesg y. Odnosno nije (ručno) isključeno primanje poruka a koje vrijedi i za write poruke.
Kako bi se mogli pobliže upoznati sa Linux sustavom na kojem radimo, potrebne su nam i neke osnovne naredbe, pomoću kojih ćemo saznati nešto više o samom sustavu.
Također ćemo se upoznati s naredbama koje će nam pomoći da pronađemo potrebne naredbe ili komponente sustava.
Na većini Unix i Linux sustava standardno su instalirane i detaljnije upute za svaku naredbu, koje je moguće i pretraživati .
U slučajevima kada želimo pronaći detaljnije upute naredbe koju poznajemo, koristiti ćemo naredbu man
Upute (manuals) pozivamo naredbom man . Upute (man) su podjeljene u nekoliko područja, označenih brojevima:
1 Korisničke naredbe (User Commands)
2 Sistemski pozivi (System Calls)
3 Funkcije C biblioteka (C Library Functions)
4 Uređaji i posebne datoteke (Devices and Special Files)
5 Format datoteka i konvencije (File Formats and Conventions)
6 Igre i slično (Games)
7 Razno (Miscellanea)
8 Sistemski servisi (daemoni) i alati (System Administration tools and Deamons))
Moguće je pretraživati upute za određe naredbe prema definiranim područjima (ili bez njih).
U slučaju da navodimo i područje, pretraživanje će se vršiti samo unutar definiranog područja (br. 1. do 8.).
Primjer :
1. Nađmo sve upute (iz svih područja uputa) za samu naredbu man :
man man
1.1. Nađimo upute za naredbu ls (izlistavanja sadržaja direktorija)
man ls
2. Nađimo upute za naredbu man ali samo iz područja (section -s) 1 (User Commands):
man -s 1 man
3. Nađimo upute za narebu man ali samo iz područja (section -s) 7 (Miscellanea):
man -s 7 man
4. Pretražimo whatis bazu pomoću man naredbe, za ključnu riječ ls
man -k ls
whatis naredba daje nam samo osnovni opis naredbe za koju tražimo informacije.
Osnovni opisi svih naredbi (uz pripadajuću naredbu) se pohranjuju u posebnu bazu podataka : tkzv. “whatis database”.
Pogledajmo primjer za man naredbu:
whatis man man (1) - format and display the on-line manual pages man (1p) - display system documentation man (7) - macros to format man pages man [manpath] (1) - format and display the on-line manual pages man-pages (7) - conventions for writing Linux man pages man.config [man] (5) - configuration data for man
Naredba whatis nam je vratila sve opise gdje postoji opis man naredbe.
Brojevi () u drugom stupcu ukazuju na poglavlje man naredbe u kojemu se nalaze detaljniji opisi.
Whatis baza se obićno nalazi u : /var/cache/man/whatis i nju može (re)kreirati samo root (administrator) korisnik.
Whatis baza sadrži samo imena svih naredbi uz njihov osnovni opis, izvučen iz svih man opisa.
U slučaju da smo instalirali novu naredbu u sustav, uz koju su se instalirale i man stranice (upute), potrebno je kreirati i whatis unose u whatis bazi. To se radi pomoću naredbe makewhatis, koju može pokrenuti samo root korisnk (a može potrajati neko vrijeme):
makewhatis
apropos naredba nam omogućava pretraživanje bilo koje ključne riječi iz whatis baze podataka.
U slučajevima kada ne znamo točan naziv neke naredbe ali znamo što bi ta naredba trebala raditi, možemo pretraživati bilo koji pojam ili ključnu riječ.
Potom će nam apropos dati popis svih naredbi čiji opisi sadrže ono što tražimo, uz pridruženu naredbu.
Primjer:
1. Tražimo sve naredbe koje sadrže riječ “pci”
apropos pci lspci (8) - list all PCI devices setpci (8) - configure PCI devices update-pciids (8) - download new version of the PCI ID list
Vidimo da smo dobili ponuđene tri naredbe koje u opisu imaju pojam ili riječ “pci” : lspci , setpci i update-pciids
2.Zanima nas koja naredba sadrži u opisu točan pojam : “remove a directory”, jer nas zanima kako obrisati direktorij
apropos "remove a directory" rmdir (3p) - remove a directory unlink (3p) - remove a directory entry unlinkat (2) - remove a directory entry relative to a directory file descriptor
Sada smo također dobili tri naredbe : rmdir , unlink i unlinkat , od kojih nas je zapravo zanimala naredba rmdir. Sada možemo potražiti man stranicu (upute) od naredbe rmdir.
Popis osnovnih sistemskih naredbi, pomoću kojih možemo doznati nešto više o samom Linux sustavu te o hardveru na kojem se nalazi::
uname : ispiše osnovne sistem informacijedmesg : ispiše sistemske poruke (HW Events)dmidecode: ispiše DMI (SMBIOS) info ili sadržaj /proc/ direktorijalspci : ispiše sve PCI uređajePogledajmo što nam govore gore navedene naredbe:
uname -a Linux uciona01.inkubator.hr 2.6.32-23-pve #1 SMP Tue Aug 6 07:04:06 CEST 2013 x86_64 x86_64 x86_64 GNU/Linux
Pokretanjem naredbe uname -a dobijamo nekoliko osnovnih informacija o sustavu:
Linux Dakle ovo je Linuxuciona01.inkubator.hr ovo je ime računala (Hostname)2.6.32.-23-pve ovo je verzije Linux kernelaSMP “Symmetric multi-processing” - podrška za više procesora (CPU) ili više jezgriTue Aug 6 07:04:06 CEST 2013 Datum kada je linux kernel compile-iranx86_64 x86_64 Arhitektura za koju je kernel compile-iranx86_64 Arhitektura ovog sustavaGNU/Linux OS : GNU tools / Linux kerneldmesg Initializing cgroup subsys cpuset Initializing cgroup subsys cpu Linux version 2.6.32-431.11.2.el6.x86_64 (mockbuild@x86-027.build.eng.bos.redhat.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Mon Mar 3 13:32:45 EST 2014 Command line: ro root=UUID=fb38dcf6-d76d-4191-b6e7-a5378c4fd6cc rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_LVM rd_NO_DM rhgb quiet rhgb quiet KERNEL supported cpus: Intel GenuineIntel AMD AuthenticAMD Centaur CentaurHauls ... ... ... sd 0:0:0:0: [sda] 585871964 512-byte logical blocks: (299 GB/279 GiB) sd 0:0:0:0: [sda] Write Protect is off sd 0:0:0:0: [sda] Mode Sense: 73 00 00 08 sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA sda: sda1 sda2 sda3 sda4 <sda5 sda6> sd 0:0:0:0: [sda] Attached SCSI disk ... ... ... ACPI: Power Button [PWRF] ACPI: acpi_idle yielding to intel_idle thermal LNXTHERM:01: registered as thermal_zone0 ACPI: Thermal Zone [THM0] (8 C) ERST: Failed to get Error Log Address Range. GHES: APEI firmware first mode is enabled by APEI bit and WHEA _OSC. Non-volatile memory driver v1.3 Linux agpgart interface v0.103 crash memory driver: version 1.1 Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A 00:08: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
Naredba dmesg ispisuje sve poruke sustava, od trenutka podizanja i učitavanja kernela i kernel modula (drivera) na dalje.
Na početku našeg izlistanja vidimo inicijalizaciju procesora (CPU ), ….. kasnije diskova sd (sda) , … raznih portova i sl.
Dakle na početku se inicijalizira cijeli sustav i provjeravaju i inicijaliziraju sve hardverske komponente.
Nakon što se sustav podigne , sa dmesg se vide i sve tekuće sistemske poruke. kao što su poruke :
dmidecode .... ... ... Handle 0xD100, DMI type 209, 68 bytes HP BIOS NIC PCI and MAC Information NIC 1: PCI device 04:00.0, MAC address D8:9D:68:42:3D:F1 NIC 2: PCI device 04:00.1, MAC address D8:9D:68:42:3D:F2 Handle 0x110F, DMI type 17, 34 bytes Memory Device Array Handle: 0x1001 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 8192 MB Form Factor: DIMM Set: 15 Locator: PROC 2 DIMM 8 Bank Locator: Not Specified Type: DDR3 Type Detail: Synchronous Registered (Buffered) Speed: 1600 MHz Manufacturer: HP Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Rank: 2 Configured Clock Speed: 1600 MHz
Naredba dmidecode daje nam izlistanje statusa svih bitnih harverskih kompomenti, standarno su podjeljene u nekoliko kategorija:
Dakle možemo zatražiti ispis stanja svih hardverskih kmpomenti ili naredbu pozvati s prekidaćem -t uz specifikaciju određene komponente.
Pr. Zanimaju nas podaci samo o BIOS-u računala (matične ploče):
dmidecode -t bios
# dmidecode 2.9
SMBIOS 2.31 present.
Handle 0x0000, DMI type 0, 20 bytes
BIOS Information
Vendor: ASUS // Phoenix Technologies Ltd.
Version: 7.00 R4.14.1561.02
Release Date: 11/25/2013
Address: 0xE49F0
Runtime Size: 112144 bytes
ROM Size: 2048 kB
Characteristics:
PCI is supported
PNP is supported
APM is supported
BIOS is upgradeable
BIOS shadowing is allowed
ESCD support is available
Boot from CD is supported
Selectable boot is supported
... ... ...
lspci ... ... ... 00:00.0 Host bridge: Intel Corporation Xeon E5/Core i7 DMI2 (rev 07) 00:01.0 PCI bridge: Intel Corporation Xeon E5/Core i7 IIO PCI Express Root Port 1a (rev 07) 00:01.1 PCI bridge: Intel Corporation Xeon E5/Core i7 IIO PCI Express Root Port 1b (rev 07) 00:04.0 System peripheral: Intel Corporation Xeon E5/Core i7 DMA Channel 0 (rev 07) 00:04.1 System peripheral: Intel Corporation Xeon E5/Core i7 DMA Channel 1 (rev 07) 00:05.0 System peripheral: Intel Corporation Xeon E5/Core i7 Address Map, VTd_Misc, System Management (rev 07) 00:05.2 System peripheral: Intel Corporation Xeon E5/Core i7 Control Status and Global Errors (rev 07) 00:05.4 PIC: Intel Corporation Xeon E5/Core i7 I/O APIC (rev 07) 00:11.0 PCI bridge: Intel Corporation C600/X79 series chipset PCI Express Virtual Root Port (rev 05) 00:1a.0 USB controller: Intel Corporation C600/X79 series chipset USB2 Enhanced Host Controller #2 (rev 05) 00:1c.0 PCI bridge: Intel Corporation C600/X79 series chipset PCI Express Root Port 1 (rev b5) 00:1d.0 USB controller: Intel Corporation C600/X79 series chipset USB2 Enhanced Host Controller #1 (rev 05) 00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev a5) 00:1f.0 ISA bridge: Intel Corporation C600/X79 series chipset LPC Controller (rev 05) 01:00.1 VGA compatible controller: Matrox Electronics Systems Ltd. MGA G200EH ?02:01.0 Ethernet controller: Intel Corporation 82547EI Gigabit Ethernet Controller 03:00.0 RAID bus controller: Hewlett-Packard Company Smart Array Gen8 Controllers (rev 01) 04:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM57810 10 Gigabit Ethernet (rev 11)
Naredba lspci ispisuje nam podatke o svim PCI sabirnicama i uređajim koji su se prijavili na sve PCI sistemske sabirnice.
Dakle ovdje je vidljv dobar dio hardvera. Osim osnovnog poziva naredbe, moguće je istu naredbu pozvati i sa prekidaćem -v ili -s -vv ako želimo više detalja o hardveru:
Dakle ovako:
lspci -v
ili
lspci -vv
U ovom slučaju pogledajmo detaljnije samo mrežnu karticu INTEL 82547EI:
lspci -vv
... ... ...
02:01.0 Ethernet controller: Intel Corporation 82547EI Gigabit Ethernet Controller
Subsystem: Fujitsu Technology Solutions Device 101e
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium>TAbort- <TAbort- <MAbort->SERR- <PERR- INTx+
Latency: 0 (63750ns min), Cache Line Size: 32 bytes
Interrupt: pin A routed to IRQ 18
Region 0: Memory at e0100000 (32-bit, non-prefetchable) [size=128K]
Region 2: I/O ports at 3000 [size=32]
Capabilities: [dc] Power Management version 2
Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=1 PME-
Kernel driver in use: e1000
Kernel modules: e1000
File System (datotečni sustav) je zadužen za rad s datotekama i direktorijima, tj. zadužen je za njihovo smještanje na tvrdi disk.Pošto smo rekli da je u UNIX-u/Linux-u sve datoteka (file), samim time ovaj dio sustava dobiva dodatno na važnosti.
Za razliku od Windows operatvnih sustava, Linux ne koristiFAT/FAT32/extFAT ili NTFS datotečni sustav kao primarni za rad odnosno za samsistem, na sistemskom disku/particiji.
Moderni Linuxi koriste :ext3, ext4, XFS ili druge napredne datotečne sustave.
Osnovne prednosti gore navedenih modernih Linux datotečnih sustava su:
Unix/Linux Datotečni sustav se sastoji od :
I-node tablica sadrži zapis za svaku datoteku i direktorij:
U samoj strukturi datoteka i direktorija, postoje određena pravila:
! @ $ ^ & * , ; ‘ ` “( ){ } [ ] < > | / \ ? ~ razmak
Struktura sistemskih direktorija je definirana unutar FHSa (Filesystem Hierarchy Standard).
Osnovna struktura direktorija u svim Unix ili Linux operativnim sustavima je hijerarhijska te izgleda kao stablo, kojemu je početni odnosno korijenski (Engl. root) direktorij označen sa /. Iz toga stabla se razvijaju direktoriji koji su kategorizirani prema namjeni.
Prikaz osnovne strukture sistemskih direktorijau, je vidljiv na slici:
Pogledajmo i malo detaljniju sliku hijerarhijskog stabla Unix/Linux direktorija:
Što se nalazi u kojem od osnovnih direktorija:
/bin - Osnovne sistemske naredbe (binaries), koje moraju biti dostupne i u single user načinu rada. Ovdje su dakle linux naredbe, koje su dostupne i administratoru (root korisniku) i svim ostalim korisnicima./boot – sve što je potrebno za boot (podizanje) Linux sustava, a to su: kernel -kernel koji je datoteka imena poput : vmlinuz-2.6.32-XYinitrd odnosno RAM disk koji sadrži datotečni sustav koji se učitava u RAM memoriju, prilikom podizanja sustava -ovo je datoteka poput : initrd.img-2.6.32-39-XYConfig odnosno datoteka koja dolazi uz pripadajući kernel i initrd a koja opisuje s kojim vanjskim kernel modulima i onim ugrađenim u kernel je compileiran pripadajući kernel. Ova datoteka je obično imena : config-2.6.32-39-XY.System map odnosno datoteka u kojoj je definirana Tzv symbol table tablica koja povezuje kernel simbole i njihove pripadajuće adrese./dev - svi posebni uređaji, poput generatora nula /dev/zero te sav hardver (Engl devices), odnosno posebne datoteke koje ih predstavljaju, poput :/dev/hda - prvi ATA disk (Primarni MASTER)/dev/sda - prvi SATA ili SCSI disk/dev/ttyS0 - prvi serijski port računala/dev/lp0 - prvi paralelni port na računalu/etc – Sve konfiguracijske datoteke, obično rasporešene unutar poddirektorija, od kojih je svaki od njih za pripadajući servis (daemon). U vršnom stablu ovog direktorija, nalaze se i važne sistemske, konfiguracijske datoteke, poput :fstab definicije auto mount particija/datotečnih sustava, koji se povezuju prilikom podizanja sustavapasswd liste i definicije korisnika shadow kriptiranih (zapravo hasheva) lozinki za sve korisnikegroup definicije korisničkih grupahosts tablice s imenima računala i njihovim pripadajućim IP adresama : IP - ime računala/home – direktoriji korisnika (home directory). Svaki korisnik ima svoj home direktorij unutar ovog direktorija./lib – sve sistemske biblioteke te biblioteke za razne aplikacije (Engl. library). Osim toga ovdje se nalaze i poddirektoriji u kojima su kernel moduli (upravljački programi), firmware za sav hardver (za koji je to potrebno) i slično./proc – virtualni datotečni sustav (kreira se u RAM memoriji, kod svakog podizanja sustava) koji daje informacije o svim procesima, poruke kernela te sistemske atribute (koje je moguće mijenjati). Naredbe ps , top , free za ćitanje iz njega te primjerice sysctl i slične za čitanje i zapisivanje u specifične datoteke unutar ovog direktorija. Kreira ga “proc(fs)” u trenutku podizanja sustava./sys – virtualni datotečni sustav (kreira se u RAM memoriji, kod svakog podizanja sustava) koji strukturirano i uniformirano prikazuje informacije o sustavu te nudi kontrolu nad njim. Upravljački programi (engl. Driver) pomoću kernela kreiraju svoju strukturu direktorija i datoteka (slično kao kod /proc/ ali na strukturiran način). Ovdje se također nalaze i informacije i konfiguracije (koje je moguće mijenjati.) Kreira ga “sysfs” u trenutku podizanja sustava. Svi noviji procesi koriste ovaj sustav !./sbin - Ovdje se također nalaze sistemske naredbe ali koje su dostupne samo administratorima (root korisniku i svima ostalima s root ovlastima)/usr - ovdje se nalaze standardni višekorisnički (multiuser) programi, podaci i drugo./var – varijabilni (promijenjivi) podaci, poput log datoteka, cache datoteka i slično. Obično se nalaze u poddirektorijima, svaki za svoju namjenu. Tako se recimo u poddirektoriju /var/log/httpd nalaze log datoteke za web poslužitelj, jedna za greške (error_log) , jedna u koju se upisuje svaki pristup na web poslužitelj (access_log) i sl.
Tipovi direktorija i datoteka su vidljivi kod izlistanja datoteka i/ili direktorija [potpuno lijeva oznaka]
Pogledati ćemo nekoliko specifičnih datoteka:
/dev/sda - ovo je posebna datoteka koja predstavlja prvi SATA ili SCSI tvrdi disk/dev/tty - ovo je također posebna datoteka koja predstavlja terminal/etc/rc.d/rc.local - ovo je datoteka koja je shell skripta/etc/rc.d/rc3.d/S58ntpd - ovo je datoteka koja je također shell skriptaTe što nam govore njihove oznake.
ls -al /dev/sda /dev/tty /etc/rc.d/rc.local /etc/rc.d/rc3.d/S58ntpd brw-rw---- 1 root disk 8, 0 Apr 8 15:57 /dev/sda crw-rw-rw- 1 root tty 5, 0 Apr 7 18:15 /dev/tty lrwxrwxrwx. 1 root root 14 Dec 2 11:34 /etc/rc.d/rc3.d/S58ntpd -> ../init.d/ntpd -rwxr-xr-x. 1 root root 882 Dec 2 11:34 /etc/rc.d/rc.local
Koje sve oznake postoje za datoteke i direktorije :
d ] Predstavlja direktorij-] Predstavlja običnu datotekuOsim standardnih, postoje i posebne vrste datoteka, koje predstavljaju logičke jedinice, poput:
/dev/zero (generator nula [0] )/dev/random (generator slučajnih brojeva [random] )Osim logičkih jedinica, postoje i dodatne vrste posebnih datoteka u koje spadaju:
l ] Predstavlja simbolički link p ] Predstavlja named pipe datoteku ili samo pipe (FIFOs). Named pipe radi slično poput “character device” uređaja ali se ne radi o direktnom pristupu uređaju preko njegovog upravljačkog programa. Ovdje se radi o toku podataka prema drugom procesu.s ] Predstavlja socket file. On predstavlja posebnu vrstu I/O (ulazno/izlaznog) toka podataka koji se koristi za mrežnu komunikaciju, kao i kod komunikacije između procesa (Engl. Inter process communication) odnosno IPC. U slučaju upotrebe kod mrežne komunikacije - otvara se mrežni komunikacijski kanal, na koji se može direktno spajati odnosno primati ili slati podatke. Ista stvar je i kod komunikacije između procesa (programa).Za više detalja, pogledajte napredno poglavlje " Napredno: File Descriptors ".
Postoji i druga grupa koja predstavlja neki odnosno sami uređaj (device file):
c ] Predstavlja character device: barata s IO, karakterima (znakovima). Omogučavaju čitanje ili pisanje niza znakova. Na vrlo niskoj razini, kada čitamo ili zapisujemo na neki character device kernel prosljeđuje niz znakova (“karaktera”) direktno na odredišni uređaj, bez ikakve kontrole ili zapisivanja nekih aktivnosti ili stanja u toku operacije čitanja ili zapisivanja. Pristupa se zapravo direktno na upravljački program uređaja te samim time (in)direktno na uređaj. Uređaji koji se koriste kao character su obično miš, tipkovnica, pisač i sl.b ] Predstavlja block : barata s IO (ulazno/izlaznim), blokovima podataka. Ovim uređajima se pristupa, odnosno na njih se zapisuje ili se s njih čita u blokovima podataka. Za razliku od character uređaja na vrlo niskoj razini, blokovi podataka koji se čitaju ili zapisuju, mogu prolaziti kroz međuspremnike (engl. buffers) te se u pravilu bilježe razni parametri pristupa ovim uređajima, kao i transakcijama s i na njih. Uređaji koji se koriste kao “block” uređaji su uglavnom diskovni sustavi ili sustavi za pohranu podataka, poput tvrdih diskova, SSD diskova, uređaja za izradu sigurnosnih kopija (engl. Backup devices).Iz nekoliko primjera izlistanja direktorija i datoteka će sve biti puno jasnije:
ls -al / drwxr-xr-x 20 root root 4096 Jun 13 12:53 ./ drwxr-xr-x 20 root root 4096 Jun 13 12:53 ../ drwxr-xr-x 2 root root 4096 Mar 25 2011 bin/ drwxr-xr-x 2 root root 4096 Oct 6 1997 boot/ drwxr-xr-x 17 root root 69632 Nov 11 15:20 dev/ drwxr-xr-x 19 root root 4096 Nov 11 15:20 etc/ drwxr-xr-x 2 root root 4096 Oct 6 1997 home/ drwxr-xr-x 4 root root 4096 May 4 2011 lib/ dr-xr-xr-x 17 root root 0 Nov 11 15:20 proc/ drwxr-xr-x 15 root root 4096 Jun 13 12:53 usr/ drwxr-xr-x 11 root root 4096 Jun 13 12:53 var/
Ovdje su vidljivi samo obični direktoriji [ d ]
ls -al /dev/sda1 brw-rw----. 1 root disk 8, 1 Nov 11 17:36 /dev/sda1
Ovdje smo odabrali posebni (device file) koji predstavlja uređaj, tj. konkretno prvi SATA ili SCSI Hard Disk i to njegovu prvu particiju (o tome kasnije). On ima oznaku [ b ]
ls -al /dev/ttyS0 crw-rw----. 1 root dialout 4, 64 Nov 11 17:36 /dev/ttyS0
Ovdje je također odabran poseban (device file), koji je konkretno prvi serijski port na računalu (RS232). Oznaka je [ c ]
ls -al /dev/cdrom lrwxrwxrwx. 1 root root 3 Nov 11 17:36 /dev/cdrom -> sr1
Sada je vidljiv simbolički link, koji za CDROM uređaj pokazuje na fizički uređaj oznake sr1. Oznaka simboličkog linka je [ l ]
U ovoj cjelini upoznati ćemo s s još jednom posebnom vrstom datoteke.
Named pipe ponaša se slično kao i obični pipe uz nekoliko razlika:
Kreiranje Named pipe datoteke imena my_pipe
mkfifo my_pipe
Nakon što smo kreirali “Named Pipe” , Kreirati ćemo “pipe” koji će komprimirati sve što uđe u njega i stvoriti komprimiranu datoteku imena komprimirana.datoteka.gz:
gzip -9 -c <my_pipe> komprimirana.datoteka.gz &
Sada ćemo poslati svoju datoteku (datoteka.txt) na komprimiranje
cat datoteka.txt> my_pipe
Brisanje “Named pipe” datoteke (isto kao i za bilo koju drugu datoteku)
rm my_pipe
Kao što smo i prije rekli, sada postaje jasno da “Everything is a file” ima sve više smisla.
Slijedi još nekoliko primjera.
Dakle /dev/zero je posebna datoteka koja je generator nula (0), koju ćemo iskoristiti za generiranje nula unutar jedne datoteke, imena sve.nule.txt . Osim toga želimo da veličina datoteke bude 1024 byte-a.
Za rad s ovom posebnom datotekom koristiti ćemo program disk dump ( dd ), koji se koristi za konvertiranje i kopiranje datoteka, a pošto je u Unix/Linux svijetu sve datoteka, to ćemo i iskoristiti.
Ali prvo da vidimo koje sve prekidaće naredba dd ima.
Lista nekoliko osnovnih prekidaća:
if - input file (ulazna datoteka)of – output file (izlazna datoteka) bs - za koliko bytea omogućavamo za čitanje/pisanje odjednom (ovo se smatra jednim blokom podataka)count - koliko ovakvih blokova podataka (iz bs ) dozvoljavamo obraditi odjednom (1, 2). Ovo možemo nazvati i brojem ponavljanja.
Ograničiti ćemo veličinu bloka ( bs=1024 ) na 1024 byte-a i to samo s jednim ponavljanjem ( count=1 )
dd if=/dev/zero of=/neki-direktorij/sve.nule.txt bs=1024 count=1 1+0 records in 1+0 records out 1024 bytes (1.0 kB) copied, 5.8944e-05 s, 170.4 MB/s
Drugi primjer će biti kopiranje cijele diskete (/dev/fd0) u datoteku : /neki-direktorij/disketa.img
dd if=/dev/fd0 of=/neki-direktorij/disketa.img
U sljedećem primjeru ćemo koristiti posebnu datoteku, koja generira slučajne brojeve, vrlo brzo ( /dev/urandom) i pomoću nje generirati datoteku veličine 1MB, imena test.file i to u blokovima od 1024 byte-a , 1k (1000) puta.
dd if=/dev/urandom of=/neki-direktorij/test.file bs=1024 count=1k 1024+0 records in 1024+0 records out 1048576 bytes (1.0 MB) copied, 0.160582 s, 6.5 MB/s
sist
Putanja do neke datoteke može biti:
/ ) : pr datoteka messages.: /var/log/messages/var pa je putanja do datoteke: log/messagesOsim toga, na razini cijelog sustava postoji i shell varijabla “PATH” unutar koje su definirane putanje do svih “važnijih” direktorija u kojima se nalaze izcršne datoteke odnosno naredbe i skripte koje su važne za funkcioniranje cijelog sustava, kao i datoteke koje su potrebne za pokretanje raznih programa.
U trenutku kada želimo pokrenuti neki program/naredbu/shell ili neku drugu skriptu, sustav prvo pregledava da li se u putanji koja je navedena u varijabli “PATH” nalazi izvršna datoteka (program/naredbu/shell ili neka drugu skriptu) koju želimo pokrenuti.
Standardna putanja za root korisnika (administratora) za izvršne datoteke je :
/usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin
Više o shell varijablama pogledajte u poglavlju “Shell skripte”.
Svaki direktorij i datokeka imaju određene ovlasti (permissions). Svaki puta kada se kreira neka datoteka ili direktorij, za nju se zapisuju određene ovlasti i to : tko je njen vlasnik (owner), kojoj grupi korisnika pripada (group) te ovlasti za sve ostale (all users). Postoje i posebne naprede ovlasti koji ćemo također spomenuti.
Ovlasti (permissions) se mijenjaju s naredbom: chown, te se definiraju :
Osim toga postoje i prava pristupa i rada, koja se povezuju za gore nevadene korisnike/gupu/sve ostale , koja se mijenjaju s naredbom: chmod.
Moguće je definirati sljedeća prava pristupa
Pravo čitanja (Read) omogućava samo čitanje određene datoteke (ne i njeno mijenjanje).
Pravo pisanja (Write) omogućava i mijenjanje sadržaja datoteke. Za razliku od Windows operativnih sustava,u UNIX/Linux sustavima se pravo izvršavanja (pokretanja) datoteke dodjeljuje tako što se određenoj datoteci dodaje pravo izvršavanja (Engl. Execute), bez obzira na ekstenziju datoteke. U Windows svijetu datoteka mora imati ekstenziju pr. .exe, kako bi bila izvršna U UNIX/Linux-u to nije potrebno, dovoljno je samo execute pravo na bilo koju datoteku (naravno definirano za vlasnika, grupu ili za sve ostale) !.
Napredne ovlasti
Napredne ovlasti su :
Set UID (oktalno 4, simbolički s ili S) - Postavi “User ID” - postavlja UID od trenutnog korisnika da ima prava koja zapravo ima samo vlasnik određene datoteke.Set GID (oktalno 2, simbolički s ili S) - Postavi “Group ID” - postavlja UID od trenutnog korisnika da ima prava koja zapravo ima samo vlasnička grupa nad određenom datotekom.Sticky bit (oktalno 1, simbolički t) - U pravilu služi za označavanje datoteka ili direktorija koji ne smiju biti obrisati odnosno koje može obrisati samo vlasnik ili “root” korisnik).
Set UID i Set GID ovlasti se postavljaju kada je potrebno dozvoliti korisnicima koji inaće nemaju ovlasti nad njima (postavljene preko gore navedenih ovlasti) da dobiju ovlasti koje ima njihov vlasnik (Set UID) ili njihova vlasnička grupa (Set GID).
Dakle bilo koji korisnik koji primjerice pokrene izvršnu datoteku koja ima postavljen “Set UID” ili “Set GID” dobiva ovlasti njenog vlasnika tj. njegovog “UID”-a ili njegove pripadajuće grupe “GID”-a.
Ovo je i potencijalan sigurnosni problem, jer u slučaju malicioznih radnji, problematični korisnik dobiva prava vlasnika (UID) ili vlasničke grupe (GID) od pripadajuće (obično izvršne) datoteke.
S druge strane neki programi koji su u širokoj upotrebi, moraju biti pokrenuti s višim ovlastima od ovlasti “običnih” korisnika, stoga se u razvoju ovakvih programa, posebna pažnja posvećuje sigurnosti.
Permissions (ovlasti) se čitaju od lijevo na desno !.
Izlistanjem ( ls ) direktorija /bin iz root ( / ) direktorija će sve biti jasnije:
drwxr-xr-x 20 root root 4096 Jun 13 12:53 /bin
Pogledajmo samo oznake s lijeve strane
d rwx r-x r-x …. ….. … .. .. . . .. .. . . . .. . .. .. . .. ….. /bin
Prvi znak ima posebno značenje (pogledati poglavlje Direktoriji i datoteke) [u ovom slučaju je to znak d ]
rwx ]r-x ]r-x]
Napomena :
Postoji i iznimka za zadnja tri znaka na mjestu znaka x ( Execute ),a mogu biti i :
s ili S ili t : executable and setuid( s ) / setgid( s ) [omogućava korisnicima koji nisu “root” (admini) da mogu izvršiti/pokrenuti [execute] datoteku ] t ) [ rename (preimanovanje) ili brisanje (delete) datoteke može raditi samo vlasnik (owner) ]
Izlistavanjem sa naredbom ls , vidljive su nam simboličke oznake ovlasti (r, w , x), osim njih moguće je mijenjati ih i na druge načine. Usporedba je vidljiva na slici:
Obratite pažnju na oktalne oznake jer sve počinju s nula (0). Ova početna nula označava “posebne ovlasti” o kojima smo govorili a koje ćete upoznati kroz primjere.
Primjeri
Kao root (admin) kreirali smo datoteku test:
-rw-r--r-- 1 root root 24 2014-07-03 09:54 test
Na koje načine možemo mijenjati ovlasti :
1. Opisno
a ] svi (i vlasnik i grpa i svi ostali)u ] vlasnik (owner : user)g ] grupa (group)o ] svi ostali (other)r ] čitanje (read)w ] pisanje (write)x ] izvršavanje/pokretanje (execute)s ] SUID ili GUID (ovisno da li se nalazi pod “user” ili “group” dijelom)t ] “Sticky bit”Primjeri:
Omogućimo svima ostalima (other) mogućnost izvršavanja datoteke test
chmod o+x test
Pogledajmo sada što smo dobili (x na kraju):
ls -al -rw-r--r-x 1 root root 24 2014-07-03 09:54 test*
2. Oktalno , prema tablici , za svakog korisnika, zbrajajući vrijednosti:
| r | w | x |
| 4 | 2 | 1 |
Mapiranje (računanje) simboličkih u oktalne oznake, prema prethodnoj tablici :
| 1 | 2 | 3 (2+1) | 4 | 5 (4+1) | 6 (4+2) | 7 (4+2+1) |
| x | w | w+x | r | r+x | r+w | r+w+x |
Dakle mapiranje o oktalni prikaz se označava za svakog od : “owner/user”, “group” i “other users”.
Primjerice 755 znači:
7 za vlasnika (owner) - tj r+w+x5 za grupu (group) - tj. r+x5 za sve ostale (other users) - tj. r+x
Odnosno opisno 755 znači da:
7 : vlasnik (owner) ima prava čitanja (r) , pisanja (w) i izvršavanja/pokretanja (x)5 : grupa (group) ima prava čitanja (r) i izvršavanja/pokretanja (x)5 : svi ostali (other users) ima prava čitanja (r) i izvršavanja/pokretanja (x)Primjer : Promijenimo za :
chmod 755 test
Sada pogledajmo kako to izgleda:
ls -al -rwxr-xr-x 1 root root 24 2014-07-03 09:54 test
Napredno
Zapravo kod oktalnog dodjeljivanja ovlasti ispred prva tri broja uvijek stoji nula (0), koja označava posebne ovlasti.
Tablica prikazuje posebne ovlasti (koje su inače nula [0] )
| Set UID | Set GID | Sticky bit |
| 4 | 2 | 1 |
Proširena tablica sa ovlastima sada izgleda ovako:
| 7 (4+2+1) | 6 (4+2) | 5 (4+1) | 3 (2+1) | 4 | 2 | 1 | 1 | 2 | 3 (2+1) | 4 | 5 (4+1) | 6 (4+2) | 7 (4+2+1) |
| Set UID + Set GID + Sticky bit | Set UID + Set GID | Sticky bit + Set UID | Sticky bit + Set GID | Set UID | Set GID | Sticky bit | x | w | w+x | r | r+x | r+w | r+w+x |
Dakle ako za ovlasti od gore (755) želimo dodati i “Set UID” tada će to oktalno biti : 4755.
chmod 4755 test
isto smo mogli napraviti i simbolički
chmod u+s test
Pogledajmo što smo napravili :
ls -al -rwsr-xr-x 1 root root 0 Mar 21 20:13 test
Vidljivo je da je treća ovlast za vlasnika iz x postala s.
Osim toga, moguće je i oduzeti Execute dio ovlasti za vlasnika:
chmod u-x test
Pogledajmo sada:
ls -al -rwSr-xr-x 1 root root 0 Mar 21 20:13 test
Sada se malo slovo s promijenilo u veliko S.
Dakle sada imamo datoteku koja nije izvršna ali ima postavljen “SUID”.
Vratimo sve na početno stanje:
chmod 0755 test
Pogledajmo kako sve sada izgleda:
ls -al -rwxr-xr-x 1 root root 0 Mar 21 20:13 test
Sada vlasnik ima rxw prava, grupa rx prava i ostali rx prava.
Dakle i vlasnik i grupa i svi ostali mogu čitati pokretati ovu datoteku ali samo vlasnik ju može editirati (w).
Sada ćemo postaviti “GUID” prava - dakle prava koja se primjenjuju na grupu.
chmod g+s test
Pogledajmo kako to izgleda:
ls -al -rwxr-sr-x 1 root root 0 Mar 21 20:13 test
Vidljiva je slična situacija kao kod “SUID”-a ali na poziciji za grupu. Umjesto grupnih ovlasti “r-x” sada imamo “r-s”.
Dodatno, i ovdje je moguće maknuti “Execute” dio ovlasti za grupu ali da ostane “GUID”:
chmod g-x test
Pogledajmo kako i to izgleda
ls -al -rwxr-Sr-x 1 root root 0 Mar 21 20:13 test
Sada ponovno imamo umijesto malog slova s veliko slovo S.
Gdje se u praksi koriste posebne ovlasti ?.
Kao što smo rekli u slučajevima kada obični korisnik, kod pokretanja nekog programa mora, samo za potrebe pokretanja tog programa imati više ovlasti - obično ovlasti “root” korisnika (UNIX/LINUX Administrator).
Ova potreba postoji kod raznih mrežnih naredbi, koje “obični” korisnik ne bi mogao niti pokrenuti jer nema prava korištenja određenih resursa sustava. Najjednostavniji, školski primjer je naredba ping za testiranje dostupnosti računala na mreži.
Pogledajmo ovlasti ove naredbe, koja se inaće nalazi u direktoriju /bin/.
ls -al /bin/ping -rwsr-xr-x 1 root root 36476 Jul 23 2015 /bin/ping
Vidljivo je da je postavljen SUID (X + SUID) je na trečoj poziciji za vlasnika (koji je u ovom slučaju korisnik “root”) stoji malo slovo s.
Još kritičniji primjer je naredba passwd s kojom mijenjamo svoju korisničku lozinku (Engl. password).
Naime sve lozinke su pohranjene u datoteci /etc/shadow (za detalje pogldeajte poglavlje : ”/etc/shadow“) i samo “root” korisnik ima prava mijenjanja ove datoteke.
Pošto svaki korisnik mora imati prava promijeniti svoju lozinku, to znači da bi svaki korisnik morao imati prava pristupa ovoj datoteci. To u praksi nije tako. Dakle samo “root” ima puna prava direktnog pristupa ovoj datoteci te pristupa preko naredbe koja je zadužena za promijenu lozinke (naredbi passwd), za pojedinog korisnika.
Ovoj naredbi su stoga dodjeljena Set UID prava (pogledajmo):
ls -al /usr/bin/passwd -rwsr-xr-x. 1 root root 25980 Feb 22 2012 /usr/bin/passwd
Vidimo s na poziciji vlasnika (“root” korisnika).
Nadalje ova naredba je pisana tako da ona pri svakom pokretanju provjerava koji korisnik ju je pokrenuo.
Tada ona omogućava korisniku koji ju je pokrenuo da može mijenjati datoteku /etc/shadow i to samo i isključivo onaj dio koji se tiće korisnika koji ju ju pokrenuo. Konkretno samo red (liniju) u kojemu je pohranjena lozinka za trenutnog korisnika, i to stupac u tom redu u kojemu je stvarno pohranjena njegova lozinka.
To se upravo i događa kod pokretanja ove naredbe, koja se pokreće sa “root” pravima.
Još “posebniji” slučajevi
Moguće je dodjeliti “Set GID” ovlasti na direktorije sa naerdbom chmod g+s na željeni novi direktorij.
S ovima dobivamo mogućnost da novo kreirani direktoriji nasljeđuju “Set GID” postavljeni bit.
To znači da će svaka novo kreirana datoteka ili poddirektorij i sve datoteke u njemu naslijediti mogućnost korištenja datoteka sa posbnim ovlastima od grupe čiji je “Set GID” postavljen.
Ova mogućnost vrijedi samo za sve nove datoteke koje su kreirane nakon postavljanja “Set GID” na određeni direktorij.
U slučaju potrebe kako bi se određenom postojećem direktoriju (i svim postojećim datotekama unutar njega, nasljeđivanjem) postave “Set GID” ovlasti, potrebno je napraviti slijedeće:
Primjer - upotrebom naredbe find
find /putanja-do-zeljenog-direktorija/direktorij -type d -exec chmod g+s '{}' \;
Primjer - direktno upotrebom naredbe chmod- rekurzivno.
chmod -R g-s /putanja-do-zeljenog-direktorija/direktorij
Sada ćemo vidjeti kako izgledaju ovlasti, te što je još vidljivo na razini datoteka i direktorija. Pogledajmo primjer izlistanja sadržaja direktorija:
Što je ovdje vidljivo ?
Kada kreiramo bilo koji direktorij ili datoteku ona se kreira s određenim (definiranim) ovlastima, koje se čitaju iz sistemske varijable umask
(default je 022). Obično je definirana u : /etc/profile
Vrijednost umask varijable oduzima se od:
777 – 022 = 755 666 – 022 = 644 Ovo znači da će kod svakog kreiranja novog direktorija, direktorij biti kreiran sa ovlastima 755 , dok će novokreirane datoteke imati ovlasti 644.
Pimjeri:
Promijeni vlasnika u pero i grupu u server za datoteku /root/podaci/test.sh
chown pero:server /root/podaci/test.sh
Promijeni ovlasti na datoteci /root/podaci/test.sh da bude i izvršna (read+write+execute), samo za vlasnika
chmod 0744 /root/podaci/test.sh
Promijeni vlasnika (pero) i grupu (server) za direktorij /root/podaci te sve poddirektorije i sve datoteke rekurzivno :
chown -R pero:server /root/podaci
U ovom poglavlju upoznati ćemo se s nekim od osnovnih linux naredbi:
cd - promijeni direktorij (change directory)ls - ispis direktorija/datoteka (list directory contents)pwd - ispis trenutnog direktorija (Print Working Directory)date - ispis datuma i satacal - ispis kalendara (calendar)man - ispis uputa (manual) za neku naredbu (pr.: man date) [objašnjeno u zasebnom poglavlju]
Pogledajmo i primjere njihove upotrebe
Primjeri
1. Uđimo u direktorij /home, potom u /home/ucenik (naredba cd)
cd /home cd ucenik
1.1 Vratimo se iz /home/ucenik/ u /home/ (naredba cd )
cd ..
2. Pogledajmo gdje se nalazimo (naredba pwd)
pwd /home
3. Izlistajmo sadržaj direkorija (naredba ls sa prekidačem -al):
ls -al total 12 drwxr-xr-x. 3 root root 4096 Jul 22 21:30 . dr-xr-xr-x. 21 root root 4096 Jul 24 16:50 .. drwx------ 6 ucenik ucenik 4096 Jul 24 18:49 ucenik
4. Provjerimo trenutni datum i vrijeme (naredba date):
date Thu Jul 24 19:03:49 CEST 2014
5. Ispišimo kalendar za tekuči mjesec (naredba cal)
cal
July 2014
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 ''24'' 25 26
27 28 29 30 31
6. Ispišimo upute (manual [man]) za naredbu cal:
man cal
CAL(1) BSD General Commands Manual CAL(1)
NAME
cal - displays a calendar
SYNOPSIS
cal [-smjy13] [[[day] month] year]
DESCRIPTION
Cal displays a simple calendar. If arguments are
not specified, the current month is displayed.
The options are as follows:
-1 Display single month output. (This is the
default.)
-3 Display prev/current/next month output.
-s Display Sunday as the first day of the
week.
-m Display Monday as the first day of the
... ... ...
U radu s naredbama koje slijede malo ćemo se dublje upoznati s već naučenim naredbama te ćemo naučiti i neke nove
U ovom poglavlju upoznati ćemo se s naredbama za rad s direktorijima i datotekama
cd (change directory) - promjeni trenutni radni direktorij ls - izlistaj sadržaj trenutnog (radnog) direktorija pwd - pokaži nam u kojem se direktoriju trenutno nalazimo mkdir IME-DIREKTORIJA - kreiraj direktorij imena IME (make directory) mv IME1 IME2 (move) prebaci direktorij IME1 u IME2mv ime-datoteke ime-dir (move) prebaci datoteku u direktorijmv staro-ime novo-ime (move) prebaci datoteku prvog imena u drugo imermdir IME – obriši direktorij imena IME (remove directory): rm -rf IMEZa dublje upoznavanje s gore navedenim naredbama, proći ćemo kroz primjere
Primjeri :
Kreirajmo direktorij sa poddirektorijem u njemu (/root/test/test1)
mkdir -p /root/test/test1
Prekidač -p je naredbi mkdir naznačio da je osim glavnog direktorija (/root/test) potrebno kreirati i poddirektorij unutar njega.
Kreiraj datoteku imena proba.txt unutar /root/test/test1/ direktorija
touch /root/test/test1/proba.txt
Probajmo sada ući u direktorij /root/test/test1.
cd /root/test
Moguće je i relativno kretanje po direktorijima.
To znači da ćemo iz trenutnog direktorija /root/test/ ući u direktorij /root/test/test1 ali ne daju apsolutnu putanju do tog direktorija (/root/test/test1) već relativnu (u odnosu na našu lokaciju)
cd test1
Provjerimo gdje se nalazimo (u stablu direktorija), pomoću naredbe pwd
pwd /root/test/test1
Vratimo se jedan direktorij unazad. Za ovo se koristi naredba cd ... Pri tome .. označavaju direktorij iznad.
cd ..
Pogledajmo gdje se sada nalazimo
pwd /root/test
Izlistajmo sadržaj trenutnog direktorija s naredbom ls i prekidačem -al koji nam daje detaljan ispis
-a daje sve detalje i skrivene datoteke (ili direktorije)-l daje listu dodatnih vrijednostils -al total 20 drwxr-xr-x 3 root root 4096 Jun 1 13:34 . dr-xr-x---. 10 root root 4096 Jun 1 13:27 .. -rw-r--r-- 1 root root 16 Jun 1 13:29 lista.txt -rw-r--r-- 1 root root 14 Jun 1 13:30 popis-polaznika.txt drwxr-xr-x 2 root root 4096 Jun 1 13:34 test1
U prvom stupcu su ovlasti (permissions) , u drugom (posebna) oznaka, pa vlasnik, grupa , veličina , datum kreiranja (o detaljima kasnije u poglavlju o ovlastima )te na kraju imena datoteka.
Filtrirati ćemo samo zadnji stupac s imenima:
| Ime datoteke ili direktorija | Opis |
. | Označava trenutni direktorij |
.. | Označava jedan direktorij ispred (prije ovoga u kojem se nalazimo) |
lista.txt | Datoteka imena lista.txt |
popis-polaznika.txt | Datoteka imena popis-polaznika.txt |
test1 | Direktorij imena test1 |
Uđimo u poddirektorij /root/test/test1
cd test1
Sada ćemo izlistati sadržaj direktorija ispred ali korištenjem ..
ls -al ../ total 20 drwxr-xr-x 3 root root 4096 Jun 1 13:34 . dr-xr-x---. 10 root root 4096 Jun 1 13:27 .. -rw-r--r-- 1 root root 16 Jun 1 13:29 lista.txt -rw-r--r-- 1 root root 14 Jun 1 13:30 popis-polaznika.txt drwxr-xr-x 2 root root 4096 Jun 1 13:34 test1
Na isti način možemo izlistati i još jedan direktorij iznad :
ls -al ../.. dr-xr-x---. 10 root root 4096 Jun 1 13:27 . dr-xr-xr-x. 23 root root 4096 Jun 1 13:26 .. -rw-------. 1 root root 1094 Nov 2 2014 anaconda-ks.cfg -rw-------. 1 root root 22008 Jun 1 13:28 .bash_history -rw-r--r--. 1 root root 18 May 20 2009 .bash_logout -rw-r--r--. 1 root root 176 May 20 2009 .bash_profile -rw-r--r--. 1 root root 207 Jan 30 10:37 .bashrc -rw-r--r--. 1 root root 100 Sep 23 2004 .cshrc -rw-r--r-- 1 root root 0 Mar 21 16:16 file.sh ... ... ....
Isto smo mogli napraviti i sa apsolutnom putanjom /root/
ls -al /root/
Vratimo se u direktorij /root/test/
cd /root/test
Izlistajmo sadržaj direktorija ali osnovno - samo naredba ls bez prekidača
ls lista.txt popis-polaznika.txt test1
Vidimo listu i datoteka i direktorija.
A sada probajmo vidjeti listu, ali sa svakim unosom u drugom redu prekidač -1
ls -1 lista.txt popis-polaznika.txt test1
Izlistajmo samo datoteke i direktorije -l prekidač naredbe ls daje nam detaljno izlistanje.
ls -l total 12 -rw-r--r-- 1 root root 16 Jun 1 13:29 lista.txt -rw-r--r-- 1 root root 14 Jun 1 13:30 popis-polaznika.txt drwxr-xr-x 2 root root 4096 Jun 1 13:34 test1
Izlistajmo ponovno sve datoteke i direktorije ali poredane po zadnjem vremenu promjene.
Za ovu potrebu koristimo prekidač -t (time)
ls -lt total 12 -rw-r--r-- 1 root root 19 Jun 1 14:36 popis-polaznika.txt drwxr-xr-x 2 root root 4096 Jun 1 13:34 test1 -rw-r--r-- 1 root root 16 Jun 1 13:29 lista.txt
Vidimo na je na vrhu datoteka popis-polaznika.txt koju smo zadnju mijenjali (snimali).
Možemo i koristiti prekidač za negaciju -r u kombinaciju s vremenom pa ćemo dobiti izlistanje prema vremenu promjene ali od starijih prema novijima (suprotno od prethodnog primjera):
ls -ltr total 12 -rw-r--r-- 1 root root 16 Jun 1 13:29 lista.txt drwxr-xr-x 2 root root 4096 Jun 1 13:34 test1 -rw-r--r-- 1 root root 19 Jun 1 14:36 popis-polaznika.txt
Sada je pri vrhu datoteka koja je zadnja mijenjana.
MOžemo koristiti i rekurzivni ispis (sve datoteke i direktorije unutar postojećeg direktorija i svih direktorija unutar njih - koliko god ih bilo u dubinu). Prekidač za rekurzivan ispis je veliko slovo R tj. -R.
ls -lR .: total 12 -rw-r--r-- 1 root root 16 Jun 1 13:29 lista.txt -rw-r--r-- 1 root root 19 Jun 1 14:36 popis-polaznika.txt drwxr-xr-x 2 root root 4096 Jun 1 13:34 test1 ./test1: total 0 -rw-r--r-- 1 root root 0 Jun 1 13:34 proba.txt
Ovdje vidimo sadržaj trenutnog direktorija te direktorija unutar njega (test1)
naredba ls ima još cijeli niz prekidača koje ćemo koristiti u naprednim poglavljima a sada ćemo ih samo spomenuti.
ls naredba i prekidači :
-a ispisuje i skrivene datoteke-h “Human readable” - daje ispis veličine datoteka u KB, MB ili GB umjesto u byte-ima-i daje nam i podataako i-node-u (pogledajte poglavlje Hard linkovi i inode)-l daje detaljan ispis (ovlasti, vrijeme promjene, vlasnika, grupu, …)-n numerički ispis vlasnika i grupe umjesto imena (tj. UID i GID)-r reverzno (daje obrnuto značenje prethodnik prekidača)-R rekurzivan ispis svih datteka i direktorija unutar postoječeg direktorija-t ispis prema vremenu promjene datoteke/direktorija-s ispiši stvarno zauzeće datoteke na disku (ovo vrijedi samo za Tzv ”Sparse“ datoteke)-S sortiraj po veličini datoteke
Promijenimo ime datoteke lista.txt u nova-lista.txt
mv lista.txt nova-lista.txt
Sada imamo slijedeće stanje
ls -l -rw-r--r-- 1 root root 16 Jun 1 13:29 nova-lista.txt -rw-r--r-- 1 root root 19 Jun 1 14:36 popis-polaznika.txt drwxr-xr-x 2 root root 4096 Jun 1 16:47 test1
Promijenimo ime direktorija (unutar kojega se nalaze datoteke) test1 u novi-test
mv test1 novi-test
Pogledajmo sada :
ls -l -rw-r--r-- 1 root root 16 Jun 1 13:29 nova-lista.txt drwxr-xr-x 2 root root 4096 Jun 1 16:47 novi-test -rw-r--r-- 1 root root 19 Jun 1 14:36 popis-polaznika.txt
Sada prebacimo datoteku nova-lista.txt iz našeg trenutnog (radnog) direktorija u direktorij koji smo preimenovali novi-test
mv nova-lista.txt novi-test
I sada je vidljivo da ove datoteke više nema u trenutnom direktoriju.
ls -l drwxr-xr-x 2 root root 4096 Jun 1 17:28 novi-test -rw-r--r-- 1 root root 19 Jun 1 14:36 popis-polaznika.txt
Već se nalazi u poddirektoriju novi-test:
ls -l novi-test/ -rw-r--r-- 1 root root 16 Jun 1 13:29 nova-lista.txt -rw-r--r-- 1 root root 0 Jun 1 13:34 proba.txt
Rekurzivno obriši (! oprez !) direktorij novi-test i sve datoteke u njemu kao i sve njegove poddirektorije i datoteke u njima (ako ih ima).
Prekidači koje koristimo su :
-r rekurzivno brisanje svog sadržaja (svih datoteka i direktorija) počevši od navedenog pa sve unutar njega-f (Force) odnosno nasilno brisanje, bez pitanja i upozorenjarm -rf novi-test
U ovom primjeru biti će obrisano sve unutar direktorija novi-test bilo koliko se u njemu nalazilo datoteka ili poddirektorija (jer smo koristili prekidač -r).
Za kreiranje datoteka, možemo koristiti slijedeće naredbe:
touch IME – kreiraj praznu datoteku imena IMEcat > IME – kreiraj datoteku imena IME (upisati sadržaj , CTRL d za kraj i snimanje)vi IME – kreiraj datoteku imena IME i editiraj istu sa vi tekst editoromecho > IME – kreiraj praznu datoteku imena IMEdd - NAPREDNO (disk dump) – koristi se i za druge namjene ali je s njom moguće kreirati datoteke sa željenim sadržajem
Primjeri
1. Kreirajmo praznu datoteku imena prazno1.txt
touch prazno1.txt
2. Kreirajmo drugu praznu datoteku prazno2.txt (nakon pozivanja ove metode kreiranja datoteke za kraj stisnuti CTRL d)
cat> prazno2.txt CTRL d
3. Kreirajmo datoteku imena prazno3.txt , pomoću vi tekst editora (o vi editoru u kasnijim poglavljima)
vi prazno3.txt
4. Kreirajmo praznu datoteku imena prazno4.txt
echo > prazno4.txt
5. Upišimo tekst “TEST” u datoteku prazno1.txt, pomoću naredbe echo
echo "TEST"> prazno1.txt
NAPREDNO
dd naredba se može koristiti za kreiranje datoteka određene veličine, odnosno popunjenih s nekim podacima ili za posebne namjene.
cat IME- ispis datoteke (stdout) ili povezivanje više njih (concatenate)
more IME- ispis datoteke na standardni izlaz, ekran po ekran
less IME- napredna verzija more
head IME- ispis samo početka datoteke (stdout)
tail IME- ispis samo kraja datoteke (stdout)
Primjeri
1. Ispišimo sadržaj datoteke prazno1.txt (iz prethodnog poglavlja), pomoću naredbe cat
cat prazno1.txt TEST
2. Ispišimo sadržaj datoteke (/etc/profile) pomoću naredbi more i less (njihova puna funkcionalnost vidljiva je tek kod ispisa dužeg teksta)
more /etc/profile ....
Napomena : Naredba more prikazuje tekst, koji je moguće skrolati (gore/dolje), pretraživati i sl.
U slučaju izlistanja dužeg teksta (na više stranica) Izlazak je tipka Q
less /etc/profile TEST
Napomena : Naredba less prikazuje tekst, koji je moguće skrolati (gore/dolje), pretraživati i sl.
Izlazak je tipka Q
3. Ispis pomoću naredbe head se koristi kada želimo ispisati samo početak neke datoteke (pr. /etc/profile):
head /etc/profile ......
4. Ispis pomoću naredbe tail se koristi kada želimo ispisati samo kraj neke datoteke (isti primjer datoteke : /etc/profile
tail /etc/profile ........
mv IME1 IME2 (move) – prebacivanje
mv ime-datoteke ime-dir (move)mv staro-ime novo-ime (move)
rm IME Brisanje (remove)
cp izvor odredište Kopiranje (copy)
Primjeri
Izlistajmo prvo direktorije i datoteke:
ls -al total 16 drwxrwxr-x 3 ucenik ucenik 4096 Jul 21 21:57 . drwx------ 6 ucenik ucenik 4096 Jul 21 21:45 .. -rw-rw-r-- 1 ucenik ucenik 5 Jul 21 21:34 prazno1.txt -rw-rw-r-- 1 ucenik ucenik 0 Jul 21 21:33 prazno2.txt -rw-rw-r-- 1 ucenik ucenik 0 Jul 21 21:33 prazno3.txt -rw-rw-r-- 1 ucenik ucenik 0 Jul 21 21:34 prazno4.txt -rw-rw-r-- 1 ucenik ucenik 0 Jul 21 21:27 prazno.txt drwxrwxr-x 3 ucenik ucenik 4096 Jul 21 21:57 test
1. Prebacimo datoteku prazno1.txt u direktorij test
mv prazno1.txt test
2. Pogledajmo sada saržaj direktorija test , te preimenujmo datoteku prazno1.txt u puno1.txt
ls -al test total 16 drwxrwxr-x 3 ucenik ucenik 4096 Jul 21 22:00 . drwxrwxr-x 3 ucenik ucenik 4096 Jul 21 22:00 .. -rw-rw-r-- 1 ucenik ucenik 5 Jul 21 21:34 prazno1.txt drwxrwxr-x 2 ucenik ucenik 4096 Jul 21 21:57 test1
cd test mv prazno1.txt puno1.txt
Pogledajmo sada sadržaj direktorija:
ls -al total 8 -rw-rw-r-- 1 ucenik ucenik 5 Jul 21 21:34 puno1.txt drwxrwxr-x 2 ucenik ucenik 4096 Jul 21 21:57 test1
3.Kopirajmo datoteku puno1.txt u prazno1.txt
cp puno1.txt prazno1.txt
Pogledajmo sadržaj:
ls -al total 20 drwxrwxr-x 3 ucenik ucenik 4096 Jul 21 22:08 . drwxrwxr-x 3 ucenik ucenik 4096 Jul 21 22:00 .. -rw-rw-r-- 1 ucenik ucenik 5 Jul 21 22:08 prazno1.txt -rw-rw-r-- 1 ucenik ucenik 5 Jul 21 21:34 puno1.txt drwxrwxr-x 2 ucenik ucenik 4096 Jul 21 21:57 test1
4. Sada obrišimo datoteku puno1.txt
rm puno1.txt
Pogledajmo ponovno sadržaj direktorija:
ls -al total 16 drwxrwxr-x 3 ucenik ucenik 4096 Jul 21 22:09 . drwxrwxr-x 3 ucenik ucenik 4096 Jul 21 22:00 .. -rw-rw-r-- 1 ucenik ucenik 5 Jul 21 22:08 prazno1.txt drwxrwxr-x 2 ucenik ucenik 4096 Jul 21 21:57 test1
U radu sa sadržajem datoteka (uglavnom tekstualnog formata) najčešće koristimo nekoliko osnovnih programa/naredbi.
grep (pronalazi traženi pojam unutar datoteke)cut (pronalazi tražene dijelove teksta unutar datoteke [pr. polje podataka, stupac ili sl.] )awk (programski jezik za pronalaženje i obradu uzoraka teksta)sed (koristi se ra razne transformacije teksta)Osim navedenih, postoji i veći broj pomoćnih programa, od kojih ćemo spomenuti:
wc prebrojavanje riječi u datoteciuniq izbacivanje riječi koje se ponavljaju sort sortiranje riječi (po abecedi, broju ili sl.)
Naredba grep je nastala u vrijeme nastanka prvih UNIX-a (1973). Koristi se za traženje teksta (pojma ili riječi) unutar tekstualnih podataka (datoteka). Pretraživanje grep odrađuje pregledavajući red po red u datoteci unutar koje se radi pretraživanje.
Standardno grep prikazuje sve redove (linije) u kojima je pronađen traženi tekst (pojam ili riječ).
Postoji nekoliko važnijih varijanti grep-a :
grep (standardna naredba),egrep (nadogradnja na osnovni, dodaje nove metakaraktere za regularne izraze: +, ?, | , () ), može se pozvati i sa grep -E ,fgrep, (grep optimiziran za brzo pretraživanje, ne podržava regularne izraze), može se pozvati i sa grep -F,Česti prekidaći naredbe grep
-c Ispiši samo broj pronađenih pojmova (broj ponavljanja pojma)-i Ignoriraj veliko ili malo slovo (pretraži i jednu i drugu varijantu)-n Ispiši i broj reda u kojem je pronađen traženi pojam-r Rekurzivno pretraživanje (svih direktorija i poddirektorija ispod - te naravno datoteka unutar njih)-l Samo ispiši datoteku u kojoj je pronađen traženi pojam-m Nakon koliko pronađenih istih pojmova se prekida pretraživanje (pr. -m1 će prestati dalje pretraživanje već nakon prvog pronađenog pojma )-o Ispiši samo traženi pojam koji je pronađenPrimjeri
Iz tabličnog kalkulatora (Open Office Calc ili Microsoft Excell ) smo eksportirali tablicu sa ocjenama studenata za predmeta “Uvod u Linux” i “Linux Napredno” u CSV formatu. Postoje tri stupca : Ime, Prezime i Ocjena , odvojena sa znakom ; .
Tablice sada izgledaju ovako :
cat uvod-u-linux.csv Ime;Prezime;Ocjena Ana;Anic;4 Marina;Horvat;5 Luka;Lukic;2 Pero;Peric;4 Kristijan;Kristic;5 Maja;Anic;2
cat linux-napredno.csv Ime;Prezime;Ocjena Ana;Anic;2 Marina;Horvat;4 Luka;Lukic;2 Pero;Peric;4 Kristijan;Kristic;3 Maja;Anic;2
1.Pomoću naredbe grep, unutar datoteke uvod-u-linux.csv pronađimo cijeli unos (red) od Studenta imena Ana:
grep Ana uvod-u-linux.csv Ana;Anic;4
1.1 Ispišimo i broj reda u kojem je pronađen student imena Ana (-n = Ispiši broj reda) :
grep -n Ana uvod-u-linux.csv 2:Ana;Anic;4
2. Sada nas zanima i kako izgleda unos u obije tablice (datoteke) , za istu osobu ( Ana ). Sada ćemo koristiti regularni izraz * (bilo koji znak), pošto obije datoteke u imenu imaju riječ linux i extenziju .csv
grep Ana *linux*.csv linux-napredno.csv:Ana;Anic;2 uvod-u-linux.csv:Ana;Anic;4
3. Probajmo istu pretragu ali da se ignoriraju velika i mala slova - sada ćemo tražiti ime ana (malim slovima).
grep -i ana *linux*.csv linux-napredno.csv:Ana;Anic;2 uvod-u-linux.csv:Ana;Anic;4
4. Pretražimo sve direktorije i poddirektije, rekurzivno ( -r ) , počevši od trenutnog u kojem se nalazimo ( . ) i sve datoteke unutar njih koje sadrže riječ ana :
grep -r -i ana . ./uvod-u-linux.csv:Ana;Anic;4 ./linux-napredno.csv:Ana;Anic;2
4.1 Ispišimo samo datoteke u kojima je pronađeno ime Ana ili ana (-l = samo ispis imena datoteka koje zadovoljavaju kriterije pretrage)
grep -r -i ana -l . ./uvod-u-linux.csv ./linux-napredno.csv
5. Ispišimo sve ostale osim studenta ana (invert match = -v) iz datoteke : inux-napredno.csv
grep -v -i ana linux-napredno.csv Ime;Prezime;Ocjena Marina;Horvat;4 Luka;Lukic;2 Pero;Peric;4 Kristijan;Kristic;3 Maja;Anic;2
6. Prebrojimo koliko studenata se preziva Anic , u istoj datoteci (-c = prebrojavanje)
grep -c Anic linux-napredno.csv 2
7.Pronađimo više unosa istovremeno . Nađimo prezimena Anic i Lukic :
7.1. Pomoću naredbe grep (potrebno je odvajati pojmove sa pipe ( | ) ali ga moramo pozivati sa \| ):
grep 'Anic\|Lukic' uvod-u-linux.csv Ana;Anic;4 Luka;Lukic;2 Maja;Anic;2
7.2. Pomoću naredbe egrep (ovdje ne moramo koristiti escape \ karakter za pipe znak | ):
egrep 'Anic|Lukic' uvod-u-linux.csv Ana;Anic;4 Luka;Lukic;2 Maja;Anic;2
7.3 U datoteci /proc/cpuinfo, koja sadrži podatke o procesoru (CPU), ispišimo sve zastavice (Engl. Flags ) koje nam daju listu svih funkcionalnosti CPU-a.Dakle prvo pretražujemo pojam flags. Potom pronađimo funkcionalnost aes jer nas zanima dali naš CPU ima podršku za hardversku akceleraciju AES alogritma za kriptiranje i dekriptiranje.
Ovo ćemo napraviti u dva koraka (da bude razumljivije).
grep -m1 flags /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf cpuid_faulting pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase bmi1 avx2 smep bmi2 erms invpcid xsaveopt
Sada smo dobili samo prvo spominjanje (pomoću -m1) riječi/pojma flags jer se on pojavljuje u ispisu za svaki u CPU jezgru (Engl. CPU core) pa nama ne treba isti podatak koji se pnavlja istib roj puta koliko ima jezgri procesora.
Sada ćemo ponoviti sve prethodno uz dodatak da želimo ispisati pojam aes ako ga ima.
grep -m1 flags /proc/cpuinfo | grep -o aes aes
Dobili smo potvrdu da naš CPU hardverski podržava set instrukcija aes.
Naredba cut se koristi za procesiranje odnosno pronalaženje dijelova teksta poput određenog stupca teksta ili sl. cut procesira red po red (linuju po liniju) koji može segmentirati prema nekom od željenih separatora.
Separatori mogu biti :
-c omogućava separaciju prema karakterima (Engl Character) tj. “slovima”. Primjer bi bio ispis svakog drugog slova iz svakog novog reda teksta (u datoteci) (-c2)-d omogučava separaciju prema određenom polju koje predstavlja određeni stupac podataka. Primjer bi bila CSV (Engl. comma-separated values) datoteka iz nekog tabličnog kalkulatora (poput MS Excel ili OpenOffice Calc) programa, koja je snimljena u CSV formatu u kojem je delimiter pr. znak ;. U tom slučaju sve što se nalazi između dva znaka ; predstavlja drugi stupac unutar velike tablice (-d”;“).-b omogučava separaciju prema broju byte-a. Primjerice uzimanje prva četiri byte-a iz svakog novog reda (-b1-4).Pogledajmo nekoliko primjera:
Primjeri
1. Imamo datoteku u kojoj su sadržani podaci o korisnički računima /etc/passwd u kojoj se nalaze sljedeći podaci :
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh
Želimo izvući samo drugi stupac - to bi bilo drugo slovo (znak). To ćemo napraviti na sljedeći način:
cut -c2 /etc/passwd o a i y y a
Dakle dobili smo ispisano samo drugo slovo, kako smo i htjeli.
2. Želimo izvući sve što se nalazi u prvom stupcu iste datoteke od gore, što je zapravo lista imena korisničkih računa. Naime u toj CSV datoteci delimiter (oznaka stupca) je znak :.
cut -d':' -f1 /etc/passwd root daemon bin sys sync games
Prekidač -d koristimo da bi rekli naredbi da je delimiter u ovoj CSV datoteci znak : a prekidač -f da bi joj rekli da želimo damo prvi stupac -f1.
3. Želimo izvući sve što se nalazi u prvom (korisničko ime) i sedmom (shell od tog korisnika) stupcu iste datoteke od gore te zamijeniti delimiter sa znakom ; jer nam to treba za novu CSV datoteku u kojoj će delimiter biti ;.
cut -d':' -f1,7 --output-delimiter=';' /etc/passwd root;/bin/bash daemon;/bin/sh bin;/bin/sh sys;/bin/sh sync;/bin/sync games;/bin/sh
Vidimo da smo dobili ispisani prvi i sedmi stupac te delimiter zamijenjen sa znakom ; (kako smo i htijeli).
awk je nastao 1970 u “Bell Labs” od strane tri autora: Alfred Aho, Peter Weinberger i Brian Kernighan , koji su kombinirali :
egrep (naredba za pretraživanje),ed (tekst editor),snobol (StriNg Oriented and symBOlic Language) i
awk je interpreterski programski jezik, što znači kako se direktno izvršava bez compile-iranja, a koristi se za :
awk naredbe se nižu po principu:
awk condition { action }
tj.
awk “uvjet” {“akcija/radnja”}
Opis osnovnih naredbi za ispis :
{ print } Ispiše cijeli sadržaj
{ print $0} Ispiše cijeli sadržaj ($0 = sve)
{ print $1} Ispiše prvi stupac iz cijelog sadržaja
{ print $2} Ispiše drugi stupac iz cijelog sadržaja
{ print $1,$2} Ispiše prvi i drugi stupac iz cijelog sadržaja
Primjer
Kreirali smo datoteku awk.test.txt, sadržaja:
1 PC-1 100 121.23.45.67 3 PC-3 150 26.34.78.98 2 PC-1 20 172.156.34.22 6 PC-2 45 121.23.45.67 5 PC-1 234 26.34.78.98 4 PC-2 124 172.156.34.22 7 PC-2 23 172.156.34.22
Sadržaj predstavlja pojednostavljeni dio log datoteke u koju se snima statistika izlaza na iternet za svaku IP adresu.
1. Iz datoteke awk.test.txt, želimo prikazati sve (sadržaj cijele datoteke):
awk '{print}' awk.test.txt
1 PC-1 100 121.23.45.67 3 PC-3 150 26.34.78.98 2 PC-1 20 172.156.34.22 6 PC-2 45 121.23.45.67 5 PC-1 234 26.34.78.98 4 PC-2 124 172.156.34.22 7 PC-2 23 172.156.34.22
2. Sada želimo prikazati samo drugi stupac tj. čije računalo (hostname) je išlo na internet
awk '{print $2}' awk.test.txt
PC-1 PC-3 PC-1 PC-2 PC-1 PC-2 PC-2
3. Sada želimo prikazati drugi i treći stupac tj. koja/čija računala (hostname) su koliko puta pristupala određenim web starnicama:
awk '{print $2,$3}' awk.test.txt
PC-1 100 PC-3 150 PC-1 20 PC-2 45 PC-1 234 PC-2 124 PC-2 23
Moguće je koristiti sistemske varijable ili definirati svoje.
Sistemske varijable
Opis češće korištenik sistemskih varijabli:
NR: Keeps a current count of the number of input records.
NF: Keeps a count of the number of fields in an input record. The last field in the input record can be designated by $NF.
FILENAME: Contains the name of the current input-file.
FS: Contains the “field separator” character used to divide fields on the input record. The default, “white space”, includes any space and tab characters. FS can be reassigned to another character to change the field separator.
RS: Stores the current “record separator” character. Since, by default, an input line is the input record, the default record separator character is a “newline”.
OFS: Stores the “output field separator”, which separates the fields when Awk prints them. The default is a “space” character.
ORS: Stores the “output record separator”, which separates the output records when Awk prints them. The default is a “newline” character.
OFMT: Stores the format for numeric output. The default format is ”%.6g“.
Primjeri
1. Ispišimo brojeve linija (redova) za našu datoteku awk.test.txt
awk '{print NR}' awk.test.txt
1 2 3 4 5 6 7
2. Ispišimo ukupan broj redova unutar naše datoteke awk.test.txt
awk 'END {print NR}' awk.test.txt
7
Dakle imamo ukupno 7 redova (linija)
3. Ispišimo broj stupaca za svaku liniju (red) unutar naše datoteke awk.test.txt
awk '{print NF}' awk.test.txt
4 4 4 4 4 4 4
Vdiljivo je da za svaki red imamo 4 stupca
4. Ispišimo zadnji stupac (bez obzira koliko ih ima) unutar naše datoteke awk.test.txt
awk '{print $NF}' awk.test.txt
121.23.45.67 26.34.78.98 172.156.34.22 121.23.45.67 26.34.78.98 172.156.34.22 172.156.34.22
Varijable koje možemo sami definirati
Kao što smo i rekli ranije, moguće je definirati i svoje varijable. Pogledajmo primjere osnovnog kreiranja i korištenja svojih varijabli.
Primjer
Kreirajmo datoteku varijable.awk
U navedenoj datoteci ćemo kreirati varijablu BROJ i dodjeliti joj vrijednost 10
BEGIN {
BROJ = 10
print "vrijednost BROJ=" BROJ
}
awk program koji smo napravili, sada ćemo i pokrenuti (nakon prekidaća -f , slijedi ime awk datoteke) :
awk -f varijable.awk vrijednost BROJ=10
Dakle vidimo da smo ispisali vrijednost varijable BROJ, uz tekst koji smo joj pridružili (vrijednost BROJ=)
Programski jezik awk nam omogućava i kreiranje (i pozivanje) funkcija.
Primjer
Kreirati ćemo funkciju imena BROJAC , koju ćemo poslije pozvati.
Kreirajmo novu datoteku funkcije.awk , sa sljedećim sadržajem:
function BROJAC()
{
for (i = 0; i <10; i++)
print "BROJAC=" i
}
Dakle kreirana je funkcija BROJAC koja ima sljedeću funkcionalnost :
for (i = 0; i < 10; i++) ⇒ kreiramo FOR petlju u kojoj varijabla i ima vrijednost 0 te se povećava (increment) za 1 (i++) u svakom prolazu , sve dok ne dosegne vrijednost do 10 .
print “BROJAC=” i ⇒ ispisujemo tekst (BROJAC=) i vrijednost varijable i (koja se mijenja/povećava)
Naime ovo će biti mali brojać od 0 do 9.
Sada nam je potrebno od negdje i pozvati našu funkciju BROJAC , to ćemo postići tako da ćemo na kraj dodati sljedeći kod:
BEGIN {
BROJAC()
}
Dakle cijela datoteka sada izgleda ovako:
function BROJAC()
{
for (i = 0; i <10; i++)
print "BROJAC=" i
}
BEGIN {
BROJAC()
}
Sada ju snimimo i pozovimo:
awk -f funkcije.awk BROJAC=0 BROJAC=1 BROJAC=2 BROJAC=3 BROJAC=4 BROJAC=5 BROJAC=6 BROJAC=7 BROJAC=8 BROJAC=9
Kao i svaki drugi programski jezik awk ima i uvjete, popis uvjeta koji su podržani je :
Mi ćemo obratiti osnovi uvjet if-else, koji imaju sljedeću logiku:
if (condition) then-body [else else-body]
Primjer
Proširiti ćemo prethodni primjer pozivanja funkcija, sa dva uvjeta , kod ispisivanja brojeva :
Kopirajmo datoteku funkcije.awk u if-else.awk
Dodati ćemo sljedeći kod/redove
function BROJAC()
{
for (i = 0; i <10; i++)
if (i <= 5)
print "i je manji ili jednak 5 : " i
else
print "i je veci od 5 : " i
}
BEGIN {
BROJAC()
}
Objasnimo if else dio :
Pošto se nalazimo u for petlji koja “vrti” brojeve od 0 do 9 dodali smo :
if (i <= 5)
print "i je manji ili jednak 5 : " i
Što znači da sve dok je i manje ili jednako 5 , ispisujemo (print) i je manji ili jednak 5 : i vrijednost varijable i
else
print "i je veci od 5 : " i
I else uvjet koji kaže , a inaće ispišimo (print) i je veći ili jednak 5 : i vrijednost varijable i
Pokrenimo primjer:
awk -f if-else.awk i je manji ili jednak 5 : 0 i je manji ili jednak 5 : 1 i je manji ili jednak 5 : 2 i je manji ili jednak 5 : 3 i je manji ili jednak 5 : 4 i je manji ili jednak 5 : 5 i je veci od 5 : 6 i je veci od 5 : 7 i je veci od 5 : 8 i je veci od 5 : 9
Polje (Array) (polje) predstavlja tablicu vrijednosti koje zovemo elementima. Elemente polja razlikujemo po indeksima. Dakle polja možemo promatrati kao varijable koje sadrže više elemenata
Imena polja imaju istu sintaksu kao i imena varijabli ali ne smijemo koristiti isto ime i za polje (array) i za varijablu. u awk-u se Array (polja), definicija broja elemenata ili komponenti ne mora
definirati prije korištenja (za razliku od većine programskih jezika).
Primjeri
1. Kreirajmo datoteku imena array.awk , koja sadrži sljedeći kod:
{
IP[$4]++;
}
END {
for (var in IP){
print var, "Pristupano", IP[var]," puta"
}
}
Koristiti ćemo datoteku koja je pojednostavljena log datoteka izlaza na internet, koja u 4 stupci ima popis IP aresa kojima se pristupalo.
Datoteka awk.test.txt izgleda ovako:
1 PC-1 100 121.23.45.67 3 PC-3 150 26.34.78.98 2 PC-1 20 172.156.34.22 6 PC-2 45 121.23.45.67 5 PC-1 234 26.34.78.98 4 PC-2 124 172.156.34.22 7 PC-2 23 172.156.34.22
Mi s gore navedenim naredbama (kodom) želimo kreirati Array (polje) imena IP koja će sadržavati sve IP adrese iz 4-tog stupca naše datoteke :awk.test.txt , to smo postigli sa :
{
IP[$4]++;
}
Kod gore - ovdje kreiramo polje imena IP , u koje ubacujemo vrijednosti iz 4-tog stupca (IP arese) te ih svaki puta uvećamo (increment: ++) tj povećavamo polje, sa svakim novim elementom.
for (var in IP){
Ovdje za elemente (var) polja IP koje smo popunili u primjeru gore ,
print var, "Pristupano", IP[var]," puta"
Ispisujemo svaku pojedinu IP adresu iz polja (print var) uz pripadajući tekst te ispisujemo koliko je bilo ponavljanja iste IP adrese IP[var]
Pokrenimo naš novi program imena array.awk , na log datoteci imena : awk.test.txt :
awk -f array.awk awk.test.txt 26.34.78.98 Pristupano 2 puta 121.23.45.67 Pristupano 2 puta 172.156.34.22 Pristupano 3 puta
2. Istu stvar mogli smo pokrenuti i iz jednolinijskog awk koda, sa istim rezultatom:
awk '{IP[$4]++;} END{for (var in IP) print var, "Pristupano", IP[var]," puta"}' awk.test.txt
26.34.78.98 Pristupano 2 puta 121.23.45.67 Pristupano 2 puta 172.156.34.22 Pristupano 3 puta
3. Napraviti ćemo istu stvar i pomoću niza linux naredbi:
cat awk.test.txt | awk '{print $4}' | sort | uniq -c | sort -nr
3 172.156.34.22
2 26.34.78.98
2 121.23.45.67
Opis:
1.Ispisujemo datoteku awk.test.txt sa naredbom cat
2.Potom sa nredbom awk ispisujemo samo 4 stupac
3.Sortiramo IP adrese naredbom sort
4. Prebrojavamo broj istih IP adresa naredbom uniq -c
5. Ponovno pozivamo naredbu sort -nr ali sada da bi poredali sve po prvom stupcu (broju konekcija koje smo prebrojavali u koraku 4.).
Pomoću jezika awk, moguće je i pretraživati tekst prema nekoj ključnoj riječi.
Sintaksa je :
awk '/XY/ {print … … … }' FILE : Traži pojam XY
Primjer
Iz datoteke ocjena studenata : uvod-u-linux.csv , pronađimo sve studente koji se prezivaju Anic.
Pošto je ovo CSV datoteka u kojoj je delimiter ; pa ga moramo definirati sa -F , ali uz korištenje escape karaktera \ dakle sa -F\;
awk -F\; '/Anic/' uvod-u-linux.csv Ana;Anic;4 Maja;Anic;2
2. Isti primjer možemo proširiti i sa drugim mogućnostima awk-a, pr. filtrirajmo samo 3 stupac iz primjera gore:
awk -F\; '/Anic/ {print $3}' uvod-u-linux.csv
4
2
awk nam omogućava upotrebu aritmetičkih operacija i operatora:
Operatori :
Aritmetičke operacije:
- Oduzimanje
Popis unarnih operacija
Primjeri
1. Iz naše datoteke sa ocjenama , želimo zbrojiti sve ocjene i podjeliti ih s brojem studenata da bi dobili prosjek ocjena.
Pošto je prvi red naše CSV datoteke uvod-u-linux.csv opis, moramo ga maknuti, to ćemo napraviti pomoću naredbe tail -n +2 (ispiši sve redove počevši od drugog reda, pa sve do kraja datoteke).
Sada možemo zbrojiti sve zadnje stupce tj. treči stupac (x = x +$3) te rezultat podijeliti sa brojem svih redova (osim prvog kojeg smo maknuli) : print x/NR
tail -n +2 uvod-u-linux.csv | awk -F\; '{ x = x + $3} END { print x/NR }'
3.66667
2. Iz naše datoteke sa logovima (awk.test.txt) pristupa internetu, pomnožimo u svakom redu prvi stupac sa 2:
awk '{print $1*2}' awk.test.txt
2
6
4
12
10
8
14
Za više detalja o programskom jeziku awk, možete pogledati knjigu :
sed (Stream Editor),koristi se za parsiranje i transformiranje teksta (podataka).
? sed podržava regularne izraze
Najčešće koršteni regularni izrazi u sed-u:
* niti jedan ili bilo koliko karaktera\+ kao * ali za jedan ili više karaktera\? niti jedan ili jedan karakter\{i\} kao * ali za točno i broj karaktera\{i,j\} između i i j broja karaktera , uključujuči oba\{i,\} višeo ili jednako i karaktera. bilo koji karakter uključujuči novu liniju^ “null string” - pr. space - na početku linije$ “null string” - pr. space - na kraju linijePrimjeri.
Kreirati ćemo datoteku iena : ulaz.txt koja će sadržavati:
POCETAK 1 2 STARO 3 4 NOVO 5 KRAJ
Iz datoteke ulaz.txt svugdje gdje se pojavljuje pojam STARO, zamijeniti ćemo sa NOVO i tu snimiti u novu datoteku izlaz.txt:
sed 's/STARO/NOVO/g' ulaz.txt> izlaz.txt
Pogledajmo rezultat:
cat izlaz.txt POCETAK 1 2 NOVO 3 4 NOVO 5 KRAJ
Sada ćemo napraviti dvije zamjene odjednom:
sed 's/STARO/NOVO/g ; s/POCETAK/KRAJ/g' ulaz.txt> izlaz.txt
Što smo dobili :
cat izlaz.txt KRAJ 1 2 NOVO 3 4 NOVO 5 KRAJ
Obrišimo pojam STARO:
sed 's/STARO//' ulaz.txt> izlaz.txt
Pogledajmo rezultat:
cat izlaz.txt POCETAK 1 2 3 4 NOVO 5 KRAJ
Napomena:
Direktne promjene na datoteci mogu se raditi ako koristimo prekidač -i :
sed -i 's/STARO//' ulaz.txt
Unutar datoteke ulaz.txt obrišimo (d) prazne (^$) redove
sed -i '/^$/d' ulaz.txt
Na ispisu datoteke ulaz.txt obrišimo sve od 1 do 4 reda (uključujuči 4.)
cat ulaz.txt | sed '1,4d'
… ovo smo mogli napraviti i ovako (-e znači da slijedi sed naredba):
sed -e '1,4d' ulaz.txt 3 4 NOVO 5 KRAJ
Iz datoteke ulaz.txt obrišimo sve redove između određena dva reda koja sadrže riječi POČETAK i NOVO
sed -e '/POCETAK/,/NOVO/d' ulaz.txt 5 KRAJ
Linux naredba tr koristi se za transformaciju ili brisanje određenih karaktera (znakova).
tr naredba radi razne operacije sa pojedinim karakterima odnosno znakovima, za razliku od naredbe sed, koja radi sa cijelim stringovima (riječima).
Sintaksa
tr opcije PARAMETAR1 PARAMETAR2
Pri tome je obično “PARAMETAR1” niz koji zamjenjujemo a “PARAMETAR2” niz s kojim mijenjamo ili kao parametar može biti neka od ugrađenih funkcionalnosti samog programa. Ovo pravilo vrijedi ukoliko ne koristimo prekidač -d.
Neke od ugrađenih funkcionalnosti su
| Vrijednost | Opis |
| [:alnum:] | Sva slova i brojevi |
| [:alpha:] | Sva slova |
| [:blank:] | Svi razmaci (horizontal whitespace) |
| [:space:] | Svi razmaci ( horizontal or vertical whitespace) |
| [:cntrl:] | Svi kontrolni karakteri |
| [:digit:] | Svi brojevi |
| [:graph:] | Svi printabilni (ASCII kodovi od 32 do 127)karakteri, ne uključujuči razmak |
| [:lower:] | Sva mala slova |
| [:print:] | Svi printabilni (ASCII kodovi od 32 do 127)karakteri, uključujuči razmak |
| [:upper:] | Sva velika slova |
| … | … |
Interpreterske sekvence:
| Vrijednost | Opis |
| \\ | backslash |
| \b | backspace |
| \n | newline |
| \h | horizontal tab |
| \v | vertical tab |
Primjeri
Kreirati ćemo tekstualnu datoteku za primjer. Datoteka će se zvati “ulaz.txt”. Sadržaj je :
VELIKO malo 12345 Ovo je test (x) 67890
1. Konverzija malih slova u velika - ovo možemo izvesti na nekoliko načina: Vidjeti ćemo da su se sva mala slova konvertirala u velika.
a.
tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ < ulaz.txt VELIKO MALO 12345 OVO JE TEST (X) 67890
Ovom naredbom se radi sljedeće :
b.
tr [:lower:] [:upper:] < ulaz.txt VELIKO MALO 12345 OVO JE TEST (X) 67890
c.
tr a-z A-Z < ulaz.txt VELIKO MALO 12345 OVO JE TEST (X) 67890
Vidimo da smo na tri načina postigli istu funkcionalnost. Vidljivo je i to kako se ulazna datoteka koristi pomoću redirekcije < . Ako imamo potrebu na se izlaz odnosno rezultat zapisuje u drugu datoteku, tada se može koristiti redirekcija u drugom smijeru > i to prema novoj datoteci. Dakle u zadnjem primjeru bi to bilo:
tr a-z A-Z < ulaz.txt > izlaz.txt
2. Zamjena jednog (ili niza) alfanumerika s drugim.
Zamjenimo niz 67890 sa 12345 :
tr '67890' '12345' < ulaz.txt VELIKO malo 12345 Ovo je test (x) 12345
Zamjenimo obične zagrade ”()“ sa uglatim zagradama ”[]“
tr '()' '[]' < ulaz.txt VELIKO malo 12345 Ovo je test [x] 67890
Zamjenimo razmake sa tabovima:
tr [:blank:] '\t' < ulaz.txt VELIKO malo 12345 Ovo je test (x) 67890
Kreirajmo novu datoteku imena ulaz2.txt sadržaja:
Ovo je test
Sada ćemo sažeti višak razmaka između riječi, pomoću prekidača -s.
tr -s [:space:] ' ' < ulaz2.txt Ovo je test
Brisanje pojedinog karaktera ili niza karaktera (provjerava se svaki zasebno).
Za brisanje se koristi prekidač -d.
Obrišimo karaktere (slova) veliko “O” i malo “v” iz datoteke ulaz2.txt
tr -d 'Ov' < ulaz2.txt o je test
ili obrišimo sve brojeve iz datoteke ulaz.txt
tr -d [:digit:] < ulaz.txt VELIKO malo Ovo je test (x)
Možemo raditi i inverzne operacije, dodavanjem prekidača -c.
Sada napravimo inverznu operaciju od prijašnjeg primjera - obrišimo sve što nisu brojevi.
tr -cd [:digit:] < ulaz.txt 1234567890
A sada obrišimo (uklonimo) sve karaktere koji nisu printabilni (dakle i one koji označavju novi red ili kraj reda).
tr -cd [:print:] < ulaz.txt VELIKOmalo12345Ovo je test (x)67890
Vidimo da su se sada svi redovi spojili u jedan jr više nema posebnih karaktera na kraju svakog reda, koji upravo označavaju kraj svakog reda.
Unix/Linux format koristi samo EOL (End Of Line) na kraju svakog reda, EOL ima heksadecimalnu vrijednost “0A”. Dakle mi smo praktično obrisali “nevidljivi” karakter “0A” koji se nalazi na kraju svakog reda.
Kreirajmo datoteku test.txt koja će sadržavati samo četiri prazna reda.
Pogledajmo ju sada s heksadecimalnim editorom hexdump:
hexdump test.txt 0000000 0a0a 0a0a 0000004
Dakle vidljivo je da imamo četiri puta po “0A” dakle četiri karaktera koji označavaju kraj reda.
Interpreterska sekvenca za novi red je \n pa ako recimo želimo maknuti samo oznaku za kraj reda (novi red), možemo napraviti sljedeće (na datoteci ulaz.txt):
tr -s '\n' ' ' < ulaz.txt VELIKO malo 12345 Ovo je test (x) 67890
Ako želimo unositi ASCII kodove umjesto slova,brojeva ili znakova, moramo koristiti oktalni zapis. Pogledajte kraj knjige sa ASCII tablicom
Primjer
Sprega naredbe dd (disk dump) i naredbe tr.
Kreirajmo datoteku koja se sastoji od binarnih nula, pomoću naredbe dd i generatora nula /dev/zero te potom konvertirajmo te nule u veliko slovo “A”. Sve snimimo u datoteku slova.txt.
Veličina će biti 1024 byte-a.
dd if=/dev/zero count=1 bs=1024 | tr '\000' '\101' > slova.txt
Pogledajmo sada našu datoteku slova.txt
cat file.txt AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
S vremena na vrijeme porebno nam je pronaći neku datoteku (ili naredbu), prema određenom kriteriju, u tu svrhu se koriste:
Koristi se kada želimo pronaći gdje se u strukturi direktorija koji su nam u putanji (PATH), te u putanji za man stranice, nalazi određena naredba ili datoteka
Prvo pogledajmo koji direktoriji su nam u putanji (PATH), za trenutno logiranog korisnika:
echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/ucenik/bin
Dakle u svim i iz svih navedenih direktorija (odvojenih dvotočkom : ) možemo pokretati naredbe i u njima će i naredba whereis pretraživati.
Primjer
1. Pronađimo gdje se nalazi naredba ls i pripadajući manual (upute) za nju:
whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
Koristi se kada želimo pronaći gdje se točno u putanji direktorija nalazi određena izvršna naredba (i na što pokazuje njen alias ako postoji).
Primjeri
1. Gdje se nalazi naredba more tj. odakle ju zapravo pozivamo:
which more /bin/more
2. Gdje se nalazi naredba less tj. odakle ju zapravo pozivamo
which less /usr/bin/less
3. Gdje se nalazi naredba ls tj. odakle ju zapravo pozivamo :
which ls
alias ls='ls --color=auto'
/bin/ls
Što ovo znači ?.
ls nalazi u /bin/ direktorijuls ima alias koji presreće izvornu naredbu ls tj. poziva ju s određenim prekidaćem , tj. ovako : ls –color=auto
Naredba locate koristi se za brzo traženje datoteka. Njena brzina je u tome kako se pomoću naredbe updatedb skeniraju datoteke na cijelom tvrdom disku (hard disk) te se njihov naziv i putanja (lokacija unutar direktorija) spremaju u posebnu bazu podataka: tkzv “mlocate” baza, koja se obično nalazi u : /var/lib/mlocate/ mlocate.db .
Definicija koji tipovi datoteka (uz ostale parametre) će se pretražiti pokretanjem update-a ove baze tj. pokretanjem naredbe updatedb je definirana u datoteci : /etc/updatedb.conf. Naime nakon pokretanja updatedb skenira se cijeli disk i obnavlja mlocate baza podataka koju zapravo naredba locate pretražuje kod potrage za datotekama.
Često se na raznim Linux sustavima updatedb pokreće automatski svaki dan (noć) ili svakih nekoliko dana, tako da mlocate baza bude što točnija.
Primjeri.
1. Kreiraj novu mlocate bazu i skeniraj cijeli tvrdi disk (ovo može potrajati prilično dugo)
updatedb
2. Pronađi datoteku imena koje počinje sa sysctl.conf
locate sysctl.conf /etc/sysctl.conf /usr/share/man/man5/sysctl.conf.5.gz
3.Pronađimo gdje se sve nalazi datoteka imena rc.local
locate rc.local /etc/rc.local /etc/rc.d/rc.local
4.Pronađimo koje sve datoteke imaju ime koje počinje sa apache
locate apache /etc/selinux/targeted/modules/active/modules/apache.pp /usr/lib/python2.6/site-packages/sos/plugins/apache.py /usr/lib/python2.6/site-packages/sos/plugins/apache.pyc /usr/lib/python2.6/site-packages/sos/plugins/apache.pyo /usr/share/selinux/devel/include/services/apache.if /usr/share/selinux/targeted/apache.pp.bz2 /usr/share/vim/vim72/syntax/apache.vim /usr/share/vim/vim72/syntax/apachestyle.vim ...
Osim navedenih primjera postoje i neki prekidaći naredbe locate, za dodatne osnovne opcije pretraživanja. Za sva složenija pretraživanja koristi se sljedeća naredba.
Koristi se za nalaženje datoteka prema raznovrsnim parametrima pretraživanja, kojih naredba find ima na stotine.
Osnovna sintaksa je :
find /početni-direktorij-za-pretraživajne -opcije što-tražimo
Osnovni prekidači su :
-name ime datoteke-iname ime datoteke ali se ignoriraju velika i mala slova-type f označava datoteku-type d označava direktorij-type l označava simbolički link-perm označava da slijede ovlasti (permisions)-exec označava da slijedi pozivanje naredbi iz operativnog sustava-mtime slijedi oznaka vremena kada je (datoteka ili direktorij) modificiran-atime slijedi oznaka vremena kada je (datoteci ili direktoriju) pristupano (read ili copy)-size slijedi veličina datoteke-delete briši sve pronađeno (datoteke ili direktorije)
Primjeri
1. Pronađimo datoteku imena rc.local , za koju znamo kako se nalazi negdje u /etc/ direktoriju, pa nećemo pretraživati cijeli tvrdi disk , počevši od / direktorija:
find /etc/ -name rc.local /etc/rc.d/rc.local /etc/rc.local
2. Već se nalazimo u /etc/ diretoriju, krenimo s istom pretragom iz prethodog primjera ali označivši da krećemo iz trenutnog direktorija ( . )
find . -name rc.local ./rc.d/rc.local ./rc.local
3. Pronađimo istu datoteku iz prethodnog primjera ali s time da se ignoriraju velika i mala slova (jer nismo sigurni koje je veliko a koje malo slovo u nazivu datoteke)
find . -iname rc.local ./rc.d/rc.local ./rc.local
4.Pronađimo direktorij imena ssh , ali želimo pretražiti cijeli disk jer ne znamo gdje se nalazi
find / -type d -name ssh /etc/ssh
5. Pronađimo datoteku unutar /etc/ direktorija (i svih poddirektorija), koja ima ekstenziju .sample
find /etc/ -type f -name "*.sample" /etc/gdm/PostLogin/Default.sample
6. Pretražimo sve korisničke home direktorije u potrazi za datotekama koje imaju ovlasti 777 (Read Write eXecute za sve):
find /home/ -type f -perm 0777 -print
7. Pronađimo sve MP3 datoteke u korisničkim home direktorijima i obrišimo ih !!
find /home/ -type f -name "*.mp3" -exec rm -f {} \;
Opis: ovdje pozivamo prekidač -exec , kojim pozivamo vanjsku naredbu od operativnog sustava : rm -f sa dodatnim parametrima.
Za ovaj primjer ( 7 ) - ako je lista pronađenih datoteka prevelika, dobiti ćemo grešku:
/usr/bin/find: Argument list too long
Tada pogledajte cjelinu/poglavlje Napredno ili slijedeći primjer (7.1)
Naime u ovom primjeru, lista svih pronađenih datoteka: pr. pjesma1.mp3, pjesma2.mp3 itd. će se proslijediti vanjskoj naredbi, unutar vitičastih zagrada rm -f {}. Tada će naredba rm -f biti pozvana s cijelom listom pronađenih datoteka, pa će to izgledati ovako : rm -f pjesma1.pm3 pjesma2.mp3. U slučaju kada imamo tisuće ili stotine tisuća pronađenih datoteka, njihova list će biti isto tako proslijeđena naredbi rm i to sve u jednom redu (liniji), a što će uzrokovati problem, jer dužina svakog naredbenog reda (linije) nije beskonačna. Stoga ovo nije najbolje metoda u slučajevima kada očekujemo veliki broj pronađenih datoteka.
7.1 Isto smo mogli napraviti i s prekidačem -delete
find /home/ -type f -name "*.mp3" -delete
Ovdje ne bi smjelo biti problema, a dodatni primjer za istu stvar pogledajte u slijedećem poglavlju Napredno.
8. Pronađimo sve prazne datoteke u home direktoriju svih korisnika:
find /home/ -type f -empty
8.1. Pronađimo sve prazne direktorije, također u home direktoriju svih korisnika
find /home/ -type d -empty
9. Pronađimo sve datoteke koje su promijenjene (modify) u zadnjih 10 dana u home direktoriju svih korisnika
find /home/ -mtime 10
10.Pronađimo sve datoteke kojima je pristupano (access) u zadnjih 10 dana u home direktoriju svih korisnika.
Pristupano znači da su čitane (read) ili kopirane.
find /home/ -atime 10
11. Pronađimo sve datoteke u home direktoriju svih korisnka, koje su veće od 100 MB
find /home/ -size 100M
12. Pronađimo sve datoteke u home direktoriju svih korisnka, koje su veće od 50MB ali manje od 100MB
find /home/ -size +50M -size -100M
Naredba xargs nije vezana za pretraživanje ali se često koristi u kombinaciji sa naredbom find (ili drugim naredbama).
NAPREDNO
Zbog čega i kada koristiti xargs ?
Naime Linux kao i svaki drugi operativni sustav ima određena ograničenja prema broju file deskriptora ali i na veličinu memorije koja je u slučaju Linuxa rezervirana za broj (količinu) argumenata koje svaka naredba može pohraniti u memoriji. Standardno Linux koristi 1/4 memorije od broja sistemski definiranog maksimalnog broja file deskriptora.
Dakle:
“maximum amount of space for command arguments” = [ ulimit -s ] / 4
Možete pogledati i u poglavlje ulimit za detalje.
Naredba xargs radi tako da uzima sve iz standarnog ulaza (standard input [ stdin ]) te lomi dugačke ulazne podatke na više manjih/kraćih, koje u praksi proslijeđujemo nekoj drugoj naredbi. Na taj način se riješava problem ograničenja navedenih u tekstu gore, bez potrebe za promijenama na nivou Linux file descriptora.
Dakle ovo se dešava samo u slučajevima kada nam na ulaz (ili izlaz naredbe prije) dolazi velika količina podataka u nizu te kada obično dobijemo sistemski pogrešku :
Argument list too long
Ovaj problem u praksi se dešava samo kod slučajeva kada se barata sa vrlo velikom količinom argumenata.
Primjeri
Na primjeru iz naredbe find, gdje sve proađene .mp3 datoteke iz /home/ direktorija šaljemo u listu {} te pozivamo vanjsku naredbu u koju se puni ta lista, u slučaju da je pronađeni broj takvih datoteka izuzetno velik, te ne stane u listu koju proslijeđujemo naredbi rm -f , mogli bi dobiti grešku :
Argument list too long
Ovo je bio primjer :
Pronađimo sve MP3 datoteke u korisničkim home direktorijima i obrišimo ih !!
find /home/ -type f -name "*.mp3" -exec rm -f {} \;
1. U našem primjeru prilagoditi ćemo se upotrebom naredbe xargs , kojom ćemo pokrenuti naredu rm -f sa listom {} imena .mp3 datoteka koju nam je popunio find :
find /home/ -type f -name "*.mp3" -print | xargs rm -f {} \;
istu stvar možemo napraviti i bez liste, već slanjem imena datoteka od find-a kroz xargs prema naredbi rm -f :
find /home/ -type f -name "*.mp3" -print | xargs rm -f
Pogledajmo i što nam sve find pronalazi i što xargs proslijeđuje (šaljemo sve pronađeo na ispis na ekran [echo]):
find /home/ -type f -name "*.mp3" -print | xargs echo /home/ucenik/1.mp3 /home/ucenik/3.mp3 /home/ucenik/2.mp3
1.1 U slučaju da smo imali neku datoteku koja ima razmak (space) u imenu, find ih ne bi pronašao niti bi ih xargs proslijedio na brisanje. Riješimo ovaj problem u find-u (dodajemo -print0 što znači kako se ispisuju i one datoteke koje imaju razmak u imenu) te isto recimo i xargs-u (-0):
Pogledajmo listu .mp3 datoteka:
ls -al *.mp3 -rw-r--r-- 1 root root 0 Jul 24 18:42 0.mp3 -rw-r--r-- 1 root root 0 Jul 24 18:42 1.mp3 -rw-r--r-- 1 root root 0 Jul 24 18:42 2.mp3 -rw-r--r-- 1 root root 0 Jul 24 18:42 3 0.mp3 -rw-r--r-- 1 root root 0 Jul 24 18:29 3.mp3
Vidimo da postoji jedna datoteka koja se zove 3 0.mp3 - dakle ima razmak u imenu.
find /home/ -type f -name "*.mp3" -print0 | xargs -0 rm -f
2. Ispišimo niz brojeva , potom ih podjelimo, pomoću xargs, tako da ih bude maksimalno 2 u jednom redu:
echo 1 2 3 4 5 6 7 8 | xargs 1 2 3 4 5 6 7 8
sada iskoristimo mogućnost ograničavanja maksimalnog broja elemenata u svakom redu (prekidač -n), ograničimo ispis na 2 elementa:
echo 1 2 3 4 5 6 7 8 | xargs -n2 1 2 3 4 5 6 7 8
Preusmjeravanje (redirekcija), radi se pomoću meta znakova « < > » . Pri tome se koriste:
stdin. On predstavlja ulaz podataka koji naš proces ili naredba čitaju kao ulazne podatke. Ulazni podaci mogu biti s primjerice tipkovnice ili iz drugog programa (procesa). stdout. On predstavlja izlaz podataka iz procesa ili programa. Ove poruke se obično šalju na “Monitor/Ekran” ili prema drugom programu.stderr. Na nju se šalju sve poruke o greškama svakog pojedinog procesa (programa).
Kod normalnog izvršavanja programa, izlazne poruke (stdout) programa se ispisuju na naš radni terminal (monitor računala), dok se ulazne poruke, naredbe i drugo, (stdin) dobivaju s tipkovnice. Poruke o greškama se standardno ispisuju također na Monitor/ekran, kao na slici dolje. Sve ovo se može promijeniti upotrebom redirekcije, o kojoj ćemo pričati u ovom poglavlju.
Na najnižoj razini postoji niz file descriptora za svaki proces, i to po jedan za stdin, jedan za stdout i jedan za stderr. Za više detalja pogledajte poglavlje ”File Deskriptori“.
Ako stvari promatramo s razine programa (procesa), tada možemo reći:
stdin. stdoutstderr
Preusmjeravanjem pomoću meta znakova > » , zapravo prosljeđujemo podatke koji bi inače završili na standardnom izlazu (to je ono što zapravo završi ispisano na ekranu), negdje drugdje - obično u neku datoteku.
Preusmjeravanjem pomoću meta znakova < « radimo preusmjeravanje sa standardnog ulaza. Standardni ulaz može biti i datoteka, pa u tom slučaju možemo raditi redirekciju iz datoteke prema nekoj naredbi i sl. (mada se češće za te potrebe koristi “Pipe”).
Pipe
Pipe ( | ) preusmjerava standardni izlaz jedne naredbe u standardni ulaz druge, bez potrebe za korištenjem privremenih datoteka. Praktično prosljeđujemo podatke koje je obradila jedna naredba - na obradu drugoj naredbi koja, nakon što obradi podatke, šalje ih na obradu trećoj naredbi i tako dalje.
Možemo reći i da nižemo i povezujemo naredbe pomoću ( | ) odnosno pipe-a tj. “cijevi” poveznice.
Na primjerima ćemo vidjeti preusmjeravanje i pipe na djelu.
Primjeri preusmjeravanja
Preusmjeri izvršenu naredbu (njen ispis na standardni izlaz) u datoteku:
Preusmjeri izlistanje direktorija (ls -al) u datoteku
naredba > datoteka.txt
ls -al > datoteka.txt
Kada koristimo standardno preusmjeravanje ( > ) sadržaj datoteke u koju preusmjeravamo ispis neke naredbe, biti će svaki puta prebrisan a potom popunjen novim sadržajem.
Pogledajmo sada preusmjeravanje u drugom smjeru - iz datoteke u naredbu.
Dakle sada želimo ispisati sadržaj datoteke koju smo kreirali u koraku prije, ali pomoću preusmjeravanja sa standardnog ulaza. Za ispisivanje sadržaja datoteke ćemo korititi naredbu cat .
cat < datoteka
Ako želimo koristiti preusmjeravanje na standardni izlaz ali želimo nadodati svoj (novi) sadržaj na kraj datoteke, tada moramo koristiti »
ls -al >> datoteka.txt
Preusmjeri datoteku file1 u naredbu cat, koja će ispisati tu datoteku na standardni izlaz, te ćemo to preusmjeriti u datoteku file2
cat < file1 > file2
Dakle ulaz cat naredbe je file1 a izlaz se preusmjerava u file2
Primjeri “Pipe”-a
Iz prethodnog primjera preusmjeravanja ispisa direktorija u datoteku ćemo prebrojati koliko riječi sadrži ta datoteka.
Za prebrojavanje riječi koristiti ćemo naredbu wc (word count).
Ona standardno ispisuje:
broj novih redova broj riječi byte count
ls -al > datoteka.txt cat datoteka.txt | wc 7 58 320
Dakle broj redova je 7, broj riječi je 58 i byte count je 320.
S naredbom cat smo ispisali sadržaj datoteke tj poslali ga na “standard output” , koji je znak pipe | proslijedio sljedećoj naredbi kao njen ulaz tj “standard input” te ga je naredba wc uzela i obradila te nam dala rezultat svoje obrade.
Sada ćemo istu stvar iz pretodnog primjera još više pojednostaviti.
ls -al | wc 7 58 320
Meta znakovi su nealfanumerički znakovi ili karakteri koji imaju posebno značenje u naredbenoj ljusci (shell) ili drugim programima. Meta znakove često koristimo za regularne izraze.
Neki od meta znakova su :
^ < > * ? [ ] $ & - ! ; | “ ‘ `
Wildcards znakovi su podgrupa Meta znakova i zamjenjuju alfanumeričke znakove, a to su :
* ? ! [ ] -
Wildcards znakovi :
* označava bilo koji i bilo koliko znakova (i 0 njih)
? označava točno jedan bilo koji znak
[ ] označava listu znakova pr. [a-zA-Z]
Meta znakovi:
^ označava početak reda
; pokretanje više naredbi jedna za drugom
& pokretanje programa u pozadini (background) - pogledajte poglavlje ”Jobs“
Regularni izrazi predstavljaju zapise koji se odnose na određeni uzorak.
“Osnovni” regularni izrazi su (kasnije ćemo upoznati i druge) :
^ označava početak reda $ označava kraj reda (kod varijabli ako se nalazi ispred verijable, daje nam njenu vrijednost) * označava nula ili više ponavljanja . označava pojedini znak (karakter) \ označava kako se slijedeći znak (karakter) koji slijedi nakon ovog interpretira na poseban način odnosno kako se prikazuje doslovno ono što slijedi, čak iako slijedi neki poseban meta znak. Sa znakom \ se označavaju takozvane Escape sekvence
Metakarakter (meta znak) \ se koristi i za takozvane Escape sekvence, koje imaju posebno značenje. Pogledajmo neke od Escape sekvenci koje se često koriste:
\t označava “Tab” odnosno niz od obično četiri (4) razmaka (a ponekada i više) ovisno kako je definirano. \n označava kraj reda (Engl. New Line), prema UNIX/Linux načinu zapisivanja (EOL konverziji), nakon ovoga slijedi novi red.Možemo reći kako se regularni izrazi koriste za pronalaženje i baratanje s određenim uzorcima a osim upotrebe u Shellu, koriste ih i razni programi :
Tablica s primjerima upotrebe metaznakova u često korištenim Unix/Linux programima odnosno naredbama:
Primjeri
Upotreba metaznaka *
Izlistajmo datoteke (naredba ls ) čije ime počinje sa d
ls -al d* -rw-r--r-- 1 root root 320 Nov 15 11:28 datoteka.txt
U ovom primjeru ispisali smo sadržaj trenutnog direktorija, s time da smo tražili samo datoteke čije ime počinje s malim slovom d nakon kojega može slijediti bilo koliko znakova (slova ili brojeva) ili niti jedan znak. To smo postigli s metaznakom * koji znači: “bilo koji i bilo koliko njih ili čak niti jedan znak”. U našem slučaju, u ovoj potrazi je pronađena samo datoteka imena “datoteka.txt” jer počinje s malim slovom “d” i ima još neka druga slova u imenu koja slijede slovo “d”.
Upotreba metaznaka ?
Izlistajmo datoteke čije ime počinje s datoteka.tx i ima još jedan bilo koji karakter (slovo ili broj)
ls -al datoteka.tx? -rw-r--r-- 1 root root 320 Nov 15 11:28 datoteka.txt
Ovdje smo koristili metaznak ? koji zamjenjuje samo isključivo jedan karakter (slovo ili broj) ili niti jedan od njih (nula).
Pošto smo željeli ispisati sve datoteke koje se zovu “datoteka.tx” ali imaju još jedan (bilo koji) karakter nakon toga, dobili smo samo datoteku imena “datoteka.txt”. Naš metakarakter se može naravno koristiti na bilo kojem mjestu, kao na sličnom primjeru, dolje:
ls -al datotek?.?x? -rw-r--r-- 1 root root 320 Nov 15 11:28 datoteka.txt
U ovom primjeru je vidljivo kako metaznak ? mijenja točno jedan karakter (slovo ili broj).
Upotreba metaznaka .
Metaznak . zamjenjuje točno i isključivo samo jedan karakter (slovo ili broj) za razliku od ? koji može služiti, za provjeru jednog karaktera ili ako ga uopće nema (ili jedan ili niti jedan).
Primjena ovog metaznaka nije direktna u shellu, već u programima poput grep.
Pogledajmo primjer, kad tražimo bilo koji točno jedan karakter koji nedostaje.
ls -al | grep dat.teka.txt -rw-r--r-- 1 root root 320 Nov 15 11:28 datoteka.txt
U našem slučaju metaznak u pola imena datoteke koji je pronađen je slovo “o” pa je vidljiva datoteka imena “datoteka.txt”.
Napredno
Upotreba metaznaka ^
U ovom primjeru ćemo koristiti "pipe" te naredbu grep. Osim toga potrebno je i poznavanje Linux ovlasti.
Ukratko :
- tada se radi o datotecid tada se radi o direktorijuIzlistajmo sadržaj trenutnog direktorija, koji izgleda ovako:
ls -al total 20 drwxr-xr-x 5 root root 4096 Apr 25 15:47 . drwxr-xr-x 3 root root 4096 Apr 25 15:39 .. -rw-r--r-- 1 root root 51 Apr 25 15:39 datoteka.txt drwxr-xr-x 2 root root 4096 Apr 25 15:47 primjer1 drwxr-xr-x 2 root root 4096 Apr 25 15:47 primjer2 drwxr-xr-x 2 root root 4096 Apr 25 15:47 primjer3
Dakle vidljivo je da imamo tri poddirektorija te jednu datoteku.
S obzirom da smo upoznati s ovlastima (Engl. Permissions) jasno nam je da ako je prvi znak kod ovlasti znak - to znači kako se radi o datoteci, poput naše datoteke koja ima ovlasti ” -rw-r–r– “.
Sada ćemo pretražiti izlistani sadržaj direktrija od gore, te tražiti sve ovlasti koje počinju sa znakom -.
Odnosno u ovom slučaju to znači sve redove, jedan po jedan, kako ih filtrira naredba grep, a koji počinju ( ^ ) sa znakom -.
ls -al |grep ^- -rw-r--r-- 1 root root 0 Apr 25 15:39 datoteka.txt
Dobili smo očekivani rezultat - jedini red ispisa sadržaja direktorija (ls -al) , koji počinje (ima na početku) - znak, je naša datoteka (datoteka.txt).
U slučaju da smo tražili koji su sve poddirektoriji, unutar našeg trenutnog direktorija, tražili bi čije ovlasti počinju sa slovom d.
ls -al |grep ^d ... drwxr-xr-x 2 root root 4096 Apr 25 15:47 primjer1 drwxr-xr-x 2 root root 4096 Apr 25 15:47 primjer2 drwxr-xr-x 2 root root 4096 Apr 25 15:47 primjer3
Naša datoteka imena : “datoteka.txt” sadrži slijedeće redove:
# Ovo je komentar Ovo nije komentar Tekst 1 Tekst 2
Metaznak # se često koristi za pisanje komentara. Poslije njega se može pisati neki komentar ili tekst koji Linux Shell promatra kao tekst komentara te ga ne procesira na bilo koji drugi način (ne pokušava ga izvršiti i sl.).
U slučaju da smo željeli pronaći sve redove unutar naše tekstualne datoteke (datoteka.txt), koji počinju sa znakom # , to možemo napraviti na slijedeći način.
grep ^# datoteka.txt # Ovo je komentar
ili (na duži način)
cat datoteka.txt | grep ^# # Ovo je komentar
U oba slučaja smo metaznak ^ i njemu pripadajući pojam koji tražimo, mogli staviti unutar dvostrukih ili jednostrukih navodnika :
grep "^#" datoteka.txt ili grep '^#' datoteka.txt
Sada postaje jasnija upotreba metaznaka ^ (Engl. Caret) ili (Engl. Power).
Upotreba metaznaka $
Sada ćemo vidjeti upotrebu metaznaka $ u slučajevima kada se ne koristi za ispisivanje vrijednosti varijable.
Naime metaznak $ se u ovoj primjeni koristi za pronalaženje kraja reda teksta, koji sadrži željena pojedina slova/brojeve ili riječ.
U našoj tekstualnoj datoteci ćemo stoga probati pronači sve redove teksta koji završavaju s riječi “komentar”:
grep komentar$ datoteka.txt # Ovo je komentar Ovo nije komentar
ili duži način
cat datoteka.txt | grep komentar$ # Ovo je komentar Ovo nije komentar
U oba slučaja dobili smo redove teksta koji završavaju s riječi “komentar”. I naravno u oba slučaja smo metaznak i pripadajuču rijeć mogli staviti unutar jednostrukih ili dvostrukih navodnika ( komentar$ ).
Povežimo sada prethodna dva metaznaka : početak i kraj : ^ i $ .
Dobiti ćemo potragu za praznim linijama (redovima teksta):
grep ^$ datoteka.txt
ili
cat datoteka.txt | grep ^$
I ovdje je moguće koristiti jednostruke ili dvostruke navodnike za ^$ .
Ponekad želimo isključiti djelovanje metaznakova odnosno prikazati ih upravo onako kako ih vidimo, za to služi metaznak \ . Metaznak \ zovemo i “Escape” karakter i iza njega obavezno slijedi neki metaznak, bez razmaka, čiju funkcionalnost želimo isključiti (Escape-ati).
Primjer
Želimo ispisati test* ali pošto je * metaznak, sustavu nekako moramo naznačiti da ga ipak samo ispiše.
echo test\* test*
Vidljivo je da smo koristitili poseban metaznak, za escape-anje\ iza kojeg je slijedio metaznak koji smo samo željeli ispisati (*).
Metaznak # se koristi za označavanje komentara koji slijedi nakon ovog znaka. Metaznak za komentar se može koristiti direktno u shellu ili u shell skriptama.
Komentari se najčešće koriste za opis (komentar) uz pripadajući kod, neku funkciju ili niz naredbi, opisujući za što one služe.
Takvi komentari se ignoriraju od strane shella (ili programskog jezika) te nam služe isključivo za pojašnjavanje onoga što želimo komentirati.
Pogledajmo primjere
echo Upišite neki broj: # Ovdje se traži upis broja Upišite neki broj:
Vidimo kako se tekst koji se nalazi iza metaznaka # ne ispisuje.
echo Upišite neki broj: '#' Ovdje se traži upis broja Upišite neki broj: # Ovdje se traži upis broja
i
echo Upišite neki broj: "#" Ovdje se traži upis broja Upišite neki broj: # Ovdje se traži upis broja
Zadnja dva primjera u kojima naš metaznak # koristimo ili unutar dvostrukih ili jednostrukih navodnika prikazuje metaznak # u oba slučaja, jednostavno jer se nalazi unutar navodnika koji ga uredno prikazuju kao da se radi o običnom tekstu (slovima ili brojevima).
Isto će se dogoditi ako između zadnjeg slova ili broja nema rezmaka a slijedi naš metaznak # .
echo Upišite neki broj# Ovdje se traži upis broja Upišite neki broj# Ovdje se traži upis broja
Drugi primjeri upotrebe su unutar shell skripti, koje mogu izgledati ovako.
#!/bin/bash #################################################### # Sada slijedi dio u kojemu se traži upis teksta #################################################### echo "Upišite tekst"
Za više detalja o shell skriptama pogledajte poglavlje ”Shell skripte“
Osim standardne upotrebe metaznaka # za komentar, pogledajte i upotrebu na vrijednosti varijabli, u poglavlju "Operacije na varijablama"
Pod posebne metaznakove spadaju i navodnici. Njih postoje tri vrste:
‘ ’ isključuju interpretaciju svih meta znakova osim ! i \“ “ isključuju interpretaciju svih metaznakova osim $ (koji služi za supstituciju varijabli) te ! i ` \` ` - sve što se nalazi unutar njih će biti izvršeno kao naredba ili niz naredbi
Primjeri
Postaviti ćemo varijablu TEST na vrijednost 1
TEST=1
Potom ćemo Ispisati samu varijablu preko dvostrukih navodnika “ ”
echo “$TEST” 1
Zatim ćemo ju Ispisati preko jednostrukih navodnika ' '
echo '$TEST' $TEST
Ovdje je vidljivo da smo s upotrebom jednostrukih navodnika ' ' , ispisali metaznak $ i pripadajuću varijablu (TEST) ali ne i njenu vrijednost.
Ispisati ćemo tekst komentara (komentar), pomoću ” “ te pozvati drugu naredbu, pomoću ` `
echo "komentar `ls -al datoteka.txt`" komentar -rw-r--r-- 1 root root 0 Nov 21 09:49 datoteka.txt
Obratite pažnju da će sve što je upisano između jednostrukih kosih navodnika ` ` biti pokrenuto kao naredba. U ovom slučaju, nakon što je ispisan tekst “komentar”, pokrenuta je naredba za ispis sadržaja direktorija za navedenu datoteku: ls -al datoteka.txt.
A sada ćemo isto pokrenuti pomoću jednostrukih navodnika ' '
echo 'komentar `ls -al datoteka.txt` ' komentar `ls -al datoteka.txt`
U ovom slučaju dobili smo sve ispisano kao običan tekst, jer smo koristili jednostruke navodnike tako da je sve što se našlo unutar njih, samo ispisano.
I sada sve isto ali pomoću jednostrukih navodnika ' ' a naredba unutar njih, pomoću dvostrukih navodnika ” “
echo 'komentar "ls -al datoteka.txt" ' komentar "ls -al datoteka.txt"
Vidimo kako se ovdje također nije izvršila naredba unutar dvostrukih navodnika ls -al datoteka.txt jer oni ne služe tome (niti bi bilo pokrenuto da smo koristili jednostruke kose navodnike jer se sve nalazi unutar jednostrukih navodnika).
Upotreba jednostrukih kosih navodnika je korisna ako želimo vrijednosti neke varijable dodjeli rezultat pokretanja neke naredbe ili niza naredbi.
Postavimo našu varijablu integritet
integritet=`md5sum vaznadatoteka.pdf`
Čitanjem vrijednosti ove varijable zapravo pozivamo naredbu md5sum vaznadatoteka.pdf koja će nam napraviti MD5 provjeru integriteta datoteke imena vaznadatoteka.pdf.
Provjerimo vrijednost naše varijable :
echo $integritet fa8e75a54297fb9a107c263cc3cfbe68 vaznadatoteka.pdf
Dobili smo MD5 “checksum” naše datoteke ( fa8e75a54297fb9a107c263cc3cfbe68 ).
Ovakva upotreba jednostrukih kosih navodnika je vrlo česta u ”Shell skriptama“
Uglate zagrade kod regularnih izraza koriste se za označavanje (niza) numeričkih, alfabetskih ili posebnih znakova (karaktera). Dakle govorimo o pronalasku ili upotrebi svakog (ili bilo kojeg) pojedinačnog, željenog znaka.
Najčešća upotreba :
[ABC] Označava samo pojedina velika slova A , B ili C[A-Z] Označava niz pojedinačnih velika slova od A do Z (A B C D E F G H … Z) [[:kategorija:]] Označava neku od kategorija :alnum Sve alfanumeričke znakove (slova i brojeve) - ovo je ekvivalent [0-9A-Za-z]alpha Sva velika i mala slova (Alfabet) - ovo je ekvivalent [A-Za-z]ascii Sve znakove iz ASCII tablice (slova,brojevi,posebni znakovi, …)cntrl Sve kontrolne znakove iz ASCII tablice (oktalno 000 - 037 i 177)digit Sve brojeve (0,1,2,3,4,5,6,7,8 i 9 )graph Svi grafički znakovi: alnum i punct : ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ lower Sva mala slova - ovo je ekvivalent [a-z]print Svi “printabilni” znakovi : alnum , punct i razmak (Engl. Space)punct Svi posebni znakovi : ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ space Razmak (Engl. Space)upper Sva velika slova - ovo je ekvivalent [A-Z]xdigit Svi heksadecimalni znakovi (0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f) [^…] Negacija onoga što slijedi (…)
Ovisno o nacionalnim (lokalnim) postavkama jezika (sistemska varijabla LANG) i postavkama za baratanje s karakterima (alfabetom) i enkodiranjem (sistemska varijabla LC_CTYPE), mogući su problemi kod pretvorbe i rada s velikim i malim slovima.
Za više detalja o enkodiranju pogledajte poglavlje : "Tipkovnica, kodne stranice (enkodiranje) i drugo"
Provjerena kombinacija je upotreba POSIX ili C kao standarda kao definicije za nacionalne (lokalne) postavke te odabir “Locale” kategorije kod baratanja, poglavito s velikim i malim slovima (zapravo večinom tipova navedenih gore pod :kategorija:)
Samo u slučaju da imate problem kod izvršavanja primjera dolje, stavite slijedeća dva reda u datoteku /etc/profile, snimite te se odlogirajte i ponovno logirajte na sustav.
export LANG=POSIX export LC_CTYPE=en_US.UTF-8
Primjeri
U trenutnom direktoriju nam se nalazi slijedeća struktura datoteka :
To su radne datoteke, prema kategorijama - sve koje u nazivu imaju ”.1.mj-“ su za radne grupe u prvom mjesecu, ”.2.mj-“ u drugom mjesecu itd.
Istovremeno imamo i podkategorije nakon oznake mjeseca, a to su velika slova : A, B i C za završene projekte te mala slova a,b i c za nedovršene ili projekte u izradi, koji kada budu dovršeni, mijenjaju se u velika slova.
ls -al ... -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.1.mj-A.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.1.mj-B.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.1.mj-C.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-A.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-B.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-C.txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-a.txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-b.txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-c.txt
Pogledajmo i nekoliko primjera upotrebe.
Pronađimo sve datoteke iz svih mjeseci koji imaju velika slova (od A do Z) jer ne znamo koliko projekata imamo. Dakle tražimo sve dovršene projekte
ls -al datoteka.*.mj-[A-Z].txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.1.mj-A.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.1.mj-B.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.1.mj-C.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-A.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-B.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-C.txt
Dobili smo listu svih datoteka koje se zovu “datoteka.” “*” znači bilo koji broj (zapravo ili slovo) ”.mj-“ i potom bilo koje slovo od A do Z ” [A-Z] “ ”.txt“.
Ovdje smo imali upotrebu uglatih zagrada koje mijenjaju bilo koje slovo u nizu, koji smo naveli (sva velika slova od A do Z). Pošto smo filtrirali sva kako treba, dobili smo sve mjesece (.1.mj-) i sve velika slova (A do Z, a pošto ih je bilo od A do C, oni su i prikazani).
U drugom primjeru ćemo pokušati napraviti suprotno. Sada nas zanimaju prokejti koji su u izradi (ili nedovršeni), prema tome sada na pozicijji gdje su se tražila sva velika slova od A do Z, tražimo sva mala slova od a do z.
ls -al datoteka.*.mj-[a-z].txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-a.txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-b.txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-c.txt
Ovdje bi sve trebalo biti jasno jer smo umjesto velikih slova na istoj poziciji sada tražili mala slova [a-z] .
Isto smo mogli postići i s kategorijom [[:lower:]] koja isto znači sva mala slova :
ls -al datoteka.*.mj-[[:lower:]].txt -rw-r--r-- 1 root root 53 Apr 26 13:37 datoteka.12.mj-c.txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-a.txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-b.txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-c.txt
U slijedećem primjeru nas zanima koliko projekata uopće imamo od prvog (.1.mj) do trećeg mjeseca (.3.mj), bez obzira u kojoj su fazi (završeni ili u izradi)
ls -al datoteka.[1-3].mj-*.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.1.mj-A.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.1.mj-B.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.1.mj-C.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-A.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-B.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-C.txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-a.txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-b.txt -rw-r--r-- 1 root root 53 Apr 26 12:29 datoteka.3.mj-c.txt -rw-r--r-- 1 root root 78 Apr 26 14:25 datoteka.10.mj-c.txt -rw-r--r-- 1 root root 78 Apr 26 14:25 datoteka.11.mj-a.txt -rw-r--r-- 1 root root 78 Apr 26 14:25 datoteka.12.mj-b.txt
Sada smo na poziciji broja mjeseca koristili opseg brojeva od 1 do 3 : [1-3] dakle odgovaraju svi koji imaju na toj poziciji brojeve 1,2 i 3.
U gornjim primjerima smo spominjali nizove slova [A-Z] (A,B,C,D, … Z) , [a-z] (a,b,c,d, … z) ili brojeva [0-9] (0,1,2,3,4, … 9).
Na sličan način mogu se koristiti i točno specificirana slova ili brojevi koje želimo,u slijedu.
Njih je potrebno definirati u slijedu unutar uglatih zagrada - primjerice : [ABKL] ili [1246].
U primjeru dolje, tražimo samo sve datoteke za projekte isključivo iz prvog (1) i drugog mjeseca (2).
ls -al datoteka.[12].mj-*.txt -rw-r--r-- 1 root root 79 Apr 26 13:47 datoteka.1.mj-A.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.1.mj-B.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.1.mj-C.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-A.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-B.txt -rw-r--r-- 1 root root 53 Apr 26 12:28 datoteka.2.mj-C.txt
Negacija
Iz predzadnjeg primjera, možemo isključiti sve od prvog (1) i drugog mjeseca (2) je nas zanimaju svi ostali mjeseci (1-9) - za sada.
Za ovu potrebu se koristi znak negacije ^ .
ls -al datoteka.[^1-2].mj-*.txt -rw-r--r-- 1 root root 78 Apr 26 13:50 datoteka.3.mj-a.txt -rw-r--r-- 1 root root 75 Apr 26 13:53 datoteka.3.mj-b.txt -rw-r--r-- 1 root root 78 Apr 26 13:53 datoteka.3.mj-c.txt
Sada ćemo pogledati sadržaj jedne datoteke s projektima, koji su podjeljeni u četiri (4) faze. Ovako izgleda projekt koji je dovršen:
# Projekt 1 - A - ovo je komentar Faza1-OK Faza2-OK Faza3-OK Faza4-OK
Faze koje nisu dovršene imaju umjesto “OK” oznake, oznaku “NotOK”.
Zanima nas za projekt iz trećeg mjeseca ”.3.mj“ i to projekt “a”, koliko “Faza” projekta je dovršeno:
cat datoteka.3.mj-a.txt | grep "Faza[1-4]-OK" Faza1-OK Faza2-OK
Ovdje smo za pronalaženje riječi/pojma unutar teksta koristili narebu grep. Njoj smo na poziciji nakon riječi “Faza” koristili naš regularni izraz za pretraživanje brojeva od jedan (1) do četiri (4). S time smo dobili pretraživanje svih rijeći: “Faza1-OK” , “Faza2-OK” , “Faza3-OK” i “Faza4-OK”.
Pošto su samo “Faza1” i “Faza2” izgledale točno kako smo i tražili (Faza1-OK i Faza2-OK), one su i prikazane. S time smo dobili traženi rezultat, da su samo “Faza1” i “Faza2” dovršene.
Vitičaste { } zagrade se često koriste :
Pogledajmo nekoliko primjera upotrebe vitičastih { } zagrada, direktno u shellu.
Kreirati ćemo listu (niz) riječi (u ovom slučaju: “prvo” “drugo” “treće” “četvrto” )
echo {prvo,drugo,treće,četvrto}
prvo drugo treće četvrto
Sada smo dobili samo ispis svih elemenata (odvojenih zarezom) unutar vitičastih zagrada.
Kreirati ćemo listu (niz) znakova -u ovom slučaju slova od A do E
echo {A..E}
A B C D E
Isto možemo napraviti i s brojevima. Kreirati ćemo niz brojeva od 10 do 15:
echo {10..15}
10 11 12 13 14 15
Kreirajmo decimalne brojeve od 1.1 do 1.5 :
echo 1.{1..5}
1.1 1.2 1.3 1.4 1.5
Naravno, moguće su i kombinacije više nizova. Sada ćemo kreirati niz slova i brojeva (A do E) i (1 do 5) i to kombinirano:
echo {A..E}{1..5}
A1 A2 A3 A4 A5 B1 B2 B3 B4 B5 C1 C2 C3 C4 C5 D1 D2 D3 D4 D5 E1 E2 E3 E4 E5
Također je moguće i kombinirati nizove i raditi ugnježđivanje, poput ovoga u primjeru.
echo {a,b{1..4},c{1..3},d}
a b1 b2 b3 b4 c1 c2 c3 d
A sada kreirajmo alfabet, prvo sva velika slova u nizu a potom i mala.
echo {{A..Z},{a..z}}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
Probajmo kreirati više poddirektotija unutar osnovnog direktorija:
mkdir -p /home/korisnik/test/{prvi,drugi,treci,cetvrti}
Dakle unutar direktorija ”/home/korisnik/test/“ smo kreirali poddirektorije :“prvi” , “drugi” , “treci” i “cetvrti”.
Osim gore navedenih primjera upotrebe vitičastih zagrada one se koriste i u shellu i u radu s "običnim" varijablama
Svaki proces predstavlja pokrenuti program odnosno naredbu (ili skripte) na linux ili bilo kojem operacijskom sustavu. Dakle svaki pokrenuti program, naredba, shell skripta ili slično je jedan Linux proces.
O cijelom životnom vijeku procesa se brine Linux task/process scheduler (za više detalja pogledajte poglavlje : "Napredno: Task scheduler" ).
Svaki proces u grubo može pripadati u dvije kategorije :
Vratimo se na rad s procesima. Naredbama ps i top možemo izlistati procese.
Svaki proces identificira niz parametara od kojih nas sada zanimaju samo ovi:
UID - tko je vlasnik procesa - znači “User ID”PID - jedinstvena identifikacija (dodjeljuje ju sistem) - znači “Process ID”PPID - govori koji proces roditelj (parent) je pokrenuo ovaj proces - znaći “Parent Process ID”STAT - prikazuje u kojem je stanju određeni procesSTIME - vrijeme kada je proces pokrenutTIME - vrijeme koliko je CPU radio na procesuCMD - je naredba koja čini taj proces
Ako gledamo polje STAT ali i općenito, procesi mogu biti u nekoliko mogućih stanja:
R - Running stanje označava da je proces pokrenut ili da je u fazi pokretanja (čeka se dodjeljivanje određenom CPU-u). Waiting stanje u kojemu proces čeka na neki događaj ili traži pristup nekom sistemskom resursu (Disk, Mreža, CPU, …). Ovdje postoje dvije podvrste :S - interruptible odnosno procesi koji mogu biti prekinuti (pauzirani i sl.) dok su u stanju čekanja. Označava procese koji su u stanju čekanja ne druge ili podprocese.D- uninterruptible su oni procesi koji ne smiju biti prekinuti dok su u stanju čekanja jer čekaju na neki hardverski uvjet ili prostup pa ne smiju biti prekidani.T- Stopped označava proces koji je stopiran, na način da je primio neki od signala za zaustavljanje. Primjerice procesi koji su u stanju “Debugging”-a su isto vidljivi kao Stopped. Za signale koji se mogu poslati procesima pogledajte poglavlje "Procesi i signali koje im možemo poslati" Z - Zombie su zaustavljeni procesi čiji resursi zbog nekih razloga još nisu oslobođeni pa su ostali kao “mrtvi” procesi. Proces u ovom stanju obično zauzima vrlo malo resursa i to često samo memoriju potrebno za pohranjivanje njegovog Proces Deskriptora kao i rezervaciju PID broja. Kod normalnog zaustavljanja procesa u nekom djeliću vremena svaki proces se nađe u tom stanju ali već nakon nekoliko trenutaka (toliko brzo da nam je to uglavnom nevidljivo) sistemski resursi se oslobađaju te proces u konačnici bude potpuno zaustavljen a resursi oslobođeni te PID broj oslobođen za upotrebu za neki novi proces.Dodatno stanje procesa ima još jednu oznaku nakon prve, a ona može biti:
< - proces s visokom prioritetomN - proces s niskim prioritetomL - proces ima označene i zaključane regije memorije (pages) (za realtime i I/O procese)s - session leaderl - višenitni proces (multi-threaded)+ - predstavlja prednju procesnu grupu (foreground) Pogledajmo sve kroz primjere:
Primjer upotrebe ps naredbe
Primjer upotrebe naredbe ps koja ispisuje pokrenute procese.
Možemo koristiti i prekidać -a da vidimo sve detalje.
ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Nov14 ? 00:00:01 /sbin/init root 2 0 0 Nov14 ? 00:00:00 [kthreadd] ... ... slijede kernel procesi ... ... root 3 2 0 Nov14 ? 00:00:00 [migration/0] root 4 2 0 Nov14 ? 00:06:03 [ksoftirqd/0 ... ... ispod su "korisnički" procesi/programi ... ... root 150 1 0 Nov14 ? 00:00:00 /sbin/udevd -d root 555 1 0 Nov14 ? 00:00:06 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5 root 783 1 0 Nov14 ? 00:00:04 /usr/sbin/sshd ...
Vidimo kako je init proces pokrenuo sve ostale procese, koji su pod njim. Njegov PID je jedan (1) a njegov roditeljski (parent) proces je nula (0) što označava sam kernel. Na izlistanju vidimo procese koje je init pokrenuo :
To je vidljivo iz toga što je za PID: 150, 555 i 783 PPID=1 (što je PID od init procesa)
Napredno: Zanimljivo je i to što postoji još jedan poseban proces, čiji roditelj je isto sam kernel.
To je process kthreadd, koji ima PID dva (2), a on je poseban proces koji radi na vrlo niskoj razini unutar takozvanog kernel spacea, odnosno unutar direktnog adresnog prostora kernela. Ovaj proces je zadužen za pokretanje novih kernel niti odnosno procesa (engl. kernel threads). Namjena ovih posebnih procesa na razini kernela je i njihovo izvršavanje na vrlo niskoj razini odnosno ispod razine svih drugih programa/aplikacija a njihova funkcionalnost su razne funkcionalnosti koje se logički nalaze u komponentama kernela.
Ti procesi koje zapravo indirektno pokreće kernel, preko procesa kthreadd su procesi koji upravljaju osnovnim funkcijama operacijskog sustava:
kworker kernel proces/threadcpusetmigration kernel proces/threadaio - zadužen za asinkroni pristup diskovnom podsustavukswapd - zadužen za swap funkcionalnostiflush - zadužen za zapisivanje podataka iz disk cache memorije, periodički, na diskkblocks - zadužen za kontrolu i pristup diskovnom sustavu na najnižoj razinikintegrityd - zadužen za integritet podataka koji se spremaju prema diskovnom podsustavuscsi_eh_* - on je dio diskovnog podsustava, zadužen za SCSI funkcionalnosti (to vrijedi i za SATA/SAS i SCSI diskove, kao i VIRTIO). Postoji po jedan ovakav proces za svaki SCSI/SAS/SATA kanal.…ksoftirqd kmalloc, khugepaged, ksmdbond - za agregaciju mrežnih kartica
Primjer upotrebe ps naredbe sa prekidačima (-auxf) koji nam daju prikaz stabla procesa :
ps -auxf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 19236 1452 ? Ss Oct01 0:00 init root 150 0.0 0.0 10644 584 ? S<s Oct01 0:00 \_ /sbin/udevd -d root 555 0.0 0.0 183556 1444 ? Sl Oct01 0:00 \_ /sbin/rsyslogd -i /var/run/syslogd.pid -c 5 root 783 0.0 0.0 66620 1228 ? Ss Oct01 0:00 \_ /usr/sbin/sshd root 784 0.0 0.0 96244 3956 ? Ss 09:29 0:00 | \_ sshd: root@pts/0
Ovdje također vidimo kako je init proces pokrenuo sve ostale procese (koji su pod njim) te da je u stanju S.
Isto tako vidimo i da je proces sshd (PID 783) pokrenuo podproces (PID 784)
Istu stvar možemo vidjeti još ljepše s naredbom pstree :
pstree
init─┬─atd
├─atop
├─cron
├─ksmtuned───sleep
├─kthreadd─┬aio/0
| ├─ksoftirqd/0
│ ├─events/0
│ ├─watchdog/0
│ ├─scsi_eh_0
│ ├─nfsio
│ ├─nfsiod
│ ├─
... ... ... ... ... ...
├─udevd
├─rsyslogd
Izlistanje je skraćeno zbog razumijevanja.
Naime ovdje je vidljivo koje procese direktno pokreće init proces a koje procese pokreće kthreadd proces.
Primjer upotrebe top naredbe
Primjer upotreba naredbe top koja daje puno više informacija o svakom pokrenutom procesu
top 15:24:20 up 1 day, 5:45, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 143 total, 1 running, 142 sleeping, 0 stopped, 0 zombie Cpu(s): 1.3%us, 0.2%sy, 0.0%ni, 98.4%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 16332608k total, 7480892k used, 8851716k free, 89428k buffers Swap: 16776184k total, 0k used, 16776184k free, 1695512k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19 348 1524 1212 S 0.0 0.0 0:01.27 init 2 root 20 0 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root RT 0 0 0 0 0 S 0.0 0.0 0:00.01 migration/0 4 root 20 0 0 0 0 0 S 0.0 0.0 6:03.23 ksoftirqd/0
Opis značenja:
1. PID - Process ID – jedinstveni identifikacijski broj (ID) svakog procesa
2. USER - Username koji je pokrenuo taj proces
3. PR - Prioritet procesa (od -20 za “najbitnije” do 20 manje “važne” procese)
4. NI - “Nice” vrijednost modificira prioritet procesa
5. VIRT -Ukupna količina virtualne memorije koju proces koristi
6. RES - Rezident-na veličina (kb) – “Non-swapped” fizička memorija koju proces koristi
7. SHR - “Shared memory size” (kb) – količina dijeljene memorije koju proces koristi (dijeljena memorija je memorja koju mogu alocirati i drugi procesi)
8. S - “Process status” – moguće vrijednosti:
R - “Running” – pokrenutoD - “Sleeping” - (nije ga moguće prekinuti - “interrupted”)S - Sleeping (moguće ga je prekinuti – “interrupted”)T - “Traced or stopped”Z - “Zombie” ili “hung” process
%CPU - Postotak CPU vremena koje je proces koristio u vrijeme kada je naredba top zadnji puta osvježena
%MEM - Postotak memorije (RAM) koje je proces koristio u vrijeme kada je naredba top zadnji puta osvježena
TIME+ -Kumulativno CPU vrijeme koje su proces i njegovi podprocesi (child/djeca)koristili
COMMAND -Ime procesa ili naredbe koja je pokrenuta (pritisni c za prebacivanje između imena procesa i putanje naredbe koja je pokrenula proces)
Za dodatne primjere upotrebe naredbi ps i top pogledajte poglavlje ”Praćenje procesa i opterećenja CPU jezgri“
Na primjeru CPU (Centralni procesor) sa jednom jezgrom, možemo vidjeti da je CPU u svakom trenutku tj. najmanjoj jedinici vremena, zapravo u stanju obraditi samo jedan proces (ili nit unutar određenog procesa).
Ono što se zapravo događa je da se prvo postavlja prioritet svakog pojedinog procesa. Prioritet se postavlja od strane sustava ili naknadno od strane korisnika. Ovisno o prioritetu, za svaki proces se računa koliko vremena, unutar jednog vremenskog intervala, će CPU odrađivati taj proces. Praktično, CPU radi preklapanje (switching) ili takozvani context switching između više procesa. Možemo ovo zamisliti, kao da svaki CPU ima malu sklopku koju prebacuje s procesa, na proces. Pogledajte sliku dolje.
Pojednostavljeno to izgleda ovako: Ako imamo 2 procesa:
CPU u svakom segmentu vremena (neka je to pr. 10 µs) obrađuje prvi proces 9µs a drugi 1 µs, u sljedećem segmentu vremena, što je sljedećih 10 µs, ponovno, prvi proces obrađivatu 9µs a drugi 1 µs i tako dalje, u krug, za sve procese. Ovaj primjer pogledajte na vremenskom dijagramu dolje:
Analogija ovome je vidljiva i u višenitnim (multi threading) programima. Oni se na razini operacijskog sustava obrađuju isto kao procesi jer kada dođu do razine za obradu - na CPU, ponovno se događa ista stvar. Dakle svaka nit (thread) dobiva određeni prioritet odnosno obrađuje se samo djelić vremena, pa se obrada prebacuje na drugu nit i tako u krug, sve dok se ne odrade sve niti, a potom sve ponovno iz početka.
Sumirajmo:
Moguće je mijenjati prioritet svakog procesa, u trenutku njegovog pokretanja ili naknadno.
Promjene direktno utječu na parametar koji se zove nice a koji mehanizmu, koje se zove process scheduler odnosno task scheduler, prosljeđuju zahtjev za promjenom prioriteta procesa.
Prioriteti i procesi
Pokreni proces (skriptu test.sh) s prioritetom uvečanim za 10 (+10 u odnosu na trenutni prioritet):
nice -n 10 test.sh
ili
nice -10 test.sh
Naredba nice za prioritet (ako se ne koristi prekidač ”-n“) traži ”-“ ispred broja, ako se želi odabrati negativna vrijednost, tada odabrati dva minusa pr. ”–10“.
Promjene na već pokrenutim procesima
Recimo da smo već pokrenuli skriptu ili proces gore i da naknadno želimo promijeniti njen prioritet u 5, njen PID je 10456
Prvo pogledajmo koji prioritet skripta sada ima, pomoču naredbe ps , prekidača -o i parametara koje želimo prikazati.
Opis nekih od parametara naredbe ps :
| Parametar | Opis |
| pri | Stvarni prioritet procesa |
| nice | “Nice” odnosno podatak da li se mijenjao prioritet |
| pid | Process ID |
| ppid | Parent Process ID |
| cmd | Izvršena naredba (s kojom naredbom je proces pokrenut) |
ps -o pri,nice,pid 10456 PRI NI PID 19 0 10456
Vidimo da je prioritet gotovo najniži odnosno 19 (19 je standardan prioritet za korisničke procese) te kako se nije mijenjao - nice je nula !.
Sada promjenimo prioritet (nice)
renice 5 -p 10456
Provjerimo ponovno prioritet, za naš proces, nakon ove promjene:
ps -o pri,nice,pid 10456 PRI NI PID 14 5 1204
Sada vidimo kako se prioritet sa 19 smanjio na 14, što nam govori i nice koji je sada 5.
Ako sve želimo vratiti u izvorno stanje stavimo “nice” na nula.
renice 0 -p 10456
Želimo li naknadno promijeniti prioritet svih procesa čiji je vlasnik “pero” i svih čiji su vlasnici iz grupe “korisnici” u prioritet +10 od izvornog
renice 10 -u pero -g korisnici
SIGHUP (br. 1) ”Hang UP” obično se proces stopira ili za daemon-e restarta i učita konfiguraciju (re-read)SIGKILL (br. 9) nasilno zaustavi procesSIGTERM (br. 15) standarno zaustavi proces
Listu podržanih signala možete vidjeti sa : kill -l
Ovo je lista podržanih signala na linux kernel 2.6.x:
Pogledajmo tablicu signala na Linuxu_:
| Redni br. signala i oznaka | Redni br. signala i oznaka | Redni br. signala i oznaka | Redni br. signala i oznaka | Redni br. signala i oznaka |
| 1) SIGHUP | 2) SIGINT | 3) SIGQUIT | 4) SIGILL | 5) SIGTRAP |
| 6) SIGABRT | 7) SIGBUS | 8) SIGFPE | 9) SIGKILL | 10) SIGUSR1 |
| 11) SIGSEGV | 12) SIGUSR2 | 13) SIGPIPE | 14) SIGALRM | 15) SIGTERM |
| 16) SIGSTKFLT | 17) SIGCHLD | 18) SIGCONT | 19) SIGSTOP | 20) SIGTSTP |
| 21) SIGTTIN | 22) SIGTTOU | 23) SIGURG | 24) SIGXCPU | 25) SIGXFSZ |
| 26) SIGVTALRM | 27) SIGPROF | 28) SIGWINCH | 29) SIGIO | 30) SIGPWR |
| 31) SIGSYS | 34) SIGRTMIN | 35) SIGRTMIN+1 | 36) SIGRTMIN+2 | 37) SIGRTMIN+3 |
| 38) SIGRTMIN+4 | 39) SIGRTMIN+5 | 40) SIGRTMIN+6 | 41) SIGRTMIN+7 | 42) SIGRTMIN+8 |
| 43) SIGRTMIN+9 | 44) SIGRTMIN+10 | 45) SIGRTMIN+11 | 46) SIGRTMIN+12 | 47) SIGRTMIN+13 |
| 48) SIGRTMIN+14 | 49) SIGRTMIN+15 | 50) SIGRTMAX-14 | 51) SIGRTMAX-13 | 52) SIGRTMAX-12 |
| 53) SIGRTMAX-11 | 54) SIGRTMAX-10 | 55) SIGRTMAX-9 | 56) SIGRTMAX-8 | 57) SIGRTMAX-7 |
| 58) SIGRTMAX-6 | 59) SIGRTMAX-5 | 60) SIGRTMAX-4 | 61) SIGRTMAX-3 | 62) SIGRTMAX-2 |
| 63) SIGRTMAX-1 | 64) SIGRTMAX |
Nakon što se logirate na Linux sustav te pokrenete neku naredbu unutar shell-a, ta naredba/program će se izvršavati sve dok ne izađete is shell-a (namjerno ili ako vam se veza na udaljeni shell [pr. preko ssh protokola]) prekine.
Dakle kod odlogiranja sa sustava se svim procesima koje ste pokrenuli šalje SIGHUP (1) signal i oni se svi gase. Ako imate potrebu kako bi se neki proces (naredba/program) nastavio izvršavati i nakon što se odlogirate, to se može postići na sljedeći način. Recimo kako se radi o našoj skripti imena vazno_za_rad.sh.
nohup vazno_za_rad.sh &
Na ovaj način smo pokrenuli našu skriptu u background-u/pozadini [ & ] te je zbog pokretanja sa nohup otporna na odlogiranje.
Primjeri:
Stopiraj (SIGHUP [1]) proces PID 13245 (ovo je neka skripta koju smo pokrenuli)
kill -1 13245
Stopiraj (SIGTERM [15]) – ovo je default proces PID 13245 (ovo je neka skripta koju smo pokrenuli)
kill -15 13245
ili
kill 13245
Nasilno stopiraj (SIGKILL [9])proces PID 13245 (ovo je neka skripta koju smo pokrenuli)
kill -9 13245
Kada Linux/Process/Task Scheduler (kako ga već tko zove) primijeti, da postoji signal koji je potrebno proslijediti procesu, on daje CPU vrijeme odnosno vremenski okvir za obradu signala - točnije dogodi se Context Switch na proces koji mora obraditi signal. Tada se signal dostavlja procesu.
Kada proces primi taj signal, proces mora odgovoriti sustavu (Linux kernelu) što da radi s njim. Kernel tada provjerava, za svaki pojedini proces, što će sa konkretnim signalom. Signali za svaki proces mogu biti definirani u tri grupe:
SIGKILL i SIGSTOP kao i hardverski posebni signali (Engl. Hardware Exceptions).SIGKILL ili SIGSTOP, za proces, tada proces može odraditi što je traženo od strane signala i to preko funkcije s kojom je povezan s kernelom za taj signal.SIGKILL i SIGSTOP.
Signali SIGKILL i SIGSTOP ne mogu nikako i nikada biti ignorirani ili blokirani. To je stoga što ova dva signala daju mogućnost sustavu da ubije ili uredno zaustavi proces u bilo kojem trenutku. Prema tome gore navedena dva signala ne mogu biti u kategorijama “Ignored” ili “Blocked”, već samo u kategoriji “Caught”. Dakle kategorija “Caught” je standardna kategorija koja normalno prihvaća i obrađuje točno navedene signale, za svaki proces.
Svaki proces ima definiranu Signalnu masku u kojoj je definirano, za svaki signal u koju od gore navedenih kategorija pripada. To znači da će neki signali za pojedini proces moći biti ignorirani (SigIgn), drugi će biti uhvaćeni i obrađeni (SigCgt) a treći će biti blokirani (SigBlk).
Pod Linuxom za svaki pokrenuti proces možemo iščitati signalnu bit masku.
Signalna Bit maska se nalazi unutar posebnog direktorija /proc/PID/status s time da PID označava PID (Process ID) pokrenutog procesa.
Navedena status datoteka sadrži brojne podatke o (svakom) pojedinom procesu - kako smo rekli - prema njegovom PID-u.
Nas trenutno zanimaju samo tri reda :
Pogledajmo što je vidljivo za proces s PID 1 : to je prvi Linux proces init, koji pokreće sve procese na Linuxu.
Ispis je skraćen samo za ona tri reda koja su nam zanimljiva:
cat /proc/1/status ... ... ... SigBlk: 0000000000000000 SigIgn: 0000000000001000 SigCgt: 00000001a0016623 ... ... ...
Sve vrijednosti su heksadecimalne, pa ih prvo moramo pretvoriti u binarne.
Zanimaju nas svi signali koji se normalno obrađuju (SigCgt) : HEX : 00000001a0016623.
U binarnom je to : 000110100000000000010110011000100011
Pošto smo rekli da je to bit maska to znači da svaki bi predstavlja određenu poziciju (broj) signala.
Pogledajte to za naš primjer:
000110100000000000010110011000100011
|| | | || || | ||
|| | | || || | ||
|| | | || || | | \
|| | | || || | | \--> (1) SIGHUP
|| | | || || | \
|| | | || || | \--> (2) SIGINT
|| | | || || \
|| | | || || \--> (6) SIGABRT
|| | | || | \
|| | | || | \--> (10) SIGUSR1
|| | | || \
|| | | || \--> (11) SIGSEGV
|| | | | \
|| | | | \--> (14) SIGALRM
|| | | \
|| | | \--> (15) SIGTERM
|| | \
|| | \--> (17) SIGCHLD
|| \
|| \--> (30) SIGPWR
| \
| \--> (32) Nije definiran (u ovoj verziji kernela)
\
\--> (33) Nije definiran (u ovoj verziji kernela)
Dakle naš pokrenuti proces s PID: 1 - init proces, obrađuje odnosno odgovara na signale :
Task scheduler također poznat i kao process scheduler je mehanizam zadužen za obradu procesa koju smo gore objasnili. Zbog činjenice što se na vrlo niskoj razini, na jednoj jezgri centralnog procesora (CPU) u jednom vremenskom okviru može odraditi samo jedan proces, ovaj mehanizam je vrlo važan za performanse ali i rad cijelog operativnog sustava.
Dodatna komplikacija je u tome, što se neki od procesa privremeno mogu zaustaviti, dok se drugi trebaju nastaviti obrađivati, a potom se privremeno zaustavljeni mogu ponovno pokrenuti. U svakom slučaju cijela višezadaćnost ili multitasking ovise o ovom mehanizmu. U normalnom radu kada task scheduler radi context switching odnosno završava s obradom prvog procesa (istekao mu je vremenski okvir u kojemu se smije izvršavati), on odlazi u stanje u kojemu je “nasilno” zaustavljen od strane task schedulera. Ovo stanje procesa kada je zaustavljen od task schedulera, zbog prebacivanja na obradu drugog procesa se naziva preemption.
Zbog ovog naziva se i Linux mehanizam task schedulera zove Preemptive multitasking mehanizam.
Vremenski period u kojemu se proces može izvršavati je definiran za svaki proces unaprijed na osnovu prioriteta koji mu je određen. Zapravo se u pozadini primjenjuje određeni algoritam koji izračunava te vremenske okvire za svaki proces.
Isti mehanizmi koji se primjenjuju na procese, primjenjuju se i na sve niti (Engl. Threads) unutar svakog pojedinog procesa.
Na još nižoj razini radi se klasifikacija procesa prema nekoliko glavnih kategorija:
Postoji i dodatna kategorizacija :
Scheduler
Do linuxa 2.6.23 se koristio tkzv. O Scheduler. Od linux kernela 2.6.23 koristi se tkzv. CFS (Completely Fair Scheduler) koji je podijeljen u nekoliko dijelova odnosno logičkih cjelina:
Za svaki proces se u početku određuje Scheduling Policy na osnovu kojeg se odrađuju parametri za stavljanje u niz za obradu (run queue). Linux podržava njih nekoliko :
Kada proces uđe u niz za izvršavanje (run queue), unutar task schedulera te dođe na obradu, scheduler pamti trenutno vrijeme kada je proces krenuo prem CPU na obradu. Tada se proces šalje na CPU i obrađuje se. Task scheduler odbrojava vrijeme koje je izračunato, koliko se proces smije izvršavati i to na osnovi svih parametara pomoću kojih je izračunat vremenski okvir za rad konkretnog procesa. Kada se vrijeme za izvršavanje približi kraju, proces se zaustavlja (sada je u preemptive stanju) te se drugi proces, koji je sljedeći stavljen u red (run queue) na obradu šalje na CPU.
Niz za izvršavanje (run queue) ima svoj algoritam za određivanje procesa koji ulaze u njega. Algoritam koji se trenutno koristi je tkzv. Red-Black-Tree https://en.wikipedia.org/wiki/Red-black_tree
Primjeri
Provjerimo koji Scheduling policy je primijenjen na naš proces SSHD (SSH servis).
Za ovu najenu koristimo naredbu chrt sa prekidačem -p nakon kojega slijedi PID procesa.
Naš SSH servis im PID (provjerili smo sa: pidof sshd) : 1995
chrt -p 1995 pid 1995's current scheduling policy: SCHED_OTHER pid 1995's current scheduling priority: 0
Vidimo da je odabran SCHED_OTHER.
Također vidimo da je dodatno odabran prioritet 0.
Neki “Scheduling policy”-ji imaju mogućnost odabira i dodatnog prioriteta (korist ise za dodatno optimiziranje).
Pogledajmo u kojim okvirima je moguće optimizirati prioritete unutar svakog “Scheduling policy”-a.
chrt -m SCHED_OTHER min/max priority : 0/0 SCHED_FIFO min/max priority : 1/99 SCHED_RR min/max priority : 1/99 SCHED_BATCH min/max priority : 0/0 SCHED_IDLE min/max priority : 0/0
Vidiljivo je da je optimizacija prioriteta, za naš sustav (ovisno o verziji kernela) moguća samo za : SCHED_FIFO i SCHED_RR i to od 1 (najmanji prioritet) do 99 (najveći prioritet).
Moguće je i ručno promijeniti “Scheduling policy” za određeni proces.
! OPREZ !
Naredba je ista samo što je potrebno dodati prekidač koji označava algoritam :
-b - odabir SCHED_BATCH-f - odabir SCHED_FIFO-i - odabir SCHED_IDLE-o - odabir SCHED_OTHER-r - odabir SCHED_RRDakle za naš slučaj , ako želimo ipak odabrati “SCHED_BATCH” to ćemo napraviti ovako:
chrt -b -p 1995 ... ... ...
Ove vrijednosti nije dobro mijenjati osim ako nise stvarno sigurni što radite.
Više informacija
Ako želimo detaljnije informacije o “Task scheduler”-u, za cijeli operacijski sustav, možemo pogledati sadržaj datoteke : /proc/sched_debug.
Sched Debug Version: v0.09, 2.6.32-573.7.1.el6.x86_64 #1 now at 18401716.231694 msecs .jiffies : 4313069012 .sysctl_sched_latency : 10.000000 .sysctl_sched_min_granularity : 2.000000 .sysctl_sched_wakeup_granularity : 2.000000 .sysctl_sched_child_runs_first : 0.000000 .sysctl_sched_features : 3183 .sysctl_sched_tunable_scaling : 1 (logaritmic) cpu#0, 2933.184 MHz .nr_running : 1 .load : 1024 .nr_switches : 322149 .nr_load_updates : 177726 .nr_uninterruptible : 0 .next_balance : 4313.069256 .curr->pid : 20106 .clock : 18401716.016690 .cpu_load[0] : 1024 ... ... ... ...
Detalje je moguće vidjeti i na razini svakog procesa, prema njegovom PID broju. Statistike se nalaze u /proc/PID BROJ/sched
Pr. za naš proces PID 1995
cat /proc/1995/sched sshd (1995, #threads: 1) --------------------------------------------------------- se.exec_start : 1025020.040554 se.vruntime : 6306.910656 se.sum_exec_runtime : 1.271729 se.wait_start : 0.000000 se.sleep_start : 1025020.040554 se.block_start : 0.000000 se.sleep_max : 954878.791664 se.block_max : 0.000000 se.exec_max : 0.314730 se.slice_max : 0.381025 se.wait_max : 0.159499 se.wait_sum : 0.173135 se.wait_count : 7 se.iowait_sum : 924.802882 se.iowait_count : 103 ... ... ... avg_atom : 0.181675 avg_per_cpu : 1.271729 nr_switches : 7 nr_voluntary_switches : 5 nr_involuntary_switches : 2 se.load.weight : 1024 policy : 0 prio : 120 clock-delta : 79
Moguće su i optimizacije cijelog sustava, pomoću poznatih unosa unutar /proc/sys/kernel/ direktorija, tj. unutar datoteka od kojih svaka ima svoju namjenu odnosno svaka datoteka je zadužena za određenu opciju ili parametar.
Za sve koji žele optimizirati razne opcije i parametre scheduler-a, pogledajte što je sve dostupnu :
ls -a /proc/sys/kernel/sched_* /proc/sys/kernel/sched_autogroup_enabled /proc/sys/kernel/sched_nr_migrate /proc/sys/kernel/sched_cfs_bandwidth_slice_us /proc/sys/kernel/sched_rr_timeslice_ms /proc/sys/kernel/sched_child_runs_first /proc/sys/kernel/sched_rt_period_us /proc/sys/kernel/sched_compat_yield /proc/sys/kernel/sched_rt_runtime_us /proc/sys/kernel/sched_features /proc/sys/kernel/sched_shares_window /proc/sys/kernel/sched_latency_ns /proc/sys/kernel/sched_time_avg /proc/sys/kernel/sched_migration_cost /proc/sys/kernel/sched_tunable_scaling /proc/sys/kernel/sched_min_granularity_ns /proc/sys/kernel/sched_wakeup_granularity_ns
Ove opcije i parametri se mogu mijenjati ručno (trenutno) ili trajno, pomoću sysctl unosa u /etc/sysctl.conf.
Malo prije smo rekli kako je Task scheduler odnosno Process scheduler mehanizam zadužen za obradu odnosno baratanje s procesima. Zbog činjenice kako se na vrlo niskoj razini, na jednoj jezgri centralnog procesora (CPU) u jednom vremenskom okviru, može odraditi samo jedan proces, ovaj mehanizam je vrlo važan za performanse cijelog operacijskog sustava. Za ovaj mehanizam je u konačnici zadužen Context Switching.
Context switch je mehanizam u kojemu se proces (program) ili njegove niti koje se trebaju obraditi, u prvoj jedinici vremena prvo učitavaju u CPU, te obrađuju. Potom se u drugoj jedinici vremena pauziraju kako bi se njihovo stanje i međurezultati privremeno zapisali u memoriju a potom obrisali iz priručne memorije CPUa. Sve zbog prebacivanja na izvršavanje novog procesa ili njegovih (ili drugih) niti. Dakle sustav konstantno obrađuje sve programe/procese - jedan, po jedan, u vrlo malim vremenskim okvirima i tako u krug, a što nam daje privid istovremenog izvršavanja više programa ili niti.
Prema definiciji context switch je proces pohranjivanja i ponovnog preuzimanja stanja (contexta) procesa u kojemu njegova obrada može biti privremeno zaustavljena ali i ponovno pokrenuta u bilo kojem trenutku.
Naime Context switch mehanizam se konstantno ponavlja pošto svaki operacijski sustav ima pokrenuto na desetke programa odnosno procesa kao i više niti unutar svakog procesa. Dakle ovo prebacivanje između procesa ili niti se događa na desetke, stotine ili tisuće puta u sekundi, svake sekunde.
Pogledajmo pojedini proces ili nit procesa na nižoj razini odnosno na razini njegovih logičkih cjelina ili funkcija koje se izvršavaju unutar njega.
Slika : Context switching koji se ponavlja za svaki pokrenuti program/proces ili nit unutar svakog programa.
Zamislimo program koji radi određene matematičke operacije. Na početku naš program želi krenuti s izračunavanjem, pa task scheduler odrađuje prvi context switch s trenutnog programa koji je na obradi unutar CPUa, na naš program :
Ovo je samo pojednostavljeni opis onoga što se događa kod context switchinga - zapravo se tu mijenjaju :
* registri * stack pointeri * adresni prostor * ....
Dakle context switching je osnovni mehanizam koji nam daje privid istovremenog izvršavanja više procesa unutar jedne jezgre CPUa odnosno on je osnovni mehanizam koji osigurava Multitasking odnosno višezadaćnost.
Context switch mehanizam radi proces ili thread switching odnosno prebacivanje između procesa. On se često naziva i task switch.
Podsjetite se poglavlja proces translacije adresa i to dijela “Zbog čega toliko priče o TLB-u ?”
Svako novo prebacivanje između procesa odnosno Context Switch, prazni i TLB memoriju (pogledajte sliku gore), te ju ponovno popunjava pretraživanjem glavne Page tablice kod prebacivanja obrade na novi proces. Ovo vrijedi i za niti (Engl. Thread). S obzirom kako se svake sekunde događa ogroman broj ovih prebacivanja između aktivnih procesa, jasno je koliko ovo može utjecati a i utiče na performanse cijelog sustava.
Međutim, kod novijih procesora, postoji podrška za tagged TLB metodu, kod koje se ne mora prazniti cijeli TLB, kod prebacivanja između procesa. Naime kod ove metoda, moguće je zasebno označavanje (Engl. Tag) samo određenog dijela adresnog prostora, unutar TLB tablice, čime se prilično ubrzao proces, jer se tada više ne mora prazniti cijela TLB memorija.
Dodatno, svaki pojedini proces koji je trenutno na obradi, može u bilo kojem trenutku čekati na neki događaj (Engl. Event) ili neki uređaj - primjerice:
U tom trenutku taj aktivni proces ništa ne radi već je u stanju čekanja na neki drugi element sustava. U takvim slučajevima je moguće, da task scheduler oduzme vrijeme za obradu trenutnom procesu, te se prebaci na obradu drugog procesa. Dakle da napravi novi contex switch, a potom, kada prvi proces postane aktivan, da se prebaci na njega… i dalje u krug. Ovakav scenarij je moguć samo u slučajevima koji nisu prešli određene granice.
Konkretan primjer bi bilo čekanje na zapisivanje prema diskovnom podsustavu, koje može biti asinkrono ili sinkrono. U oba slučaja, kada se popune sve međumemorije, naš proces koji je trebao nešto zapisati na disk, će morati ostati u stanju čekanja, na dovršetak operacija snimanja na disk. Kod sinkronog zapisivanja ovo zagušenje će se kod velikog opterećenja prema diskovnom sustavu, vrlo brzo dogoditi, a kod asinkronog nešto kasnije, jer se koriste dodatne međumemorije Linuxovog diskovnog podsustava.
Indikacija ovakvog stanja čekanja je veliko I/O Wait vrijeme procesora (CPUa).
Za detalje pogledajte poglavlje Diskovni I/O podsustav, poglavlje: Sinkroni i Asinkroni I/O.
Dodatno, kako bi razumjeli hardverska ograničenja, koja utječu na context switching, pogledajte detaljnije poglavlje: CPU registri još detaljnije
Naime sada možemo uvrstiti i veći dio varijabli u izračun troškova context switchinga:
Sve zajedno, u praksi, kada aplikacija koristi SMP sustav s više CPU jezgri. Dodatno za ovakav sustav nemamo kontrolu na kojoj će CPU jezgri u kojem trenutku proces biti prebačen dinamički (jer smo prepustili sustavu da se brine o tome. Ovdje možemo očekivati slijedeća vremena.
Dakle vremena između 3000 ns (3 μs) i 4500 ns (4.5 μs) samo za prebacivanje s procesa na proces.
Druga situacija je u slučajevima kada imamo SMP sustav, s više CPU jezgri ali smo zaljepili proces na točno definiranu CPU jezgru:
Dakle sada vidimo kako su se vremena smanjila, na najmanje 1300 ns (1.3 μs) odnosno najviše 1900 ns (1.9 μs).
Jasno je kako sve ovisi o arhitekturi procesora i samog sustava. U oba primjera testa radilo se samo prebacivanja s procesa na proces, bez ikakve obrade procesa, dakle ovo su samo vremena potrebna kako bi se prebacilo s jednog procesa na drugi (jedan context switch). Na novijim generacijama procesora ova vremena jesu i biti će sve manja ali ne drastično.
Izvor informacija/testa: 1
Pogledajmo sada primjer dijagrama vremena, s uključenim vremenom context switcha. U primjeru imamo dva procesa:
Vidljivo je kako se prije prebacivanja obrade s jednog procesa na drugi, odrađuju sve radnje unutar context switch mehanizma (gore navedene točke 1-3), a tek potom se kreće s obradom novog procesa i tako u krug.
Vjerujem kako je sada puno jasnije koliko košta svaki context switch.
Dodatno, pogledajte poglavlje: CPU registri još detaljnije i to dio I još malo detalja vezanih uz memoriju - tablica dolje.
Kako smo naveli u gore navedenom poglavlju o CPU registrima, u primjeru obrade mrežnih paketa, vidljivo je slijedeće:
| Brzina mreže | Maksimalno vrijeme obrade | Broj taktova/ciklusa CPU (2GHz CPU) unutar koji se mora odraditi svaki paket |
|---|---|---|
| 1 Gbps | 672 ns | 1340 ciklusa |
| 10 Gbps | 67.2 ns | 134 ciklusa |
| 40 Gbps | 16.8 ns | 33.5 ciklusa |
| 100 Gbps | 6.7 ns | 13.4 ciklusa |
To znači kako CPU koji radi na 2GHz, za obradu svakog pojedinog mrežnog paketa, na brzini 1Gbps, ima 1340 CPU ciklusa, odnosno 672 ns. Dok već na brzini od 10Gbps, isti CPU mora svaki mrežni paket obraditi za samo 134 CPU ciklusa, odnosno da ima samo 67.2 ns vremena za to. U slučaju kada bi e procesirao svaki paket zasebno, , što se može povremeno dogoditi, ali što srećom nije baš čest slučaj, u primjerima dobro napisanih upravljačkih programa za mrežne kartice, kao i drugih komponenti mrežnog podsustava. Naime dobro napisane/razvijene komponente mrežnog sustava trebaju imati dobar balans između grupiranja više mrežnih paketa koji se šalju na obradu i brzog odziva na obradu paketa. U konkretnom primjeru, to postaje veliki izazov (problem) za programere koji razvijaju ove sustave, jer se na sve većim brzinama, mora paziti na svaki takt rada CPUa odnosno na svaku potrošenu nano sekundu (ns). Naime standardno vrijeme obrade pojedinog mrežnog paketa je obično u rasponu od nekoliko stotina CPU ciklusa do čak nešto preko tisuću (1000) CPU ciklusa. Sve ovisno o izvedbi svih slojeva mrežnog podsustava i u konačnici načina obrade odnosno procesiranja paketa odnosno procesa koji je zadužen za njihovu obradu ali i context switchinga.
Iako izgleda kao teorija, stvarno su moguće i dostupne razne tehnike i tehnologije za tu svrhu a jedan od primjera je upotreba sistemskih biblioteka, koje su visoko optimizirane za brzu obradu mrežnih paketa - DPDK, koji unutar samo 80 CPU ciklusa, modernih procesora, može primiti ili poslati pojedini mrežni paket.
Drugi primjer je netmap framework, koji je također razvijen za sličnu namjenu, a koji omogućava programima mogućnost procesiranja i prosljeđivanja mrežnih paketa, vrlo velikim brzinama (unutar 90 CPU ciklusa), korištenjem netmap API. netmap Framework se danas standardno koristi na FreeBSD Unixu (još od inačice 9.1) ali sve više i na Linuxu, na kojemu je integriran i sa KVM/QEMU za virtualizaciju.
Slijedeći primjer je PF RING koji je razvijen za potrebe brzog dohvaćanja, filtriranja i analize mrežnih paketa, najviše za potrebe programa za analizu mrežnog prometa, poput programa ntop odnosno ntopng.
U sva tri slučaja, zbog dobivanja drastično boljih performansi, zaobilazi se kernel ili njegov network stack i omogućava pristup fizičkoj (ili virtualnoj) mrežnoj kartici, preko API poziva koje nam daje neki od navedenih frameworka. Druga priča je razvoj visoko optimiziranih upravljačkih programa, koji nisu dostupni za sve mrežne kartice, već obično samo one serverske i to od većih/profesionalnijih proizvođača.
Krenimo na primjere
1. Provjerimo koliko procesa se kreira svake sekunde te koliko “context switch”-eva je aktivno u svakoj sekundi, na razini cijelog operacijskog sustava. Pratiti ćemo ove statistike svake sekunde (1) , i to četiri puta (4).
Za ovu namjenu koristimo naredbu sar iz paketa sysstat koji smo već objasnili u prijašnjim poglavljima.
sar -w 1 4 Linux 2.6.32-42-pve (server1) 11/11/2015 _x86_64_ (4 CPU) 21:20:38 PM proc/s cswch/s 21:20:39 PM 1.00 28053.00 21:20:40 PM 2.00 28518.00 21:20:41 PM 10.00 28349.00 21:20:42 PM 1.00 28313.00 Average: 3.50 28308.25
Opis :
proc/s broj procesa koji se kreiraju svake sekundecswch/s broj ukupnih context switcheva na cijelom sustavu. Ovdje je vidljivo kako se na cijelom sustavu odrađuje konstantno oko 28 000 context switcheva u sekundi.Vidljivo je kako se na našem Linuxu u prosjeku kreiraju 3.5 procesa. Također je vidljivo da imamo prosječno oko 28308 aktivnih context switch-eva. U primjeru je ispis sa prilično opterećenog poslužitelja s velikim brojem aktivnih procesa/aplikacija.
2. Provjerimo koliko naš proces ima aktivnih “context switching”-a - ručni rad
Zanima nas naš Apache (httpd) server.
Nađimo njegov proces ID (PID)
pidof httpd 2738847 6441
Dobili smo dva PID-a , mi ćemo gledati PID 6441.
Unutar datoteke stat su razne statistike koje se osvježavaju u realnom vremenu. Između ostalih tu je i statistika o context switchingu.
Kao što smo spominjali u poglavlju Diskovni I/O sustav, unutar direktorija /proc/PID/ se nalazi i datoteka stat iz koje tražimo željene statistike, koje filtriramo pomoću programa grep.
Važno je napomenuti kako se vrijednosti zbrajaju.
cat /proc/6441/status | grep ctxt voluntary_ctxt_switches: 1109747 nonvoluntary_ctxt_switches: 13
Opis :
voluntary_ctxt_switches - Broj aktivnih context switcheva (zbrojno - povećava/zbraja se)nonvoluntary_ctxt_switches - Broj problematičnih context switchevaŠto znači “problematični” :
Non-Voluntary context switching se događa, kada operacijski sustav oduzima nit (thread) sa CPUa bez da je zahtjev za oduzimanjem odnosno zatvaranjem tog context switcha (threada) stvarno zahtjevan od strane procesa odnosno aplikacije.
Ovo se može događati ako su CPU resursi postali vrlo ograničeni te se počinju nasilno zatvarati niti (context switches/threads). Ovo često nije dobar pokazatelj i težimo što manjoj statistici na ovom parametru.
2.1 Provjerimo koliko naš proces ima aktivnih context switchinga - preko naredbe pidstat
Želimo statistike svake sekunde (1) i to četiri puta (4)
Ako i dalje pratimo PID 6441 tada pokrenimo:
pidstat -w -p 6441 1 4 Linux 2.6.32-42-pve (server1) 11/17/2015 _x86_64_ (4 CPU) 02:01:11 PM PID cswch/s nvcswch/s Command 02:01:12 PM 6441 1.00 0.00 httpd 02:01:13 PM 6441 1.00 0.00 httpd 02:01:14 PM 6441 1.00 0.00 httpd 02:01:15 PM 6441 1.00 0.00 httpd Average: 6441 1.00 0.00 httpd
Opis :
I ovdje se teži da je broj nvcswch/s što manji.
U slučaju kada želimo ispisati listu svih aktivnih procesa i njihov trenutni broj context switchinga, potrebno je samo pozvati naredbu pidstat sa prekidačem -w.
pidstat -w Linux 2.6.32-42-pve (server1) 11/17/2015 _x86_64_ (4 CPU) 01:39:16 PM PID cswch/s nvcswch/s Command 01:39:16 PM 1 0.20 0.00 init 01:39:16 PM 2 0.00 0.00 kthreadd 01:39:16 PM 3 0.03 0.00 migration/0 01:39:16 PM 4 3.05 0.00 ksoftirqd/0 01:39:16 PM 5 0.00 0.00 stopper/0 01:39:16 PM 6 0.08 0.00 watchdog/0 ... ... ... ... ....
Ovo je korisna naredba ako žeimo saznati koji od aktivnih (pokrenutih) procesa (programa/aplikacija) ima najveći broj “context switching”-a.
3. Praćenje broja context switcheva (ili niti) na nivou aplikacije, u realnom vremenu - “ručno”. Ovu statistiku možemo pratiti i u realnom vremenu (svake dvije sekunde se osvježava), za našu željenu aplikaciju. Važno je napomenuti kako se vrijednosti zbrajaju.
watch -d "cat /proc/6441/status | grep ctxt" Every 2.0s: cat /proc/6441/status | grep ctxt Mon Nov 11 22:46:30 2015 voluntary_ctxt_switches: 1110909 nonvoluntary_ctxt_switches: 13
Ovo praćenje se prekida sa CTRL + C
U normalnom radu na Unix ili Linux sustavima u terminalu (shellu), obično pokrećemo (kao korisnici) jednu po jednu naredbu, odnosno imamo pokrenut samo jedan proces. Dakle svakodnevne radnje u terminalu poput pokretanja naredbi za izlistanje direktorija ( ls -al ), editiranje datoteka (pr. s programom vi) i slično rade na način u kojem program (naredba) koju pozivamo, preuzima kontrolu nad tim terminalom te vraća kontrolu shellu, kada se program završi.
Na nižoj razini, radi se o preuzimanju kontrole nad standardnim ulazom (stdin) i izlazom (stdout), što znači preuzimanje kontrole nad pisanjem ili čitanjem na terminal, a po završetku, prepuštanju istih ( stdin i stdout ) shellu.
U određenim situacijama, ipak imamo potrebu, pokrenuti neki program ali istovremeno i započeti s radom na drugom programu u istom terminalu.
Stanje u kojem, pokrenuti program prebacujemo na rad u pozadini, u kojoj on nije u mogućnosti primati ulaz iz našeg terminala (i naravno tipkovnice), naziva se rad u pozadini tj. u backgroundu. Dok program u kojem radimo u terminalu, i koji prima ulaz s terminala (unos s tipkovnice) radi u foregroundu.
Unix odnosno Linux poslovi (Engl. Jobs) omogućavaju nam upravo ove mogućnosti - programe možemo pokretati u našoj ljusci (Shellu) (to su foreground poslovi) a možemo ih, u bilo kojem trenutku, privremeno zaustaviti, prebaciti na rad u pozadini (background) ili ponovno pokrenuti.
Kontrola jobova je definirana kao mogućnost selektivnog zaustavljanja (suspend) izvršavanja željenog procesa uz mogućnost, njegovog kasnijeg nastavljanja s izvršavanjem (resume).
Dakle bilo kojem pokrenutom:
možemo promijeniti stanje rada (job control), kako smo naveli.
Provjeru stanja jobova možemo napraviti korištenjem naredbe jobs.
Poslovi (jobs) mogu biti u sljedećim stanjima:
Foreground - ovo je standardno stanje - [ fg ]Background - pokretanje u pozadini ili ako se pokreće sa & na kraju - [ bg ]Stopped - zaustavljen ali se može ponovno pokrenuti u Foreground ili Background stanjuTerminated - zaustavljen trajno (terminiran)
Malo detaljnije o jobovima
Standardno razumijevanje jobova je kao pojedinih pokrenutih programa, naredbi ili procesa u konačnici. Ali pošto svaki Unix i Linux podržavaju povezivanje naredbi preko pipea ( | ) sada dobivamo malo drugačiju situaciju. Naime povezivanjem naredbi preko pipea, povezujemo više naredbi ili programa, koji komuniciraju međusobno. Odnosno obično se rezultat prve naredbe prosljeđuje kao ulaz drugoj, njen rezultat (izlaz) se prosljeđuje trećoj, kao njen ulaz i tako dalje. Dakle u jednoj liniji ili prolazu, pokreće se više zasebnih programa ili naredbi (procesa), a s kojima job control nekako mora znati raditi.
Pogledajmo primjer dolje:
cat imena-studenata.txt | grep pero
Dakle s naredbom cat smo ispisali sadržaj datoteke u kojoj imamo popis studenata koji su se prijavili na predavanje ( imena-studenata.txt ) te ispis prosljeđujemo naredbi grep, koja traži ime pero.
U ovom primjeru ćemo imati pokrenuta dva programa/naredbe odnosno procesa (ako gledamo s razine operacijskog sustava):
catgrepA oba se pokreću iz jedne linije i logički su jedna cjelina, pa bi se trebali i ponašati kao jedan entitet, odnosno u ovoj priči, kao jedan job.
Za detalje i primjere upotrebe pipea - pogledajte poglavlje : "Preusmjeravanje (redirekcija) i “Pipe”"
Prema POSIX standardu (Poglavlje: "Regionalne postavke odnosno "Locale" " ), kojeg se pridržava i Linux, svaki novi shell, preuzima kontrolu nad Tzv. sessionom i process groupom, te preuzima kontrolu nad procesnom grupom samog terminala na kojem radimo.
Shell kreira novu procesnu grupu unutar svog sessiona, za svaki job, koji se pokreće. U slučajevima kada se primjerice koristi pipe mogućnost, te se u jednom nizu izvršava više programa ili naredbi, shell se brine o tome, kako se kod inicijalizacije, događa slijedeće:
Na ovaj način je uopće moguć rad jobova.
U gornjem primjeru, kako se kreira novi niz naredbi povezanih pipeom - tj. novi cjevovod (pipeline), kreira se i nova procesna grupa u kojoj se izvršavaju dvije naredbe (dva različita procesa) i to : cat i
grep a koje se kontroliraju iz jedne jedine procesne grupe, koju kontrolira job control mehanizam.
U slučajevima kada jedan program/proces, pokreće neki novi program/proces, novi program/proces pripada istoj procesnoj grupi kao proces koji ga je pokrenuo (kao roditeljski proces).
U primjerima koji slijede bit će jasno što su poslovi i kako se barata s njima.
Primjeri:
Kreiraj datoteku koja će se popunjavati slučajnim znakovima
dd if=/dev/urandom of=/root/slucajni.znakovi.txt
Stopiraj ovaj posao (job)
CTRL z [1]+ Stopped dd if=/dev/urandom of=/root/slucajni.znakovi.txt
Vidljivo je da ovaj posao im ID br. 1.
Pokrenuti ćemo ga ponovno u pozadini (background)
bg 1
Stopirati ćemo ovaj isti posao (job) br 1 [prije broja posla mora biti znak %]
stop %1
Prebaciti ćemo ga ponovno u normalan rad (foreground)
fg 1
I na kraju ćemo ga stopirati
CTRL c
Pokretanje naredbi u pozadini
Istu naredbu ( dd ) smo mogli odmah pokrenuti u pozadini, te nastaviti raditi u našem shellu. Pošto bi ova naredba nastavila raditi u pozadini beskonačno dugo i kreirala datoteku koja bi postajala sve veća, ipak ćemo ju malo ograničiti.
Naredbi dd ćemo dodati par prekidača koji će ograničiti veličinu datoteke koja će biti kreirana. Dodati ćemo prekidač bs= koji nam govori kolika će biti veličina blokova podataka u kojima će se snimati podaci u datoteku - mi ćemo reći 1MB. Dodatno ćemo definirati, koliko puta po toj jediničnoj veličini ( bs ) će se ponavljati zapisivanje - za to koristimo count= - reći ćemo 1. Dakle 1MB (blok) x 1 (broj ponavljanja) = 1MB ukupno.
dd if=/dev/urandom of=/root/slucajni.znakovi.txt bs=1M count=1 &
Znak & na kraju znači da smo naredbu (ili niz naredbi) pokrenuli u pozadini.
Podsjetimo se: Shell ili komandnolinijska ljuska je sučelje između korisnika i Operativnog sustava, iz njega pokrećemo razne programe i upravljamo cijelim sustavom. Postoji ih veći broj,od kojih svaki ima neke specifičnosti, mi ćemo se bazirati na bash (Bourne-Again SHell) shellu.
Najveća snaga svakog shella (komandnolinijske ljuske) je mogućnost izrade shell skripti. Bash nam daje prilično široke mogućnosti.
Svaka shell skripta mora zadovoljiti dva uvjeta:
1. Prvi red svake skripte mora sadržavati tkzv. sha-bang ili shebang, koji daje instrukcije operativnom sustavu. kakva je to skripta i što da prvo pokrene.
U našem slučaju to je bash shell skripta, dakle za njeno pokretanje sustav će za nas u pozadini prvo pokrenuti bash shell (može biti i neki drugi shell - kada pričamo o shell skriptama) pa našu skriptu u njemu.
Kako to izgleda (mora počinjati sa #! , nakon koje slijedi točna putanja do bash shella)
#!/bin/bash ...
2. Skripta mora biti izvršna (eXecute). Dakle treba promijeniti ovlasti (permissions) da skripta postane izvršna (pr. chmod +x ime.skripte )
Svaka Shell skripta nakon prvog reda #!/bin/bash u kojemu definira shell koji se poziva, ima neki niz naredbi koje skripta mora izvršiti. Naredbe se obično nižu - svaka u novom redu - prema redoslijedu kojim se moraju izvršavati.
Ovo nizanje naredbi, koje želimo da se izvršavaju, izvršava se vrlo slično kao kada bi iste te naredbe pokrenuli i sami iz svog shell-a.
Zamislimo slijedeću shell skriptu:
#!/bin/bash cd /root/ ls -al
Pokretanjem ove shell skripte pokreće se novi (pod)shell (/bin/bash) u kojemu se pokreće prva naredba koju smo pozvali u shell skripti. U konkretnom slučaju je to cd /root/ što znači da ulazimo u direktorij /root/.
Potom se pokreće slijedeća naredba (u novom redu) : ls -al koja nam ispisuje sadržaj našeg trenutnog direktorija u koji smo upravo ušli (/root/).
Osim čistog nizanja naredbi, u svakom novom redu, Bash shell nam omogućava i korištenje varijabli te kreiranje željenih uvjeta i petlji. Dodatno možemo praviti i svoje funkcije koje možemo kasnije pozivati. Sve u svemu BASH shell nam omogućava pisanje shell skripti koje podsjećaju na neki jednostavniji programski jezik.
Napredno: Što se inicijalno događa kod pokretanja svake shell skripte ?
Sada kada smo u grubo shvatili kako rade shell skripte upoznati ćemo se sa procesima koji se događaju kod inicijalizacije svake shell skripte koju pokrećemo - u trenutku svakog njenog pokretanja.
U prvom trenutku novi shell (BASH u našem slučaju) skenira sistemske varijable (Engl. Environment Variable) i njihove vrijednosti, koja postavlja kao svoje.
Sve dodatne varijable koje nisu eksportirane (export IME_VARIJABLE=VRIJEDNOST), neće doći do pod shella odnosno u konačnici do shell-a skripte. Naime svaka skripta pokreće svoj shell, koji je prema hijerarhiji shell ispod onoga iz kojega se pokreće sama skripta, pa tako imamo po jedan podshell odnosno pod ljusku ako hoćete, za svaku pokrenutu skriptu.
Kada je pod shell odnosno drugi shell koji pokreće naša skripta u procesu inicijalizacije dohvatio i postavio sve sistemske (Environment) varijable, kao i varijable koje su “eksportirane”, on kreće s postavljanjem posebnih varijabli kao što je varijabla $# , koja pokazuje s koliko argumenata je sama skripta pokrenuta. Nadalje postavljaju se i varijable pozicije ( $0 , $1 , $2 , ... ) i druge posebne varijable.
Još jedna od ovih “posebnih” varijabli je varijabla SHLVL koja numerira razinu vršnog ili pod shella. Tako je uvije prvi (login) shell razine 1, prvi njegov pod shell razine 2 a njegov pod shell razine 3 i tako dalje.
Pogledajmo primjer kada iz prvog (login) shella pokrećemo pod shell a iz tog pod shell pokrećemo pod pod shell. Dakle u svakom novom pod shellu se ova varijabla povećava.
[root@server: ~]# echo $SHLVL 1 [root@server: ~]# bash [root@server: ~]# echo $SHLVL 2 [root@server: ~]# bash [root@server: ~]# echo $SHLVL 3
Dalje u radu naša skripta, koja se sada izvršava u novom shellu (ljusci), u trenutku kada se pokreće neka naredba, prvo se provjerava da li se ta naredba nalazi u standardnoj sistemskoj varijabli PATH, koju je ovaj shell pokupio od vršnog shella.
Varijabla PATH sadrži putanje do izvršnih datoteka (naredbi). Ako je naša naredba u nekom dugom direktoriju osim onoga definiranog u ovoj varijabli, tada ju shell neće moći pronaći niti pokrenuti i za nju će izbaciti grešku te nastaviti dalje.
Stoga je važno provjeriti vrijednost ove varijable ili unutar skripte definirati novu PATH varijablu koja će sadržavati i nama potrebne direktorije.
Naša shell skripta bi sada izgledala ovako:
#!/bin/bash PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin cd /root/ ls -al
Novoj varijabli PATH dodajemo postojeće vrijednosti stare varijable PATH (tj. $PATH) te dodajemo i nove direktorije, koji se odvajaju znakom :.
Sada sve naredbe koje ćemo koristiti dalje u skripti, a nalaze se u nekom od definiranih direktorija unutar ove varijable, naš podshell može uredno i pokrenuti jer zna kako doći do njih. Točnije sada zna na kojoj putanji bi se mogle nalaziti naredbe koje ćemo pokretati/pozivati.
Dodatna važna funkcionalnost podshella/podljuske je proslijeđivanje Tzv. “Exit statusa” znanog i kao “Return code” ili “Exit code” prema vršnom shellu. Ovaj “status” kod radi na principu da ako je sve u redu, šalje se vrijednost 0 a ako nešto nije u redu, može se slati neka druga vrijednost. Ova vrijednost se šalje vršnom shellu, kao parametar $? .
Osim slanja statusnih kodova vršnom shellu (Engl. Parent Shell), ove statusne kodove možemo i čitati unutar našeg shella ili skripte. Pogledajte primjere i opis u poglavlju ”Nizanje naredbi“.
Nakon što je naš (pod)shell locirao prvu naredbu pretraživanjem svih putanja direktorija koji su definirani u PATH varijabli on provjerava da li je naredba izvršna odnosno da li ima postavljena “execute” prava.
U ovom koraku se provjerava koji je tip datoteke - i dalje govorimo o naredbi koju treba izvršiti unutar skripte (jedna po jedna). Ako se radi o binarnoj datoteci ona se izvršava. Ako se ipak radi o drugoj skriptnoj datoteci ili nekoj drugoj tekstualnoj datoteci koja je izvršna, ona se također pokreće na način na koji je i naš vršni roditeljski (Parent) shell pokrenuo našu skriptu. Dakle pokreće se pod shell u kojemu se dalje izvršava ta nova skripta.
Na slici je primjer kada iz svog (Login shella) pokrećemo skriptu (korak 1), koja otvara svoj shell i pokreće se. Naša skripta potom pokreće drugu skriptu koja isto mora pokrenuti svoj shell (korak 2) i pokrenuti se u njemu. Kada je zadnja skripta završila, vraća rezultat prijašnjem shellu (korak 3) i zatvara svoj shell. Na kraju naša skripta kada završi s radom, također šalje rezultat vršnom shellu i zatvara svoj shell (korak 4) :
Sumarizirajmo :
export-ane )
Pogledajte i poglavlje "Upotreba okruglih zagrada" jer se s njima također mogu pokretati posebne vrste pod shell-ova.
Komandnolinjska ljuska (shell) omogućava nam upotrebu varijabli poput varijabli u nekom programskom jeziku.
Razlikujemo nekoliko vrsta varijabli:
“Obične” varijable vrijede samo unutar shell-a u kojem su pokrenute, Ako unutar postojećeg shell-a pokrenemo novi shell (tkzv. subshell), variable se neće nasljediti. U tu svrhu možemo koristiti “Environment varijable”, koje se prenose u sve pod shell-ove.
Primjeri
Kreirajmo sistemsku varijablu TEST , koja će imati vrijednost korisnik1
TEST=korisnik1
Ispišimo ju (vrijednost varijable dobivamo sa $)
echo $TEST korisnik1
Pogledajte i poglavlje ”Upotreba navodnika (jednostruki, dvostruki i jednostruki kosi)“ te se podsjetite upotrebe navedenih navodnika u kombinaciji s varijablama
Delimitiranje vrijednosti varijable
U slučaju da imamo potrebu nakon ispisivanje vrijednosti varijable spojiti i neku rijeć ovdje ćemo imati problem.
Primjerice želimo riječ “DOMENA” priljepiti vrijednosti varijable “TEST”.
echo $TESTDOMENA
Dobiti ćemo grešku.
Stoga je potreban delimiter varijabli odnosno njenoj vrijednosti. Za ovu potrebu se koriste vitičaste zagrade { } . koje se inače koriste i za regularne izraze.
Pogledajmo sada:
echo ${TEST}DOMENA
korisnik1DOMENA
Ovo izgleda pomalo nezgrapno ali pisanjem shell skripti, često se može pojaviti potreba da nakon potrebe za ispisivanjem vrijednosti varijable imamo i potrebu nadodati neku ključnu riječ ili slično, što je moguće isključivo na ovaj način.
Ako želimo ispisati vrijednost varijable koju koristimo u nekoj shell skripti tada možemo koristiti i dvostruke navodnike ” “ . U ovom primjeru ćemo dobit isti ispis ali u skripti ćemo biti sigurni da smo proslijedili upravo ono što smo i željeli.
echo "$TEST" korisnik1
Primjer shell skripte s varijablama
Kreirajmo osnovnu shell skriptu koja će postaviti vrijednost varijable te ju ispisati. Slijedeći kod (naredbe) zapišimo u datoteku “varijable.sh”
#!/bin/bash TEST=korisnik1 echo "$TEST"
Sada moramo našoj shell skripti dodjeliti izvršna prava (Engl. Execute). To ćemo napraviti na slijedeći način:
chmod a+x varijable.sh
Sada možemo i pokrenuti našu shell skriptu iz trenutnog direktorija:
./varijable.sh korisnik1
Zbog sigurnosnih razloga shell nikada ne pretražuje trenutni direktorij za izvršnim datotekama (pa tako niti izvršnim shell skriptama). Zbog toga je u slučaju kada želimo pokrenuti izvršnu datoteku (shell skriptu), u trenutnom direktoriju, potrebno naglasiti shellu kako se shell skripta nalazi u trenutnom direktoriju . tj. da ju pokrećemo iz trenutnog direktorija ./. Za sve ostale izvršne datoteke shell gleda sistemsku varijablu PATH te ih može pokretati iz svih direktorija nevedenih u toj varijabli
Vidjeli smo da nam je naša shell skripta ispisala vrijednost varijable “TEST”. Sada smo sve što smo napravili i ručno u shell-u, pokretanjem naredbi jedne za drugom, postigli u jednoj shell skripti.
U drugom slučaju ako želimo ispisati varijablu sa znakom $ koji bi nam inače dao njenu vrijednost, a u ovom slučaju to u nekoj shell skripti želimo proslijediti dalje, tada moramo koristiti jednostruke navodnike ' .
echo '$TEST' $TEST
Postavimo ovu varijablu kao Environment varijablu (za to se koristi naredba export), da bi ju kasnije mogli koristiti u novom subshell-u (“podshell”) :
export TEST
Pokrenimo podljusku (subshell) i ispišimo varijablu
bash echo $TEST korisnik1
Obrišimo postavljenu varijablu iz početnog shell-a (za to se koristi naredba unset)
unset TEST
Osim standardnih (običnih) i environment varijabli koje smo već spomenuli, moguće je definirati i konstante odnosno varijable koje se neće mijenjati.
Za to se koristi naredba readonly iza koje slijedi varijabla i njena vrijednost:
Primjer upotrebe konstanti
Definirajmo konstantu (varijablu) PI , koja će imati vrijednost 3.14 :
readonly PI=3.14
Sistemske (Engl. Environment) varijable su varijable koje koristi cijeli operacijski sustav te svi programi. Dakle to su varaijeble koje su vidljive u svim shell-ovima. Ovo su praktično eksportirane standardne varijable te su samim time vidljive svugdje te is mogu koristiti sve komponente sustava i svi programi.
Ovim varijablama se postavljaju određene opcije iparametri važni za funkcioniranje cijelog sustava i sistemskih programa odnosno naredbi.
Osnovne sistemske varijable možemo vidjeti s naredbom printenv.
Pogledajmo i neke od njih (ispisane su samo one koje su na sada zanimljive)
printenv HOSTNAME=server1.domena.hr SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=192.168.10.50 38501 22 SSH_TTY=/dev/pts/2 USER=root MAIL=/var/spool/mail/root PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin PWD=/root LANG=en_US.UTF-8 HOME=/root LOGNAME=root SSH_CONNECTION=192.168.10.50 38501 192.168.1.101 22 VISUAL=vi ... ... ...
Objasniti ćemo ih :
HOSTNAME je ima računala (poslužitelja)SHELL nam govori koji shell se koristi (u ovom slučaju bash)HISTSIZE je veličina history, mamorije (u ovom slučaju se pamti 1000 zadnje upisanih naredbi)SSH_CLIENT nam govori s koje IP adrese smo se spojili na SSH poslužitelj (192.168.10.50), koji je lokalni TCP port (38501) na klijentu te TCP port SSH servisa (22)SSH_TTY označava na koji smo virtualni terminal spojeni preko SSH protokola (/dev/pts/2)USER označava trenutnog korisnika (dakle mi smo logirani kao korisnik root)MAIL označava datoteku u koju nam se pohranjuju e-mailovi (za našeg korisnika)PATH daje nam listu putanje (Engl. Path) do izvršnih programa. Putanje su odvojene sa znakom :PWD pokazuje nam u kojem smo trenutnom direktoriju (Print Working Directory)LANG definira jezik i kodnu stranicu (u našem slučaju engleski i UTF-8 kodnu stranicu)HOME Home direktorij korisnika koji je logiram (/root/)LOGNAME Ime korisnika koji je logiranSSH_CONNECTION nam govori o SSH konekciji : klijentska IP (192.168.10.50) , klijentski TCP lokalni port (38501) , SSH poslužitelj i njegova IP (192.168.1.101) i njegov TCP port (22).VISUAL koji je tekst editor postavljem kao standardni (Engl. Default) - u našem slučaju je to VI editor.
Ako želimo vidjeti sve sistemske ali i sve Shell varijable koje su trenutno u upotrebi, za to možemo pokrenuti naredbu set.
Upotrebom ove naredbe ćemo dobiti znatno veću listu varijabli koje sadrže i one gore navedene pa ćemo stoga filtrirati njih samo nekoliko.
set HOSTTYPE=x86_64 OSTYPE=linux-gnu COLUMNS=151 LINES=45 UID=0 EUID=0 PPID=18749 PS1='[\u@\h \W]\$ ' SHLVL=1 TERM=xterm DISPLAY=localhost:10.0
A sada ćemo vidjeti njihovo značenje:
HOSTTYPE prikazuje arhitekturu procesora (x86_64 = 64. bitni x86 kompatibilni procesor)OSTYPE pokazuje koji operacijski sustav je u pitanju (Linux)COLUMNS pokazuje koliko slova stane u jedan red (trenutno) - mijenja se ovisno kako proširujemo ili skupljamo terminal prozorLINES slično kao prethodan varijabla samo što nam govori koliko redova ima naš trenutni terminalUID nam daje UID (User ID) trenutnog korisnika (0=root)EUID nam daje efektivni UID - tj. UID od trenutnog korisnika - ako smo mijenjali korisnika tj. sa jednog korisnika prešli u drugog (pogledajte naredbu su ).PPID Parent Proces ID od procesa s kojim smo spojeni na sustav. U našem slučaju 18749 je PID (Process ID) procesa koji je pokrenuo SSH servis koji je pokrenuo naš shell:Pogledajmo procese pa će nam biti jasnije
ps -ef |grep 11095 | grep -v grep ID : PID: PPID: root 18749 1332 0 11:01 ? 00:00:00 sshd: root@pts/3 root 11097 18749 0 11:01 pts/3 00:00:00 -bash
PS1 Ovdje su definirane postavke sučelja (Engl. Prompt settings) odnosno svega onoga što želimo vidjeti u radu u shellu, prije pozivanja svake naredbe. Dakle sve do znaka #, nakon kojega radimo u shellu (pozivamo naredbe ili skripte).[root@SERVER1 ~]#
Naša varijabla “PS1” ima vrijednost ”[\u@\h \W]\$ “
Što to znači (uz još nekoliko objašnjenih vrijednosti koje se mogu koristiti):
\u – “Username” - prikazuje ima trenutnog korisnika\h – “Hostname” - prikazuje ime računala\w – “Full path of the current working directory” - prikazuje trenutni direktorij u kojem se nalazimo\t - prikazuje trenutno vrijeme (sat)SHLVL nam govori koja je razina shella u kojem se nalazimo. Dakle ako je vrijednost 1 tad aje ovo prvi shell. Ako pokrenemo novi shell (subshell) vrijednost će biti 2, ako iz drugog shella pokrenemo još jedan, vrijednost će biti 3 itd.TERM označava vrstu terminala koja se emulira. Terminala ima cijeli niz. Najčešće se koriste “xterm” , “vt100” ili “linux” , “putty” i sl.
Listu podržanih terminala možemo vidjeti upotrebom naredbe toe.
Pogledajmo skračenu listu:
toe /usr/share/terminfo/ ... ... ... konsole KDE console window gnome GNOME Terminal putty PuTTY terminal emulator putty-vt100 VT100+ keyboard layout vt102 dec vt102 vt100 dec vt100 (w/advanced video) vt220 dec vt220 vt52 dec vt52 ... ... ... ansi ansi/pc-term compatible with color xfce Xfce Terminal xterm xterm terminal emulator (X Window System) ... ... ... linux linux console ... ... ... ... ... ...
Terminali su zaduženi za baratanje i prikaz teksta, posebnih znakova i signala te tkzv. “Escape” sekvenci unutar našeg “terminala”. Standardni terminal je onaj na koji se spajamo direktno dok se nalazimo ispred računala. S druge strane terminal s kojim i na koji se spajamo može biti ostvaren i udaljenom vezom preko SSH ili Telnet protokola - preko SSH ili telnet klijenta (koji su zapravo aplikacije za terminal).
Za posebne kontrolne znakove pogledajte ASCII tablicu (prvi dio tablice 0 - 31).
“Escape” sekvence čini kombinacija ESC koda i nekog od ASCII znakova. Svaka od Escape sekvenci naravno ima posebno značenje.
U konačnici, vrsta terminala odnosno vrsta emuliranog tipa terminala definira način na koji obije strane komuniciraju. (Biti će vam jasnije kada pogledate primjere na kraju ovog poglavlja).
Svaki od terminala ima neke specifičnosti. Loše usklađen tip terminala između poslužitelja i klijenta može uzrokovati probleme u radu a najčešće se manifestira krivim prikazom nekih znakova (alfabeta/posebnih znakova i sl) na ekranu, ili nemogućnošću upotrebe određenih poziva, upotrebe funkcijskih tipki (pr. F1,F2,…F12 ili sl.) te drugih problema.
Ovi problemi usko mogu biti povezani s krivim odabirom kodne stranice odnosno translacije karaktera (pr. UTF-8 ,ISO-8859-1 , ISO8859-2 i drugih ).
Primjeri
TERM=vt100 , uz UTF-8
Program mc (Midnight Commander)
Osim što smo izgubili boju, ne rade niti funkcijske tipke (F1, F2 , … , F12)
TERM=linux ili TERM=putty, uz UTF-8
Program mc
U ovoj kombinaciji sve radi.
TERM=linux ili TERM=putty, uz ISO-8859-1:1998 (Latin-1, West Europe)
Program mc
U ovoj kombinaciji rade sve tipke ali imamo problema sa prikazom (pogledajte rubove i slova â umjesto posebnih znakova korištenih za iscrtavanje rubova)
Ako vas zanima koji terminal uređaji se koriste na sustavu, pogledajte poglavlje ”Uređaji ukratko (devices)“ i to “Terminali”
I konačno zadnja varijabla koju smo spomenuli:
DISPLAY Konfiguracija “ekrana” za x Window sustav (pogledajte poglavlje “X Window”)
Osim gore navedenih tipova varijabli, možemo koristiti i varijable polja (Array).Dakle ako imamo potrebu unutar jedne varijable upisati više vrijednosti, koristiti ćemo polja (Array), po principu:
POLJE=(VRIJEDNOST1 VRIJEDNOST2 VRIJEDNOST3 ..)
Primjer
1. Kreirajmo jedno polje (varijablu) koja će sadržavati tri vrijednosti : jedan, dva, tri.
POLJE=(jedan dva tri)
Naše polje sada ima tri elementa, kako doći do kojeg elementa ?
Jedan od načina je korištenje vitičaste zagrade za polje unutar koje možemo definirati elemente unutar uglatih zagrada.
Kao na primjeru, gdje ćemo ispisati prvi element polja [0] (broji se od 0)
echo ${POLJE[0]}
jedan
Ako želimo ispisati sve elemente moramo koristiti [*]. Odnosno to bi izgledalo ovako>
echo ${POLJE[*]}
jedan dva tri
2. Napravimo for petlju s kojom ćemo ispisati elemente polja , jedan po jedan. kreirajmo datoteku imena:for.polje.sh , koja ć sadržavati:
#!/bin/bash
POLJE=(jedan dva tri)
for PETLJA in ${POLJE[@]}; do
echo $PETLJA
done
Opis:
POLJE=(jedan dva tri) kreirali smo polje sa tri elementa
for PETLJA in ${POLJE[@]}; do kreiramo for petlju, koja internu varijablu PETLJA popunjava sa elementima polja (u svakom prolazu sa jednim)
echo $PETLJA ispisujemo varijablu PETLJA (u svakom prolazu for petlje)
Promijenimo ovlasti i pokrenimo skriptu:
chmod +x for.polje.sh ./for.polje.sh jedan dva tri
Moguće je brisati cijelo polje, pr. naše cijelo polje imena POLJE:
unset POLJE
ili možemo brisati samo pojedine elemente unutar polje, pr. obrišimo samo drugi element [1]:
unset POLJE[1]
Pogledajmo što smo dobili izbacivši drugi element polja:
echo ${POLJE[*]}
jedan tri
Brojanje duljine varijable ili prebrojavanje broja elemenata polja.
Sintaksa je :
${#VAR}
Prebrojimo broj elemenata polja koje smo kreirali:
echo ${#POLJE}
3
U slučaju da je to bila obična varijabla, dobili bi rezultat prebrojavanja alfabeta unutar vrijednosti varijable.
Pr.: kreirajmo varijablu INVENTAR sa vrijesnosti monitor
INVENTAR=monitor
Prebrojimo sada vrijednost varijable (riječ monitor)
echo ${#INVENTAR}
7
U narednom tekstu, proći ćemo mogućnosti rada s uzorcima koje možemo primjenjivati na vrijednosti varijabli novijih verzija BASH shella.
Neke starije verzije BASH shella (3.x) nemaju sve od dolje navedenih mogućnosti.
Rad s prednjim djelom uzorka vrijednosti varijable
Postoji mogućnost izuzimanja određenih uzoraka od vrijednosti varijable, upotrebom znakova # i ## .
Pogledajmo kako:
# predstavlja prvi uzorak na koji će se naići od početka ## predstavlja zadnji uzorak na koji će se naići od početka
Sintaksa :
${VARIJABLA#UZORAK}
Ako imamo varijablu “varijable” čija je vrijednost : “1234.abcd.ABCD”:
var=1234abcd1234abcd
Tada ako želimo izuzeti prvi dio (1234) od varijable - krenuti ćemo s izuzimanjem od početka do uzorka točke ( . ).
echo ${varijabla#1234}
abcd1234abcd
Ako s druge strane želimo krenuti od najdaljeg uzorka koji zadovoljava - krenuvši od početka, tada ćemo koristiti ## :
echo ${varijabla##1234}
abcd
Rad sa stražnjim djelom uzorka vrijednosti varijablea
Sada ćemo raditi sa stražnjim djelom uzorka varijable, pomoću dva operatora:
% predstavlja prvi uzorak na koji će se naići od kraja prema početku %% predstavlja zadnji uzorak na koji će se naići od kraja prema početkuIzostavimo zadnji uzorak od kraja tj. prvi od kraja prema početku (koji zadovoljava). Uzorak je “abcd”
echo ${varijabla%abcd}
1234abcd1234
I probajmo zadnji uzorak koji zadovoljava, od kraja prema početku:
echo ${varijabla%%abcd}
1234
Moguće je izvući dio vrijednosti varijable, prema principu :
${VARIJABLA:OFFSET:LENGTH}
OFFSET je odmak s lijeve strane od početka vrijednosti varijable
LENGTH je broj karaktera koliko želimo da se uzima
Primjer
Iz vrijednosti postojeće varijable INVENTAR izvucimo slova od 4-tog slova, 2 sljedeća slova : m o n i t o r (to bi trebalo biti to)
echo ${INVENTAR:4:2}
to
Često imamo potrebu prosljeđivanja više parametara našoj skripti. Primjerice, želimo pri pokretanju naše skripte da se moraju definirati dva parametra.
Parametri pozicije imaju sljedeće oznake na sustavu:
$0 Označava sami program koji pokrećemo (tj. našu skriptu)$1 Označava prvi parametar (prva pozicija)$2 Označava drugi parametar (druga pozicija)$3 Označava treći parametar (treća pozicija)
Primjer
1. Napravimo skriptu koja zbraja dva broja, na način da pozivamo našu skriptu sa dva parametra , prvi je prvi broj a drugi je drugi broj.
Kreirajmo sljedeću skriptu pozicija-zbroj.sh , koja će sadržavati :
#!/bin/bash echo "Zbroj je : " echo $(( $1 + $2 ))
Promijenimo ovlasti i pokrenimo našu skriptu , s tim da ćemo joj proslijediti brojeve 5 i 4 (da ih skripta zbroji)
chmod +x pozicija-zbroj.sh
./pozicija-zbroj.sh 5 4 Zbroj je : 9
Da bude malo jasnije :
Pokretanjem naše skripte sa ./pozicija-zbroj.sh proslijeđujemo joj dva parametra (pozicije) sa vrijednostima 5 (ovo je prva pozicija odnosno $1) te 4 (ovo je druga pozicija odnosno $2).
Kasnije u našoj skripti, čitamo vrijednost (5) sa prve pozicije tj. $1 odnosno vrijednost (4) sa druge pozicije tj. $2.
Standardni parametri pozicije su : $1, $2, $3, $4, $5, $6, $7, $8 i $9 . U slučajevima kada nam je potrebno više od devet (9) parametara pozicije, moramo ih pozivati unutar vitičastih zagrada. Primjerice 10-ti parametar pozicije je ${10} ili 11-ti : ${11} itd.
U Shellu razlikujemo dvije upotrebe okruglih zagrada:
( ) i (( )) .
Jednostruke okrugle zagrade
Jednostruke okrugle zagrade imaju najčešću primjenu:
Proći ćemo neke od primjena kroz primjere.
1. Primjena kod kreiranja varijabli polja. Kreirajmo varijablu polja s dva elementa “prvi” i “drugi”
varijabla=(prvi drugi)
Pogledajte poglavlje "Varijable polja"
2. Slijedeća primjena bi bila upotreba u slučajevima kada za vrijednost varijable želimo postaviti rezultat pozivanja neke naredbe (ili niza naredbi).
Pogledajmo slijedeću skriptu:
#!/bin/bash integritet=$(md5sum datoteka.txt) echo $integritet
U gornjem primjeru, varijabli integritet dodjeljujemo vrijednost koja će se dobiti pozivanjem naredbe : md5sum datoteka.txt. Navedena naredba će napraviti provjeru integriteta datoteke datoteka.txt, korištenjem MD5 algoritma.
Nakon toga u novom redu očitavamo njenu vrijednost sa echo $integritet
Kada pokrenemo gore navedenu skriptu, dobiti ćemo nešto poput :
./test.sh ab8e75a54297fb9a107c263cc3cfbe68 datoteka.txt
Pogledajte i poglavlja :
/etc/shadow - i to dio "Hash/Checksum"Upotreba navodnika (jednostruki, dvostruki i jednostruki kosi) i to upotrebu jednostrukih kosih navodnika s kojima možemo dobiti istu funkcionalnost kao kod ovakve upotrebe okruglih zagrada.
Pripazite:
3. Druga slična primjena je direktno kreiranje posebnog pod-shella i izvršavanja naredbi unutar njega. Za opis rada pod shella pogledajte poglavlje "Kako rade shell skripte". U ovom slučaju se radi o pod shellu, koji se ne inicijalizira kao standardan pod shell sa svim environment varijablama. Sjetimo se da su iste varijable koje nalaze u pod shellu lokalne za taj shell te se ne prenose na vršni (Engl. Parent) shell.
Provjerimo trenutni radni direktorij
pwd /home/korisnik1
Dakle to je /home/korisnik1
Sada ćemo pozvati poseban pod shell i u njemu izvršiti neke naredbe. Konkretno ćemo ući u direktorij /tmp i ispisati u kojem se direktoriju nalazimo.
(cd /tmp; pwd) /tmp
Dobili smo podatak kako se nalazimo u direktoriju /tmp što je u redu.
Sada kada se posebni pod shell s naredbama koje smo pokretali u nizu, završio, pogledajmo u kojem direktoriju su nalazimo:
pwd /home/korisnik1
Vidimo kako se nalazimo u direktoriju /home/korisnik1 u kojemu smo i bili iz glavnog shella.
Ovo je dokaz da su se sve naredbe koje smo pokretali u posebnom pod shellu, bili izvršene samo unutar njega te da nisu imale utjecaj na naš vršni (Engl. Parent) shell.
4. Moguće je koristiti i “Pipe” ( | ) unutar okruglih zagrada. Pogledajmo primjer.
U primjeru dolje želimo pronaći sve datoteke unutar direktorija /usr/bin koje u imenu imaju riječ zip te s naredbom file provjeriti koje su vrste te datoteke (skripta/binarne/…)
Malo ćemo skratiti ispis :
file $(ls /usr/bin/* | grep zip) ... ... ... /usr/bin/bunzip2: symbolic link to `bzip2' /usr/bin/bzip2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped /usr/bin/gunzip: symbolic link to `../../bin/gunzip' /usr/bin/gzip: symbolic link to `../../bin/gzip' ... ... ...
Dvostruke okrugle zagrade
Dvostruke okrugle zagrade se koriste za aritmetičke operacije.
Sintaksa ovakvog korištenja bi bila : $(( ARITMETIČKE OPERACIJE ))
Pogledajmo i kako:
Pomnožimo dva broja (2 x 4):
echo $((2*4)) 8
U gornjem primjeru s naredbom echo ispisujemo vrijednost $ aritmetičke operacije unutar dvostrukih okruglih zagrada. Konkretno tražimo rezultat operacije množenja 2 x 4 koji dobivamo nakon pokretanja ove naredbe: 8.
Moguće je raditi i složenije aritmetičke operacije :
echo $(( (2+3) *4 )) 20
Drugi primjer je upotreba unutar neke petlje, poput for petlje (pogledajte poglavlje for petlja).
Naime osim na “klasičan” način možemo petlju kreirati i korištenjem dvostrukih okruglih zagrada
... for ((i=0; i<10; i++)) ...
Ovo znači da će petlja varijablu i povećavati od 0 - u koraku po jedan, sve dok je i manje od 10.
Pogledajte poglavlje "For petlja".
Bash shell nam omogućava korištenje uvjeta, neki od češće korištenih su :
if - elsecasePostoje i uvjeti koji su definirani kao “File-based” odnosno koji su dodatak standardnim uvjetima kada imamo potrebu unutar uvjeta provjeravati određena stanja datoteka ili direktorija.
Često korišteni prekidači (opcije) su:
-d (Directory) Direktorij postoji-e (eXissting) Datoteka postoji-f Datoteka postoji i tipa je “obična” datoteka (nije “Block device” ili sl.)-g Datoteka ili direktorij imaju postavljen “Set GID” bit-r Datoteka postoji i ima “Read” prava (r)-s Datoteka postoji i nije prazna (Engl. Zero size)-u Datoteka ili direktorij imaju postavljen “Set UID” bit-w Datoteka postoji i ima “Write” prava (w)-x Datoteka postoji i ima “Execute” prava (x)Za posebne vrste datoteka
-b (Block) datoteka postoji i tipa je “Block device” (obično se nalaze unutar /dev/ direktorija)-c (Character) datoteka postoji i tipa je “Character device” (obično se nalaze unutar /dev/ direktorija)-h (Symbolic Link) datoteka postoji i tipa je simbolički link “Symbolic link”-L Datoteka postoji ali je ona tipa : simbolički Link-p Datoteka postoji ali je ona tipa : “Pipe”-S Datoteka postoji ali je ona tipa : “Socket”Osim toga postoje logički uvjeti na stringovima, neki od njih su:
STRING1==STRING2 STRING1 je jednak STRING2STRING1!=STRING2 STRING1 nije jednak STRING2 -z string je prazan (empty)-n string nije prazan (nonempty)I na kraju naravno, postoje i aritmetički uvjeti :
BROJ1 -eq BROJ2 BROJ1 je jednak (equal) broju BROJ2BROJ1 -ne BROJ2 BROJ1 nije jednak (non equal) broju BROJ2BROJ1 -gt BROJ2 BROJ1 je veći od (greater than) broja BROJ2?BROJ1 -ge BROJ2? BROJ1 je veći od (greater than or equal) ili jednak broju BROJ2 BROJ1 -lt BROJ2 BROJ1 je manji od (less than) broja BROJ2?BROJ1 -le BROJ2? BROJ1 je manji od (less than or equal) ili jednak broju BROJ2 Primjeri
1. Primjer upotrebe if - else uvjeta: Tražimo od korisnika unos brojeva između 1 i 3 (uključujući) 3. Za svaki broj koji smo unjeli pomoću višestrukih if - else uvjeta provjeriti koji broj smo upisali, a ako nije niti 1,2 ili 3 ispisati ćemo dodatnu poruku.
Kreirajmo datoteku if-else.sh , koja će sadržavati :
#!/bin/bash
echo -n "Unesite broj izmedu 1 i 3 (ukljucujuci 3) : "
read broj
if [ "$broj" = "1" ]; then
echo "Upisali ste 1."
else
if [ "$broj" = "2" ]; then
echo "Upisali ste 2."
else
if [ "$broj" = "3" ]; then
echo "Upisali ste 3."
else
echo "Niste upisali broj izmedu 1 i 3 !"
fi
fi
fi
Opis:
echo -n Ispisuje poruku i ne baca nas u novi red nego ostaje u istom redu (-n)
read broj Naredba read očekuje naš unos s tipkovnice (ovdje unosimo podatke) te ih ubacuje u varijablu broj
if [ “$broj” = “1” ]; then Ako je vrijednost ($) varijable broj jednaka 1 onda ide u sljedeći red i preko echo naredbe ispisuje poruku
else inaće
if [ “$broj” = “2” ]; then ako je vrijednost varijable broj (ista provjera kao u prvom if uvjetu) jednaka 2 , onda ide u sljedeći red i preko echo naredbe ispisuje poruku.
… i tako smo nanizali uvjet za uvjetom do kraja skripte
Sada moramo promijeniti ovlasti (da naša skripta postane izvršna [eXecutable]) i pozvati skriptu
chmod +x if-else.sh
Pokrenimo ju (pokrećemo ju sa ./ jer ju pokrećemo iz trenutnog direktorija )
./if-else.sh
Upisati ćemo broj 2 da vidimo što će se dogoditi:
Unesite broj izmedu 1 i 3 (ukljucujuci 3) : 2 Upisali ste 2.
2. Napravimo shell skriptu koja provjerava da li imamo CD/DVD-ROM na našem poslužitelju.
Pod Linuxom to znači postojanje linka na /dev/cdrom, koji obično pokazuje na /dev/sr0 uređaj koji je poseban tip datoteke (Block device) i označava CD/DVD-ROM uređaj. Dakle provjeravamo da li postoji datoteka tipa “Block Device” : /dev/sr0 . I ako postoji ispisujemo poruku da postoji a ako ne postoji ispisujemo poruku da ne postoji.
Kreirajmo datoteku: if-special-file.sh sadržaja:
#!/bin/bash if [ -b /dev/sr0 ]; then echo "CD/DVD-ROM postoji" else echo "CD/DVD-ROM ne postoji" fi
Promijenimo joj ovlasti i pokrenimo ju:
chmod +x if-special-file.sh
./if-special-file.sh CD/DVD-ROM postoji
3. Punovimo prvi primjer ali upotrebom uvjeta: case. Datoteka će se zvati uvjeti-case.sh i sadržavati:
#!/bin/bash
echo -n "Unesite broj izmedu 1 i 3 (ukljucujuci 3) : "
read broj
case $broj in
1 ) echo "Upisali ste 1."
;;
2 ) echo "Upisali ste 2."
;;
3 ) echo "Upisali ste 3."
;;
* ) echo "Niste upisali broj izmedu 1 i 3 !"
esac
Promijenimo mu ovlasti i pokrenimo ga :
chmod +x uvjeti-case.sh
./uvjeti-case.sh
Petlje koristimo kada imamo potrebu ponavljanja određenog dijela programa sve dok se ne zadovolji neki od uvjeta.
Najčešće su u upotrebi tri vrste petlji :
for petlja se vrti u krug sve dok se ne završi unutarnji (definirani) brojač ili niz (lista) definirana unutar same petlje.while petlja se vrti u krug sve dok je uvjet točanuntil petlja se vrti u krug sve dok je uvjet netočanZa sve navedene vrste petlji moguće je koristiti i kondicionalne radnje:
break se koristi za izlazak iz trenutne petlje (obično uz neki uvjet) prije nego petlja završicontinue se koristi za nastavljanje (iteracija) rada petlje (također obično uz neki uvjet)Moguće je imati i petlju u petlji (tkzv. ugnježđivanje)
Ne zaboravite vašoj skripti dodjeliti izvršne ovlasti chmod +x IME-SKRIPTE.sh prije pokretanja jer ju u suprotnom nećete moći pokrenuti.
Upotrebu petlji ćemo objasniti kroz primjere.
for petlja koja se koristi u bash ljusci omogućava nam izvršavanje kôda unutar petlje.
Možemo reći da for petlja radi iterativno ponavljanje našeg kôda unutar petlje, prema zadanim parametrima.
Primjeri upotrebe:
1. Kreirajmo niz brojeva od 1 do 10, pozivajući vanjsku naredbu seq
#!/bin/bash for NUM in `seq 1 1 10` do echo $NUM done
Pogledajte upotrebu jednostrukih kosih navodnika jer se unutar njih poziva nareba seq.
Opis:
Varijabla NUM se postavlja na prvu vrijednost (u ovo slučaju je to 1) jer je naredba seq krenula od 1.
Potom se između do i done izvršava naš kod , koji ispisuje vrijednost varijable (s $NUM) s naredbom echo
seq se koristi za kreiranje niza brojeva (u našem slučaju od 1 do 10, u koracima po 1). Sintaksa je seq PRVI_BROJ INKREMENT ZADNJI_BROJ
Prva iteracija se završila i ispisano je 1.
Kreće druga iteracija u kojoj naredba seq povećava broj za 1 te se on dodjeljuje varijabli NUM.
Sada varijabla NUM ima vrijednost 2.
Ponovno se između do i done izvršava naš posao/kod odnosno ispisuje se vrijednost varijable (s $NUM) i to s naredbom echo, a sada se ispisuje 2.
U slijedećoj iteraciji se vrijednost ponovno povećava pa ispisuje, sve dok se ne dođe do limita koji je postavljen u naredbi seq kao 10, tada se odrađuje i ta zadnja iteracija i završava se izvođenje petlje.
Što dobivamo pokretanjem (./for.petlja.sh) naše skripte s for petljom :
1 2 3 4 5 6 7 8 9 10
Isti rezultat smo mogli postići s upotrebom dvostrukih okruglih zagrada. Pogledajmo kako:
#!/bin/bash
for ((i=1; i<11; i++))
do
echo $i
done
Pogledajte i poglavlje "Upotreba okruglih zagrada"”
2. Upotreba for petlje korištenjem vitičastih zagrada za generiranje niza.
U ovom primjeru ćemo for petlju ograničiti na iteracije u kojima će se “vrtiti” slova : a, b, c, d i e. U svakoj iteraciji će naša varijabla : i dobiti svoju vrijednost, koju kasnije unutar bloka između do i done koristimo tj. ispisujemo.
Dakle naša petlja će imati ukupno pet (5) iteracija odnosno prolazaka jer imamo pet slova - svako u svojoj iteraciji (a, b, c, d i e)
#!/bin/bash
for i in {a..e}
do
echo $i
done
Pokretanjem ove skripte dobivamo:
a b c d e
Isto je moguće i za generiranje brojeva:
#!/bin/bash
for i in {1..5}
do
echo $i
done
Pokretanjem ove skripte dobivamo:
1 2 3 4 5
3. Napraviti ćemo petlju koja će koristiti niz. Petlja će prolaziti iterativno kroz svaki pojedini element niza odnosno liste te pokretati naš željeni kod.
Naš niz će biti dani u tjednu (Pon, Uto, Sri, Cet, Pet, Sub i Ned), koje ćemo iterativno ispisivati, jedan po jedan (jedan u svakoj iteraciji/prolazu petlje)
Elementi liste odnosno niza se se smiju odvajati zarezom jer će se on obrađivati kao još jedan element niza/liste
Pogledajmo petlju
#!/bin/bash
for DANI in Pon Uto Sri Cet Pet Sub Ned
do
echo $DANI
done
I pogledajmo što smo dobili, njenim pokretanjem
Pon Uto Sri Cet Pet Sub Ned
4. Moguće je isti primjer odraditi i s listom elemenata postavljenim unutar druge varijable, pogledajmo kako.
#!/bin/bash
DANI="Pon Uto Sri Cet Pet Sub Ned"
for DAN in $DANI
do
echo $DAN
done
Varijabli DANI (množina) smo dodjelili listu elemenata (Pon Uto Sri Cet Pet Sub Ned), prije nego smo krenuli s petljom.
Potom u petlji koristimo novu varijablu DAN kojoj dodajemo listu elemenata jer joj na kraju dajemo vrijednost varijable koja sadrži listu ( $DANI ).
Pošto unutar između do i done bloka ispisujemo vrijednost varijable DAN - sa $DAN, dobijamo po jedan element liste - i to onaj na kojem se trenutno petlja nalazi.
Što smo dobili pokretanjem :
Pon Uto Sri Cet Pet Sub Ned
Ako koristite niz/listu iz varijable, pazite na to kako se niz odnosno lista definirana u varijabli obavezno nalazi između dvostrukih navodnika “ . Pogledajte poglavlje s upotrebom navodnika.
5. Korištenje Linux naredbe kao liste odnosno niza.
Koristiti ćemo naredbu ''awk'' s kojom ćemo ispisati sve korisnike (korisničke račune) našeg Linuxa.
Pogledajte poglavlje "/etc/passwd" za sadržaj ove datoteke
Korištenjem awk-a ćemo zapravo dobiti listu korisnika - pogledajmo kako:
awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
gopher
ftp
nobody
vcsa
saslauth
postfix
sshd
tcpdump
apache
pero
Tu istu awk naredbu ćemo koristiti da nam kreira listu/niz, koju/i koristimo za našu for petlju.
#!/bin/bash
for korisnik in `awk -F: '{print $1}' /etc/passwd`
do
echo "Korisnički račun :" $korisnik
done
Pokretanjem naredbe dobivamo
Korisnički račun : root Korisnički račun : bin Korisnički račun : daemon Korisnički račun : adm Korisnički račun : lp Korisnički račun : sync Korisnički račun : shutdown Korisnički račun : halt Korisnički račun : mail Korisnički račun : uucp Korisnički račun : operator Korisnički račun : games Korisnički račun : gopher Korisnički račun : ftp Korisnički račun : nobody Korisnički račun : vcsa Korisnički račun : saslauth Korisnički račun : postfix Korisnički račun : sshd Korisnički račun : tcpdump Korisnički račun : apache Korisnički račun : pero
Primjeri upotrebe:
1. (while petlja) : Napravimo brojač (petlju) od 0 do 9. Kada se dođe do 9. petlja treba završiti.
Kreirajmo datoteku imena : petlja-while.sh , koja sadrži:
#!/bin/bash
brojac=0
while [ $brojac -lt 10 ]; do
echo "Broj je :" $brojac
brojac=$[$brojac + 1]
done
Opis:
while petlja ima za uvjet da varijabla brojac ima vrijdnost manju ili jednaku 10 (-lt 10) tj:
while [ $brojac -lt 10 ]; do sve dok je gore navedeni uvjet točan idi dalje:
echo “Broj je :” $brojac ispiši poruku “Broj je :”, sa vrijednost ($) varijable brojac
brojac=$[$brojac + 1] Povećava brojać za 1
done kraj petlje (koja se vrti u krug do se ne zadovolji uvjet pod while)
Sada joj promjenimo ovlasti i pokrenimo ju:
chmod +x petlja-while.sh ./petlja-while.sh Broj je : 0 Broj je : 1 Broj je : 2 Broj je : 3 Broj je : 4 Broj je : 5 Broj je : 6 Broj je : 7 Broj je : 8 Broj je : 9
Primjeri upotrebe:
2. (until petlja) : Napravimo brojač (petlju) od 0 do 9. Kada se dođe do 9. petlja treba završiti.
Kreirajmo datoteku imena : petlja-until.sh , koja sadrži:
#!/bin/bash
brojac=0
until [ $brojac -ge 10 ]; do
echo "Broj je :" $brojac
brojac=$[$brojac + 1]
done
Opis:
Razlika u odnosu na while petlju je upravo suprotna logika (sve dok je uvjet netočan):
Uvjet je : sve dok je varijabla brojac veća ili jednaka 10 (-ge) , a pošto until petlja čeka netočan uvjet dobili smo isti rezultat kao u while petlji.
Promijenimo ovlasti skripti i pokrenimo ju:
chmod +x petlja-until.sh ./petlja-until.sh Broj je : 0 Broj je : 1 Broj je : 2 Broj je : 3 Broj je : 4 Broj je : 5 Broj je : 6 Broj je : 7 Broj je : 8 Broj je : 9
break se koristi za izlaz iz trenutne for ,while ili until petlje prije nego bi ona normalno završila. Dakle ako je potrebno izaći iz petlje uslijed nekog uvjeta koristi se break . S druge strane ako je potrebno preskočiti na slijedeću iteraciju unutar petlje koristi se continue.
Pogledajmo i primjere.
Napraviti ćemo brojač od 1 do 10, koristeći for petlju :
#!/bin/bash
for i in {1..10}
do
echo $i
done
echo "Sada se nalazimo izvan petlje"
Ako pokrenemo brojač, dobiti ćemo :
1 2 3 4 5 6 7 8 9 10 Sada se nalazimo izvan petlje
Osim brojača, dodali smo i poruku koje će se ispisati kada se petlja završi : “Sada se nalazimo izvan petlje”
Primjer u kojem želimo kada se unutar petlje dođe do vrijednosti 9 kako bi se izašlo iz petlje i nastavilo dalje s izvršavanjem skripte. Za ovaj primjer ćemo koristiti break za izlaz ali unutar if uvjeta gdje se provjerava da li je vrijednost brojača = 9.
#!/bin/bash
for i in {1..10}
do
echo $i
if [ "$i" -eq 9 ]
then
break
fi
done
Ako pokrenemo skriptu, dobivamo :
1 2 3 4 5 6 7 8 9 Sada se nalazimo izvan petlje
Dakle petlja je došla do 9 i tada se aktivirao if uvjet unutar kojega se provjerava da li je vrijednost brojača ( i ) jednaka ( eq ) broju 9. Kada je brojač došao do 9, unutar if uvjeta, pokreće se naredba break koja iskače izvan cijele for petlje. Nakon toga se nastavlja izvršavanje slijedećih naredbi koje se nalaze u skripti. U našem slučaju se izvršava naredba : echo “Sada se nalazimo izvan petlje” .
Naredba break izlazi iz petlje a ne iz cijele shell skripte.
Ugniježđene petlje i break
Moguće je i eksplicitno navesti nakon koje razine pod petlje želimo izaći iz nje. Dakle u slučajevima kada imamo petlju unutar petlje, moguće je izaći samo iz određene pod petlje (obično uz neku uvjet) ili i iz vršne petlje uključujući sve pod petlje.
Napraviti ćemo vršnu for petlju koja će “vrtiti” brojeve od 1 do 4. Unutar ove petlje ćemo kreirati drugu for petlju koja će “vrtiti” slova od A do C. Želimo svaki puta kada se u pod petlji koja vrti slova, dođe do slova B - petlja završi (samo ova pod petlja koja “vrti” slova).
Dakle u našem slučaju imamo glavnu petlju i njenu prvu (1) pod petlju.
#!/bin/bash
for i in {1..4}
do
echo $i
for j in {A..C}
do
echo $j
if [ $j == "B" ]
then
echo "Imamo slovo B"
break
fi
done
done
Očekujemo prvo izvršavanje prve iteracije prve petlje i rezultat: 1, pa ulazak u drugu petlju i rezultat prve iteracije A, pa slijedeća iteracija druge petlje i rezultat B. Sada se treba aktivirati uvjet (if) i provjera da l imamo slovo B te ispis “Imamo slovo B”. I dolazimo do break 1 odnosno izlaska iz prve razine for petlje (tj. naša pod petlja koja generira slova) te povratak na glavnu petlju, koja nastavlja sa slijedećom iteracijom, pa dobivamo vrijednost: 2 , potom ponovno ulazak u drugu petlju, koja opet kreće iz početka te dobivamo slovo : A , … .
U svakom slučaju je vidljivo da sa break izlazimo samo iz trenutne razine petlje odnosno petlje u kojoj se nalazimo a ne izlazimo i iz glavne petlje.
Pogledajmo što dobivamo kada pokrenemo skriptu:
1 A B Imamo slovo B 2 A B Imamo slovo B 3 A B Imamo slovo B 4 A B Imamo slovo B Sada se nalazimo izvan petlje
Ako želimo izaći i iz vršne petlje, moramo povećati razinu djelovanja break naredbe. U ovom slučaju bi to bila razina 2.
Promijenimo samo liniju sa break , na :
break 2
Pokrenimo skriptu pa pogledajmo rezultat:
1 A B Imamo slovo B Sada se nalazimo izvan petlje
Čim je prva iteracija u prvoj petlji završila (rezultat : 1) te smo ušli u prvu pod petlju, odrađuju se iteracija pod petlje. Prva iteracija pod petlje (rezultat : A) pa druga (rezultat : B). Potom je okidač uvjet da smo dobili slovo B. Ispisuje se poruka te sa break 2 iskačemo iz pod petlje i iz glavne petlje (koja je s točke pod petlje, razina 2).
continue primjeri
Upotreba continue je suprotna upotrebi break. continue će nastaviti s radom petlje odnosno vratiti nas na početak petlje i to na slijedeću iteraciju na kojoj je petlja stala.
Pogledajmo isti primjer s continue.
#!/bin/bash
for i in {1..4}
do
echo $i
for j in {A..C}
do
echo $j
if [ $j == "B" ]
then
echo "Imamo slovo B"
continue
fi
done
done
Pokretanjem dobivamo:
1 A B Imamo slovo B C 2 A B Imamo slovo B C 3 A B Imamo slovo B C 4 A B Imamo slovo B C Sada se nalazimo izvan petlje
Dakle slično kao kod break s time da kada smo došli u unutarnjoj petlji do slova B, tada continue nastavlja trenutnu petlju odnosno njenu slijedeću iteraciju - ovdje je to slovo C.
I za continue je moguće koristiti skok u vršnu petlju (ili koju već razinu vršne petlje želimo).
Nizanje naredbi koristimo kada je potrebno pozvati naredbe u nizu, jednu za drugom.
Nizati naredbe možemo koristeći neke od operatora:
& operator koji se koristi za pokretanja nekog procesa u pozadini; operator kojim možemo nizati naredbe sekvencijalno - završetkom prve naredbe u nizu pokreće se druga, nakom njenog završetka sljedeća itd.|| ILI (OR) operator za nizanje naredbi poput ; , dakle nije bitno da li je prijašnja naredba uspješno završila&& I (AND) operator za nizanje naredbi, ako je prva naredba uspješno završila (return status code=0)
Svaka naredba nakon izvršavanja šalje svoj statusni kod znan i kao “Exit code” ili “Return code”. Statusni kod koji je 0 označava kako se sve uredno završilo. Sve druge vrijednosti ukazuju na neku vrstu greške.
Statusni kod možemo pročitati sa posebnom varijablom $? koja nam daje statusni (Exit code) zadnje izvršene naredbe.
Tablica statusnih kodova
| “Exit Code” Broj | Značenje | Komentar |
| 0 | Program je uredno izvršen | Ovo je normalan kod ako je sve u redu |
| 1 | Sve opčenite greške | Primjerice dijeljenje s nulom ili druge “nemoguće” operacije |
| 2 | Nepropisna upotreba ugrađenih BASH funkcionalnosti | Nedostaje ključna riječ ili naredba. Može biti i problem s ovlastima (permissions). Naredba diff daje ovaj kod greške kod usporedbe binarnih datoteka |
| 126 | pozvana naredba se ne može izvršiti | Problem s ovlastima (permissions) ili naredba nije izvršna (execute) |
| 127 | “command not found” - naredba nije pronađena | Problem sa PATH varijablom (putanjom) ili tipografska greška |
| 128 | “Invalid argument to exit” - krivi argument za izlaz | “exit” kod može biti samo cjelobrojna vrijednost od 0 do 255 |
| 128+n | Fatal error signal “n” - fatalna greška | Primjerice za kill -9 $PPID skripte $? vraća 137 (128 + 9) |
| 130 | Skripta je terminirana sa Control-C | Control-C pripada “fatal error signal 2”, (130 = 128 + 2, pogledati gore |
| 255* | “Exit status” izvan dosega | exit status kodovi su cjelobrojni od 0 do 255 |
Sintaksa je :
naredba1 list-operator naredba2 list-operator naredba3 …
Primjeri
1. Upotreba operatora &&
naredba1 && naredba2
1.1 Pokrenimo dvije naredbe u nizu, i to samo ako je prva uspješno završila:
Ako postoji datoteka /dev/sr0 (ovo znači da postoji CD/DVD-ROM uređaj na sustavu), ispiši “CD/DVD-ROM postoji”
ls -alh /dev/sr0 && echo "CD/DVD-ROM postoji" brw-rw---- 1 root cdrom 11, 0 Jun 6 15:35 /dev/sr0 CD/DVD-ROM postoji
Opis:
Naredba ls -alh /dev/sr0 je vratila status 0 (OK) [dakle tražena datoteka postoji] te je sustav pokrenuo naredbu echo “CD/DVD-ROM postoji” i ispisao nam poruku.
U suprotnom da CD/DVD-ROM (tj. datoteka /dev/sr0 ) ne postoji dobili bi slijedeću grešku
ls -alh /dev/sr0 && echo "CD/DVD-ROM postoji" ls: cannot access /dev/sr0: No such file or directory
Pogledajmo i Exit kod:
echo $? 2
Dobili smo kod 2 što upučuje da nešto nedostaje (ovdje nedostaje tražena datoteka
).
2. Upotreba operatora ;
Upotrebom ovog operatora možemo nizati naredbe, kao da ih izvršavamo u shellu, jednu za drugom.
Pokrenuti ćemo naredbu cd /root/ s kojom ćemo ući u direktorij /root a potom ls -al da ispišemo sadržaj tog direktorija, sve u jednom redu, kao na primjeru dolje
cd /root/ ; ls -al
Kao i većina programskih jezika i bash shell može koristiti funkcije. Funkcije implementiraju određene radnje ili operacije koje ćemo potencijalno koristiti više puta unutar programa odnosno skripte. Korištenjem funkcija činimo kod čitljivijim (svaka funkcija bi trebala odrađivati određeni zadatak) i iskoristivijim (kod se ne bi trebao ponavljati, već pozivati funkciju).
Funkcije možemo koristiti na dva načina, sintaksa je :
function ime_funkcije {
naredbe
naredbe
}
ili
function ime_funkcije () {
naredbe
naredbe
}
Osim toga ne moramo niti koristiti ključnu riječ function, pa će to izgledati ovako:
ime_funkcije {
naredbe
naredbe
}
ili
ime_funkcije () {
naredbe
naredbe
}
Možemo i ugnježđivati funkciju unutar funkcije.
Primjeri
1. Napravimo skriptu koja će imati dvije funkcije: jednu za zbrajanje dva broja i drugu za množenje dva broja. Skripta mora tražiti unos korisnika : prvi broj potom drugi broj i naziv matematičke operacije koju se želi izvršiti (zbrajanje ili množenje):
Kreirajmo datoteku funkcije1.sh , sadaržaja:
#!/bin/bash
echo "Upisi prvi broj pa drugi broj te operaciju : zbrajanje ili mnozenje:"
read broj1 broj2 operacija
function zbrajanje () {
echo $(($broj1+$broj2))
}
function mnozenje () {
echo $(($broj1*$broj2))
}
case $operacija in
zbrajanje ) zbrajanje ;;
mnozenje ) mnozenje ;;
* ) echo "Niste upisali : zbrajanje ili mnozenje"
esac
Opis:
echo “Upisi … Ispiše tekst
read broj1 broj2 operacija očekujemo unos od korisnika , koji će se zapisati u tri varijable :
broj1 ovo će biti naš prvi brojbroj2 ovo će biti naš drugi brojoperacija ovo će biti matematička operacija (zbrajanje ili mnozenje)function zbrajanje () {
echo $(($broj1+$broj2))
}
Ovdje kreiramo funkciju imena 'zbrajanje' koja preko echo naredbe (u drugom redu) zbraja vrijednosti varijabli : broj1 i broj2 i ispisuje rezultat
… isto se ponavlja i kod funkcije mnozenje, s time da ona množi ta dva unešena broja i ispisuje rezultat
case $operacija in
Sada pozivamo uvjet case koji provjerava što smo upisali kao treću vrijednost (prve dvije su bili brojevi) a za treću očekujemo da bude opisna matematička operacija : zbrajanje ili mnozenje
zbrajanje ) zbrajanje ;; dakle ovdje provjeravamo da li je upisano zbrajanje (prva riječ u ovom primjeru) i ako je pozivamo funkciju zbrajanje (druga riječ u ovom primjeru)
mnozenje ) mnozenje ;; ovdje provjeravamo da li je upisano mnozenje i ako je, tada pozivamo funkciju zbrajanje
* ) echo “Niste upisali : zbrajanje ili mnozenje” ako nisu zadovoljena prva dva uvjeta , tada ispisujemo poruku Niste upisali : zbrajanje ili mnozenje
Promijenimo ovlasti i pokrenimo našu skriptu:
chmod +x funkcije1.sh
Pokrenimo skriptu te unesimo brojeve 2 , 4 i operaciju zbrajanje
./funkcije1.sh Upisi prvi broj pa drugi broj te operaciju : zbrajanje ili mnozenje: 2 4 zbrajanje 6
Dobili smo vrijednost 6 , što smo i očekivali
Lokalne varijable
Moguće je određene varijable definirati kao lokalne (pr. unutar naše funkcije) Pogledajmo kako možemo definirati lokalne varijable uz sličan primjer, prethodnom:
Varijablu definiramo lokalnom pozivanjem ključne riječi: local ispred imena varijable
$ vi funkcije2.sh
#!/bin/bash
x=100
y=200
zbrajanje(){
local x=$1
local y=$2
echo "Rezultat je :" $(( $x + $y ))
}
echo "Pozovimo globalnu varijablu x: $x"
echo "Pozovimo globalnu varijablu y: $y"
echo "Pozovimo funkciju za zbrajanje uz varijable koje smo mi unjeli (lokalne varijable unutar funkcije):"
zbrajanje $1 $2
Opis:
Na početku smo definirali globalne varijable x i y:
x=100 y=200
Nakon toga kreiramo funkciju koja će zbrajati dva broja. Unutar te funkcije smo definirali loklane varijable, čija vrijednost traje samo unutar ove funkcije :
local x=$1 local y=$2
Podsjetimo se: 2 su sistemske varijable koje označavaju prvi i drugi argument koji upisujemo (pr. uz pokretanje ove skripte)
Potom ispisujemo rezultat:
echo "Rezultat je :" $(( $x + $y ))
Izvan naše funkcije ispiujemo globalne varijable:
echo "Pozovimo globalnu varijablu x: $x" echo "Pozovimo globalnu varijablu y: $y"
A na kraju pozivamo našu funkciju , kojoj prosljeđujemo argumente s kojima ćemo pokrenuti našu skriptu (2). Dakle vrijednosti 2 se prosljeđuju unutar naše funkcije koju pozivamo (pokrećemo):
zbrajanje $1 $2
Promijenimo ovlasti:
chmod +x funkcije2.sh
Pokrenimo našu skriptu i dodajmo joj argumente (u našem slučaju brojeve 2 i 4)
./funkcije2.sh 2 4 Pozovimo globalnu varijablu x: 100 Pozovimo globalnu varijablu y: 200 Pozovimo funkciju za zbrajanje uz varijable koje smo mi unjeli (lokalne varijable unutar funkcije): Rezultat je : 6
Dobili smo željeni rezultat.
vi editor je inicijalno razvijan za prve verzije UNIXa (1976.g.), te je od tada dostupan na svim verzijama Unixa i Linuxa koje postoje.
Ovo je jedini tekst editor koji ćemo naći na bilo kojem UNIX ili Linux baziranom operativnom sustavu pa je važno poznavati neke njegove osnove.
Koliko god da je netko navikao ne neki drugi tekst editor, u praksi nikada ne možemo biti sigurni koji tekst editor ćemo zateći na nekom UNIX ili Linux sustavu, osim vi editora koji se nalazi na svima.
vi editor Ima dva osnovna načina rada:
Upoznajmo osnovne naredbe, podijeljene u logičke cjeline:
Insert i append naredbe
i (insert) – ubaci tekst ispreda (append) – ubaci tekst izao – otvori novi red ispodO – otvori novi red iznadI – ubaci tekst na početak redaA – ubaci tekst na kraj redaESC - vraća u naredbeni modeAko ne rade kursorske tipke:
h (lijevo)l (desno)j (dolje)k (gore)ESC - vraća u naredbeni modeBrisanje:
x (brisanje znaka: [znak po znak])dd (brisanje cijelog reda)Undo
u (undo prvu promjenu)U (undo sve promjene u redu)Ponavljanje naredbe
. (ponavlja zadnju naredbu)Kopiranje (Yank)
yw (kopiraj trenutnu riječ)2yw (kopiraj 2 riječi)yy ili Y (kopiraj trenutni red)2yy (kopiraj 2 reda)Paste
p (paste)Traženje
/pojam (traži riječ pojam )n (traži sljedeći pojam)N (traži prethodni nađeni pojam)Pronađi i zamjeni
%s/prvo/drugo/g (Zamjeni riječ prvo sa drugo )Kretanje po radnoj datoteci:
g skoči na početak datoteke50G skoči na 50-ti red u datoteciG skoči na kraj datotekeSnimanje
:w (snimi):wq (snimi i izađi iz vi-ja):wq! (snimi i izađi iz vi-ja, čak i ako je otvorena datoteka read-only)
Osnovna podjela tvrdih diskova je prema njihovom sučelju za povezivanje s našim računalom ili poslužiteljem te samoj namjeni diskova.
Ova podjela nam je bitna zbog razumjevanja načina povezivanja tvrdog diska s Linuxom. Nemojmo zaboraviti da Linux kao i Unix operativni sustavi pristupaju svim uređajima pa tako i tvrdim diskovima na vrlo niskoj razini. Prema tome, važno je prepoznati sučelje s kojim se tvrdi disk povezuje s računalom jer ga mi koristimo za povezivanje s Linuxom. Drugim riječima Linux mapira tvrdi disk prema njegovom sučelju jer se povezuje direktno na sučelje tvrdog diska.
Osnovna podjela tvrdih diskova prema vrsti sučelja za povezivanje :
| Ime sučelja | Opis | Broj pinova (nožica) na tvrdom disku | Broj žila na kabelu | Maksimalan broj diskova koji se može spojiti na jedan kabel/kanal |
| (P)ATA | Paralelni ATA (engl. AT Attachment ) | 40 (44 za 2.5” diskove) | 40, 44 ili 80 | 2 |
| SATA | Serijski ATA (engl. Serial ATA) | 7 | 7 | 1 |
| SCSI | engl. Small Computer System Interface ili tkzv. Paralelni SCSI | 50, 68 ili 80 | 50, 68 ili 80 | 15 |
| SAS | Serijski SCSI (engl. Serial SCSI) | 7 | 7 | 1 |
Pogledajmo i osnovne karakteristike raznih diskovnih sučelja i generacija/vrsta diskova koji se spajaju na njih:
ATA Standard
| Sučelje | Standard | Maksimalna brzina prijenosa podataka i novi standardi |
| (P)ATA | ATA-1 | PIO-Mod 0: 3,3 MB/s; PIO 1: 5,2 MB/s; PIO 2: 8,3 MB/s Single Word DMA Mod 0: 2,1 MB/s, DMA single 1: 4,2 MB/s, DMA single 2: 8,3 MB/s Multi Word DMA Mod 0: 4,2 MB/s |
| (P)ATA | ATA-2 | PIO-Mod 3: 11,1 MB/s; PIO 4: 16,6 MB/s DMA-Mod 1: 13,3 MB/s, Mod 2 (DMA 2): 16,6 MB/s (Multi Word) Fast ATA Modovi : ATA-2, PIO 3, DMA 1 Fast ATA-2 Modovi: ATA-2, PIO 4, DMA 2 |
| (P)ATA | ATA-3 | Nadogradnja na ATA-2 i vode se S.M.A.R.T. i “Security Feature Set” |
| (P)ATA | ATA/ATAPI-4 | Uvodi se UDMA i “Cyclic Redundancy Check” Ultra DMA mod 0: 16,7 MB/s; UDMA 1: 25,0 MB/s: UDMA 2: 33,3 MB/s. Definira se Ultra ATA/33 kao ATA-4 sa UDMA 2 |
| (P)ATA | ATA/ATAPI-5 | Uvode se: Ultra DMA 4: 66,6 MB/s , UDMA 3: 44,4 MB/s Uvodi se 80 žilni (P)ATA kabel |
| (P)ATA | ATA/ATAPI-6 | Uvodi se Ultra-DMA-100 :100 MB/s Uvodi se 48.bitna LBA shema adresiranja diskova (LBA-48) Uvodi se “Automatic Acoustic Management” (AAM) |
| (P)ATA | ATA/ATAPI-7 | ATA se sada službeno zove PATA, jer se pojavljue SATA kao standard Uvodi se UltraDMA 6 : 133 MB/s (ATA/133) |
| PATA | ATA/ATAPI-8 | Uvode se nove kozmetičke promjene |
Ukratko :
| Standard | ATA-1 | ATA-2 | ATA-3 | ATA-4 | ATA-5 | ATA-6 | ATA-7 |
| Maksimalna brzina | 8.3MB/s | 16.6MB/s | 16.6MB/s | 33.3MB/s | 66.6MB/s | 100MB/s | 133MB/s |
SATA Standard
| Službeni naziv standarda | Neslužbeni naziv | Brzina prijenosa podataka |
| Serial ATA 1.5 Gbps | SATA I | 1.2Gbps (150MB/s) |
| Serial ATA 3 Gbps, SATA Revision 2.x | SATA II, SATA 300 | 2.4Gbps (300MB/s) |
| Serial ATA 6 Gbps, SATA Revision 3.x | SATA III, SATA 600 | 4.8Gbps (600MB/s) |
| SATA Express 8 16 Gbps, SATA Revision 3.2 | 15.8Gbps (1975 MB/s) |
SCSI Standard
| Standard | Brzina prijenosa podataka | Vrsta kabela (broj žila/pinova) |
| SCSI (SCSI-1) | 5 MB/s | 50 |
| Wide SCSI (SCSI-2) | 10 MB/s | 68 |
| Fast SCSI (SCSI-2) | 10 MB/s | 50 |
| Fast Wide SCSI (SCSI-2) | 20 MB/s | 68 |
| Ultra SCSI (SCSI-3) | 20 MB/s | 68 |
| Ultra Wide SCSI (SCSI-3) | 40 MB/s | 68 |
| Ultra 2 SCSI | 40 MB/s | 50 |
| Ultra 2 Wide SCSI | 80 MB/s | 68 ili 80 |
| Ultra 3 - Ultra 160 SCSI | 160 MB/s | 68 ili 80 |
| Ultra 4 - Ultra 320 SCSI | 320 MB/s | 68 ili 80 |
| Ultra 5 - Ultra 640 SCSI | 640 MB/s | 68 ili 80 |
Koje su razlike i sličnosti navedenih sučelja i standarda:
Način označavanja odnosno mapiranja diskova u linuxu:
| Vrsta diska/konektora | Naziv u Linuxu |
| ATA - primarni kanal - master disk | /dev/hda |
| ATA - primarni kanal - slave disk | /dev/hdb |
| ATA - sekundarni kanal - master disk | /dev/hdc |
| ATA - sekundarni kanal - slave disk | /dev/hdd |
| ATA - … …x. | /dev/hd..x. |
| SATA ili SCSI - prvi kanal | /dev/sda |
| SATA ili SCSI - drugi kanal | /dev/sdb |
| SATA ili SCSI - treći kanal | /dev/sdc |
| SATA ili SCSI - četvrti kanal | /dev/sdd |
| SATA ili SCSI - ..x. kanal | /dev/sd..x. |
Izgled konektora raznih tipova diskova, vidljiv je na slici :
Opis diskova sa slike, od gore prema dolje:
Diskove prema namjeni možemo u grubo podijeliti u dvije grupe:
Ovdje se prvenstveno radi o pouzdanosti ali često i o brzini rada tvrdog diska.
Važan parametar svakog diska, vezan za brzinu rada je i broj okretaja samog diska, te često imamo slijedeće rotacijske brzine:
Što su veće rotacijske brzine ploča diskova (okretaja/minuti) to je veće i zagrijavanje ali i brzina prijenosa podataka
Usporediti ćemo tri tvrda diska tvrtke “Western Digital”, oba sa SATA sučeljem ali jedan za kućnu upotrebu (WD Black) i dva za profesionalnu primjenu (WD RE) i (WD SE):
| Funkcionalnost / Model diska | WD Black (FZEX ili FAEX) | WD RE (FYYZ ili FSYZ) | WD SE (F9YZ) |
| MTBF (sati) | Nedefinirano | 1 200 000 | 1 000 000 - 1 200 000 |
| Load unload Cycles | 300 000 | 600 000 | 300 000 |
| Broj nepopravljivih grešaka prema bitovima pročitanih podataka | manje od 1 na 1014 bitova | manje od 1 na 1015 bitova manje od 1 na 1016 za nove generacije (RE4) | manje od 1 na 1015 bitova |
| AFR % | Nedefinirano | 0.73 | Nedefinirano |
| TLER | NE | DA | DA |
| Zaštita od vibracija | Stable Trac, VCT | Stable Trac, VCT, RAAF | Stable Trac, Enhanced RAFF |
Iz tablice je vidljivo sljedeće:
MTBF ili engl “Mean time between failures” je predviđeno vrijeme rada (u satima) diska prije kvarova ili grešaka u radu. Odnosno predviđen radni vijek samog diska.
Load unload Cycles je broj pokretanja diska. Naime nakon svakog paljenja ili gašenja računala, disk se pokreće odnosno servo motor “zavrti” ploče (i vrti ih konstantnom brzinom). Ovdje se praktično radi o tome koliko puta se disk može stopirati i startati. Primjerice kada disk ide u “Sleep”, motor se zaustavlja i disk se gasi a kod izlaska iz “Sleep” faze, disk se ponovno uključuje i “zavrti”.
Broj nepopravljivih grešaka prema bitovima pročitanih podataka je vrsta greške na koju će se naići s vremenom i koja se kao što i naziv kaže - neće moći popraviti. Naime svaki tvrdi disk s vremena na vrijeme nailazi na greške te ih popravlja u radu, da mi toga nismo niti svjesn. Ali također može doći do pogrešaka koje elektronika diska ne može popraviti - to su upravo ove greške koje su ovdje navedene. Vidljivo je da profesionalne serije diskova imaju 10 (deset) puta veću pouzdanost od “običnih” diskova.
AFR ili engl. “Annualized failure rate” daje nam vjerojatnost da će se disk pokvariti u toku cijelogodišnje stalne upotrebe. Vjerojatnost od 0.73 % za disk znači vjerojatnost kada se disk pokvari unutar jedne cijele godine rada (tj. 8760 sati konstantnog rada).
TLER ili engl. “Time Limited Error Recovery”. Ovu opciju drugi proizvođači poput Samsung/Hitachi, nazivaju i CCTL (Command Completion Time Limit). Prvo se vratimo na osnove - kao što sam rekao svaki tvrdi disk u pozadini stalno popravlja greške na koje povremeno nailazi. Kod običnih diskova to nije problem - ponekad možemo primjetiti da disk nešto radi a da zapravo ne zapisuje ili čita neke nama vidljive podatke na disk. U tim trenucima naš disk vjerojatno u pozadini sam popravlja određene greške, i to može potrajati neko vrijeme (i nekoliko minuta). U normalnom radu nam to nije važno ali ako se disk koristi unutar nekog RAID kontrolera to postaje problem. Naime RAID kontroler očekuje da ako neki disk ima greške a koje sam disk ne može popraviti u roku od nekoliko sekundi do max. 8. sekundi, da disk prestane s popravljanjem. Dakle ako disk ne popravi grešku za max. 8 sekundi 8 sekundi , on mora prestati s popravljanjem i prijaviti grešku RAID kontroleru, koji će tada taj disk proglasiti neispravnim. Ako se ovo ne bi dogodilo cijelo RAID polje bi se zaustavilio s radom dok se problematični disk ne popravi (ako se uopće uspije popraviti). Dakle ovo je vrlo važna funkcionalnost za diskove koje koristimo u RAID poljima.
Zaštita od vibracija “Standardni” diskovi imaju standardne mehanizme zaštite od vibracija dok oni za profesionalnu primjenu moraju imati napredne mehanizme zaštite. RAFF tehnologija je jedna od njih (engl.Rotary Acceleration Feed Forward). RAFF tehnologija pomaže očuvanju performansi diska ali i povećanju njegovog radnog vijeka. Naime ovdje je naglasak na stabilnost rada diska, koju mogu narušiti vibracije drugih (susjednih) diskova, ventilatora ili slično. Zamislimo poslužitelj koji ima više od dva diska od kojih svaki stvara svoje vibracije i prenosi ih na drugi disk, uz sve ventiatore unutar kućišta koji donose nove vibracije itd. Sve ove vanjske vibracije (vibracije izvan samog diska) su u neprekidnom radu 365 dana (ili više), vrlo problematične odnosno stvaraju probleme u radu diska.
Sada postaje jasnije, zbog čega postoje diskovi za profesionalnu upotrebu.
Kod SSD (engl. Solid State Disk) diskova, također postoji ista podjela prema “standardnim” i “profesionalnim” serijama diskova. Jedino su razlozi malo drugačiji. Prvi razlog je tip “Flash” memorije te njene pouzdanosti i broja ciklusa zapisivanja te njenih performansi. Drugi razlog je priručna brza RAM memorija (engl. Cache) na samom disku, uz koju se na “profesionalnim” SSD diskovima nalaze kondenzatori (učinak je poput BBU na RAID kontrolerima) za održavanje stanja memorije, do trenutka kada se svi podaci ne zapišu u “Flash” memoriju diska.
Ako pogledamo statistike tvrtke “Google” na 100 000 diskova iz 2007 i tvrtke “Backblaze” na 50 000 diskova iz 2015. Svi navedeni diskovi su bili u upotrebi 24/7/365 (non-stop).
Napomena:
Ako sumariziramo oba izvještaja, možemo zaključiti :
Izvori podataka :
S obzirom na činjenicu da operativni sustav kao i sve programe kao i podatke držimo i spremamo na tvrdi disk (engl. Hard Disk), bitno je razumjeti osnove rada tvrdog diska. Svaki tvrdi disk sastoji se od nekoliko dijelova:
Fizički izgled tvrdog diska je vidljiv na slici:
Pojednostavljeno, logički, tvrdi disk izgleda ovako:
Tvrdi disk radi tako da upravljačka elektronika kontrolira rad servo motora, koji rotira ploče (diskove), konstantnom brzinom.
Podatke na disk zapisuju i čitaju glave (engl. Head) koje se nalaze sa svake strane ploče (diska). Glave se pomiču odnosno pozicioniraju prema potrebi, na lokaciju s koje moraju čitati ili pisati podatke. Podaci se čitaju i zapisuju s obije strane svake ploče (diska).
Rotacijske brzine diskova, danas dostupnih na tržištu su:
| Broj okretaja diska [o/min] |
| 5400 |
| 7200 |
| 10000 |
| 15000 |
Što je veća brzina rotacije diska i sve ostale komponente diska moraju raditi brže a samim time brzina pristupa podacima kao i brzina prijenosa podataka postaje veća.
Površina svake ploče (diska) je podijeljena u koncentrične krugove tj. u takozvane trake ili staze:
Više traka na istoj poziciji, na svim pločama tj. diskovima se naziva cilindrom:
Kako BIOS prepoznaje tvrdi disk i njegov kapacitet
Spajanjem tvrdog diska na disk kontroler (ATA/SATA/SCSI/SAS/…) na matičnoj ploči ili na PCI/PCI Express kartici, disk kontroler prijavljuje tvrdi disk BIOS-u računala.
Bitno je znati da svaki tvrdi disk dolazi s tvorničkim formatom na vrlo niskoj razini (engl. Low Level Format) koji služi za pravilno pozicioniranje glava na pozicije za pisanje/čitanje za svaki sektor na disku.
Nakon što je tvrdi disk inicijalno vidljiv u BIOSu računala,prvi korak BIOS-/a je mapiranje fizičke i logičke podjele na tvrdom disku, sve do razine sektora, prema kojemu se izračunava i nazivni kapacitet diska.
Najnovija LBA shema adresiranja je 48 bitna, pa podržava adresiranje do 128 PB.
Vezano za particioniramje, najnovije implementacije koje više ne koristi BIOS već UEFI ( Unified Extensible Firmware Interface) kao noviju verziju BIOSa, te GPT shemu particioniranja a koja koristi 64 bitno adresiranje pa je prema tome ograničenje ako imamo sektor od 512 byte-a x 64.bit-a = 9.4 ZB (9.4 × 1021 bytea)
Svi moderni operacijski sustavi, od trenutka pokretanja operacijskog sustava, više se ne oslanjaju na BIOS, kod pristupa disku. Oni pak koriste direktnu metodu pristupa diskovima, bez posredovanja BIOSa.
Pogledajmo sada površinu jedne ploče (diska):
Područja za zapisivanje podatka se nalaze unutar traka.
Svaka traka je podjeljena na najmanje jedinice koje se nazivaju sektori.
Veličina sektora na većini tvrdih diskova je obično 512 byte-a.
Podaci se u konačnici zapisuju u blokove od nekoliko sektora koji se nazivaju klasteri.
Veličina klastera podataka, koji je i najmanja jedinica za zapisivanje podataka, ovisi o datotečnom sustavu (engl. File System).
Proces logičkog formiranja površine diska u trake i sektore se zove formatiranje.
Različiti datotečni sustavi imaju različite moguće veličine klastera koje možemo odabrati samo u trenutku formatiranja particije.
Kao što smo rekli podaci se zapisuju u klastere kao najmanje jedinice zapisa, jedan za drugim (koliko god je to moguće).
Kod zapisivanja podataka na disk cilj je niz podataka koje zapisujemo zapisati u klastere koji su u nizu.
U tom slučaju je i čitanje bre nego da su podaci razbacani na različitim dijelovima diska, što se može dogoditi kod brisanja nekih podataka koji se nalaze pozicionirani između drugih podataka (datoteka).
Kada se nakon toga ponovno zapisuju neki drugi podaci, može se dogoditi da su upisani dijelom na mjesta gdje su bili prethodon obrisani podaci a drugim dijelom (ako su novi podaci veći od onih koji su prethodno obrisani) na prvu sljedeću slobodnu poziciju. Ovaj problem se zove fragmentacija i redovito se događa na nekim datotečnim sustavima koji nemaju zaštitni mehanizam protiv fragmentacije (pr. FAT i NTFS datotečni sustavi imaju problem sa fragmentacijom).
U slučaju fragmentacije podataka, čitanje s diska postaje s vremenom sve sporije i sporije.
Vratimo se na klastere.
Veličinom klastera je uvjetovana i veličina cijelog datotečnog sustava (odnos je specifičan za svaki datotečni sustav). Tablica pokazuje odnos maksimalne veličine particije uz pripadajuću veličinu klastera, za određeni datotečni sustav:
FAT16
| Maksimalna veličina particije | Veličina klastera |
| 64 MB | 1 KB |
| 128 MB | 2 KB |
| 256 MB | 4 KB |
| 512 MB | 8 KB |
| 1 GB | 16 KB |
| 2 GB | 32 KB |
| 4 GB | 64 KB |
FAT32
| Maksimalna veličina particije | Veličina klastera |
| 128 MB | 1 KB |
| 256 MB | 2 KB |
| 8 GB | 4 KB |
| 16 GB | 8 KB |
| 32 GB | 16 KB |
NTFS
| Maksimalna veličina particije | Veličina klastera |
| 16 TB | 4 KB |
| 32 TB | 8 KB |
| 64 TB | 16 KB |
| 128 TB | 32 KB |
| 256 TB | 64 KB |
ext3/ext4
| Maksimalna veličina particije | Veličina klastera (Block size) |
| 4 TB | 1 KB |
| 8 TB | 2 KB |
| 16 TB | 4 KB |
| 32 TB | 8 KB |
Linux/UNIX datotečni sustavi veličinu klustera nazivaju “Block Size” tj veličinom bloka.
Primjer
Ako nam je veličina sektora 512 byte-a i koristimo datotečni sustav kojem je veličina klastera pr. 4KB to znači kako se koriste 4 sektora za jedan klaster.
Pogledajmo neke od važnijih parametara rada mehaničkih diskova
Na vrijeme pristupa disku, odnosno brzinu prijenosa podataka od i prema diska, utječe nekoliko parametara, od kojih ćemo spomenuti samo:
Vrijeme pristupa ili odziva mehaničkih diskova je vrijeme koje protekne, prije nego možemo pristupiti podacima, pohranjenim na pločama diska. Ovdje se večinom se radi o mehaničkim faktorima, poput rotacije diskova ili pomicanja glava za čitanje i pisanje. Upoznajmo se o čemu se tu sve radi.
Ovo vrijeme se odnosi na vrijeme traženja, kod rotirajućih ploča diska, koje je potrebno mehanici koja pomiče glave za čitanje/pisanje, kako bi došle na pravu traku (stazu) odnosno poziciju na kojoj mogu obaviti željeno čitanje ili pisanje.
Prosječno vrijeme traženja odnosno pozicioniranja glave u odnosu na rotirajuće ploče, varira od 4ms za enterprise poslužiteljske diskove, pa čak do 12-15 ms za diskove za prijenosna računala. Diskovi za stolba računala, odnosno “standardni” diskovi imaju vremena pristupa 8-10ms.
Rotacijsko kašnjenje odnosno latencija odnose se na vrijeme koje je potrebno kada se glava već pozicionirala na pravu traku odnosno stazu, da se ploča diska koja se stalno rotira, zarotira na točnu poziciju, do traženog sektora unutar trake/staze.
Dakle što se diskovi rotiraju većom brzinom, prije će se unutar staze odnosno trake u kojoj se nalazi traženi sektor, doći do njega.
Tipična vremena čekanja odnosno kašnjenje koje je uzrokovano rotacijskim brzinama ploča diskova, vidljiva su u tablici:
| Brzina rotacije diskova [rpm] | Prosječno kašnjenje [ms] |
| 4200 | 7.14 |
| 5400 | 5.56 |
| 7200 | 4.17 |
| 10000 | 3.00 |
| 15000 | 2.00 |
Brzina prijenosa podataka, koja se naziva i propusnost, pokriva mnoge utjecaje, od internih, poput pozicioniranja glava (Seek time) te čekanja zbog same rotacije diska (rotacijsko kašnjenje), do prijenosa podataka prema elektronici diska i njenom memorijskom međuspremniku, do disk kontrolera, pa sve do zaprimanja podataka od strane kernela operacijskog sustava.
Efektivne brzine prijenosa podataka, ovisno o modelu i namjeni diska variraju između 50MB/s do 150MB/s ili nešto malo više. Brzine snimanja i čitanja također variraju. I na kraju sve ovisi kako se pristupa podacima:
Pogledajmo kako to izgleda:
I na kraju, i sam datotečni sustav može utjecati na konačnu brzinu prijenosa podataka, od i prema disku. Pogotovo kod datotečnih sustava kod kojih dolazi do porasta fragmentacije podataka. Ovakva fragmentacija može znatno utjecati na konačnu brzinu prijenosa podataka.
Rješenje ovog problema, kod datotečnih sustava koji su podložni fragmentaciji, je pokretanje defragmentacije, periodički.
Nisu svi datotečni sustavi podložni porastu fragmentacije, već ju mogu držati unutar granica od samo par postotaka. Dok primjerice datotečni sustavi ext4, XFS, Reiser4 i ZFS imaju mehanizam za prevenciju fragmentacije.
Ulazno izlazne operacije prema disku, koje se nazivaju i IOPS (Input/output operations per second) označavaju mjeru performansi diska, bilo mehaničkog ili SSD. Naime ovdje se govori o sposobnosti diska, da odradi određeni broj operacija pristupanja podacima, bilo da se radi o operacijama čitanja ili zapisivanja, u jednoj sekundi. Zamislim dvije situacije u kojima se ukupno treba pročitati 10GB podataka:
Dogoditi će se slijedeće:
1. slučaj - učitati će se 10 datoteka, vrlo brzo, recimo brzinom od 100 MB/s, pa će biti potrebno nekih 100 sekundi da se sve datoteke pročitaju. Pri tome imamo 10 IOPS operacija čitanja u sekundi.
2. slučaj - učitavati će se 10000 datoteka, što naravno naš disk neće moći podnijeti, jer čak i da imamo SAS disk koji radi na 15000 okretaja, on nije u stanju odraditi više od 210 operacija čitanja u sekundi. Zapravo će se odraditi maksimalno 210 operacija čitanja u sekundi, ali vrlo usporeno, jer će se kod tog vršnog opterećenja, glave diska morati stalno pomicati, ne bi li očitavale datoteke, koje su vjerojatno na drugim stazama. U konačnici će biti potrebno znatno više vremena da se pročita svih 10000 datoteka, a brzina prijenosa podataka će postati mizerna (možda nekoliko MB/s).
Za mehaničke diskove u pravilu vrijedi:
| Vrsta diska/sučelje | IOPS |
| 5400 rpm SATA drives | ~15-50 IOPS |
| 7200 rpm SATA drives | ~75-100 IOPS |
| 10000 rpm SATA drives | ~125-150 IOPS |
| 10000 rpm SAS drives | ~140 IOPS |
| 15000 rpm SAS drives | ~175-210 IOPS |
SSD drive koji se ponekada nazivaju i SSD diskovi (Engl. Solid state drive) su uređaji za pohranu podataka, koji se sve više koriste umjesto klasičnih mehaničkih diskova. Kod ovih SSD “diskova”, ne postoje ploče odnosno diskovi koji se rotiraju već se podaci spremaju na integrirane krugove (chipove).
Sučelja na koja se može spojiti SSD drive su uglavnom SATA ili SAS, poput klasičnih mehaničkih diskova. Dodatno, neke izvedbe SSD diskova spajaju se na PCI Express (PCIe) sabirnicu (NVMe standard) ali i na M.2 ili noviji U.2 utor. M.2 i U.2 konekcije su, direktno na PCIe sabirnicu, pa stoga imaju znatno veću propusnost i manju latenciju, te nemaju posebne konektore za podatkovnu vezu i za napajanje.
Glavni dijelovi SSDa su memorijski kontroler i Flash memorija te o njima najviše ovise performanse uređaja. Memorija je u NOR ili NAND izvedbi. U praksi se najviše koristi NAND vrsta. Tri su izvedbe NANDa: SLC (eng. Single-level cell), MLC (eng. Multi-level cell) i TLC (eng. Triple-level cell). U usporedbi s klasičnim mehaničkim diskom, SSD je mnogo otporniji na fizičke šokove, manjih dimenzija i mase, tiši, energetski učinkovitiji, ima kraće vrijeme pristupa memoriji i manju latenciju što ga čini bržim. Međutim, negativne strane SSDa su visoka cijena (GB/kuna) i kapacitetom manji memorijski prostor.
Svaka od gore navedenih izvedbi ima svoje prednosti i mane:
Osim ovih karakteristika, postoji još jedna gruba podjela, a to su SSD drive uređaji za :
Naime svaki SSD drive između svog memorijskog kontrolera i flash memorije ima i malu količinu brze RAM memorije (DRAM), koja se koristi kao brzi memorijski međuspremnik. Ovakav je dizajn kod svih SSD uređaja. Međutim, u slučaju nestanka električne energije, svi podaci koji su ostali u toj brzoj RAM memoriji, a nisu spremljeni u flash memoriju, ostaju izgubljeni. Ovo nije neki poseban problem za kućnu ili uredsku upotrebu ali za poslužitelje definitivno je. Iako i oni mogu dijelom biti imuni, s zaštitnim mehanizmima na razini datotečnog sustava i slično. Ipak, za poslužitelje postoji posebna vrsta SSD diskova, koja ima poseban kondenzator velikog kapaciteta, uz ovu DRAM memoriju, a koji u slučaju nestanka električne energije, čuva stanje ove RAM memorije, sve dok se računalo ponovno ne uključi/pokrene a tada se svi podaci iz DRAM memorije sigurno zapisuju na Flash memoriju. Predstavnici ovakvih poslužiteljskih SSD diskova su primjerice:
Pogledajmo i logičku shemu SSD diska:
Dodatno, SSD kontroleri, koji su zaduženi za rad cijelog SSD drivea, nisu svi isti, niti brzinom niti funkcionalnostima.
Kod SSD diskova, podaci se spremaju u flash memoriju, i to u takozvane memorijske čelije (memory cell), o kojima smo već govorili. Memorijske ćelije su grupirane u stranice (pages), koje su obično veličine između 4kB i 16kB. Ove stranice se potom grupiraju u blokove. Unutar ovih blokova se nalazi obično između 128 i 512 stranica. Dakle veličina bloka varira između 512kB i 8MB. U prosjeku se pak radi o 512 stranica od 4kB, što znači 2MB prostora za pohranu podataka unutar bloka.
Međutim flash memorijske ćelije mogu biti zapisane samo ako su prazne. Ako se pak na njima nalazi nešto zapisano, a mi to želimo prepisati, odnosno promijeniti ili zapisati nešto drugo, potrebno je prvo njihov sadržaj obrisati, prije operacije zapisivanja. Dodatno operacija zapisivanja ne može se raditi na razini svake pojedine memorijske ćelije, već se može raditi samo i isključivo na razini cijelog bloka. Zbog ovog hardverskog ograničenja, zapisivanje na prazan (neiskorišten) prostor, se brže odrađuje, jer se ne mora prvo raditi brisanje. S obzirom kako je prije promjena na razini memorijskih ćelija, potrebno brisanje cijelog bloka sa svim memorijskim stranicama i ćelijama unutar tog bloka, jasno je kako bi se tada izgubili svi podaci koje ne mijenjamo a nalaze se unutar tog bloka. Stoga se prije operacije brisanja cijeli blok kopira u priručnu memoriju. Potom se cijeli blok briše. A tek zatim se zapisuje cijeli blok, koji sada sadrži naše promjene.
Ova operacija se zove: read-erase-modify-write ciklus a ovaj problem se naziva write amplification
Pogledajmo i ono što bi mogli zvati geometrijom (prema terminologiji za klasične tvrde diskove):
Moderni kontroleri, vode brigu o tome, kako bi podatke uvijek zapisivali na blokove koji su već obrisani, koliko god je to moguće. Večina SSD diskova danas, se izrađuju tako da im je interni kapacitet nešto veći od onoga koji je vidljiv operacijskom sustavu. Njihov stvarni kapacitet je obično nešto veči (cca 7%) a kod poslužiteljski verzija može biti i znatno veći. Naime kontroler se stalno brine o tome kako bi se zapisivanje radilo na blokove koji su već obrisani te briše blokove koji se mogu brisati. U tom procesu se koriste blokovi “viška”. S obzirom kako diskovi večinom imaju nešto veći unutarnji kapacitet, na njemu, zbog navedenog mehanizma, gotovo nikada ne može doći do pisanja po blokovima koji nisu prethodno obrisani. Ova tehnologija se zove overprovisioning, a interni kapaciteti ovakvih diskova mogu biti nešto veći ili čak dvostruko veći od vanjskog kapaciteta diska.
Jedan od primjera su diskovi od recimo 120GB, kod kojih je interni kapacitet 128GB, pa se prema tome 8GB koriti kao overprovisioning. Drugi primjer bi bio disk kapaciteta 100GB, čiji je interni kapacitet 128GB itd.
Dodatno, ova razlika kapaciteta, koristi se i za zamjenu neispravnih blokova, spremanje firmwarea diska i slično.
TRIM naredba odnosno funkcionalnost, prema (S)ATA standardu, prema SCSI standardu (vrijedi i za SAS), naziva se UNMAP.
Ova funkcionalnost omogućava slanje upozorenja, od strane operacijskog sustava, prema SSD disku, koje stranice (pages) Flash memorije je moguće brisati. Dakle operacijski sustav ih označava kao slobodne te šalje TRIM naredbu SSD disku, koji ih onda može stvarno i obrisati. Ovime se ublažava problem read-erase-modify-write, jer oni dijelovi diska, koji više nisu potrebni, mogu se odmah obrisati, te se kod ponovnog zapisivanja na njih, u budućnosti, ne moraju prolaziti sva četiri koraka:
TRIM funkcionalnost je upotrebljiva samo na operacijskim sustavima koji ju podržavaju, pod uvjetom kada je SSD disk u BIOS/UEFI konfiguriran u AHCI/SATA načinu rada.
Do sredine 2017 godine, podrška za TRIM funkcionalnost NIJE bila implementirana na većinu hardverskih RAID kontrolera. Međutim, većina volume managera, poput ZFSa ili Linux LVMa, podržava TRIM.
Pogledajmo osnovne karakteristike SSD diskova
| Parametar | Vrijednost |
|---|---|
| Brzine zapisivanja SSD diskova | SAS ili SATA sučelje: između 200MB/s i 500+MB/s dok se PCIe brzine kreću i preko 2000MB/s |
| Brzine čitanja s SSD diskova | SAS ili SATA sučelje: od 400+ MB/s PCIe sučelj: do 3000 MB/s i više |
| Broj ulazno izlaznih operacija prema disku (IOPS) | SAS ili SATA sučelje: od 5 000 IOPS do 100 000 IOPSa PCIe sučelje: od 100 000 do preko 300 000 IOPSa |
| Seek time | 0.08ms - 0.16ms |
| MTBF (Mean Time Between Failure) | 1.000.000 - 2.000.000 sati |
Kao što je i očekivano, brzine prijenosa podataka sa SSD diskova su znatno veće od mehaničkih diskova, jer u njima nema mehaničkih dijelova, koji unose velika vremena čekanja: kao što su pomaci glave, čekanje na rotaciju diska i sl. Ovdje se radi o brzini elektronike. Iako i kod SSD diskova postoji vrijeme potrebno da se pronađu podaci, ovo vrijeme je višestruko manje, te iznosi između 0.08ms and 0.16 ms. Nadalje, broj ulazno izlaznih operacija (IOPS) je drastično veći, jer je moguće paralelno čitati ili zapisivati veliki broj datoteka, odnosno s više memorijskih lokacija SSD diska.
Kod mehaničkih diskova, mehanička glava se mora pozicionirati na stazu unutar koje se nalazi sektor koji treba pročitati, te ako je datoteka koje se čita, razlomljena, odnosno došlo je do njene fragmentacije, na više dijelova i samim time se nalazi na više staza, glava mora skakati iz staze u stazu kako bi pročitala sve podatke. Ovaj proces može znatno usporiti čitanje.
Fragmentacija ne predstavlja problem kod SSD diskova, jer nema glava koje moraju “skakati” sa staze na stazu, kako bi pokupile sve dijelove fragmentiranih datoteka. Kod SSD diskova čak i kada je fragmentacija prisutna, ona nije problem jer se blokovi podataka na njenoj flash memoriji pronalaze i čitaju ekstremno brzo, pa nema potrebe za defragmentacijom, i kod upotrebe datotečnih sustava koji su podložni fragmentaciji.
Kao i kod mehaničkih (rotacijskih diskova), danas se za adresiranje prostora na disku, kao i za pristup podacima na disku, ne koristi direktna shema adresiranja, kao što je za mehaničke diskove bila CHS shema, prema cilindrima, glavama i sektorima. Umjesto toga koristi se LBA shema (Logical block addressing) koja je posrednik između operacijskog sustava i samog diska.
Naime kod mehaničkih diskova i dalje postoji fizička podjela i adresiranje prema cilindrima, glavama i sektorima, jer se tako i zapisuju podaci na njih, ali se ta shema mapira u novu LBA shemu, kojoj pristupa operacijski sustav. Isti slučaj je i sa SSD diskovima, koji nemaju cilindre,glave i sektore ali imaju adresiranje prema blokovima, stranicama i ćelijama, koje se opet mapira u LBA adrese.
Na ovaj način se sakrila interna struktura diska, te pojednostavnio pristup.
Kao i kod mehaničkih diskova, nakon što se pokrene operacijski sustav, on se (što vrijedi za sve moderne operacijske sustave) više ne oslanja na BIOS, za pristup disku. Naime on nadalje koristi direktan pristup disku, bez posredovanja BIOSa za razlučivanje adresiranja blokova, stranica i čelija SSD diska.
Prema logičkoj shemi, svaki tvrdi (ili SSD) disk na samom početku, u prvom sektoru (na većini tvrdih diskova, veličine je 512 byte-a) ima tzv. Master Boot Record (MBR), to je poseban dio diska s kojega, kod pokretanja računala, BIOS računala počinje čitati podatke.
U Master Boot Recordu (MBR ) se nalazi mali program koji čita particijsku tablicu, te provjerava koja od njih je označena kao aktivna.
Particija predstavlja logičku cjelinu tvrdog diska koju operativni sustav može koristiti. Particija je i najmanja logička cjelina, na koju se može instalirati datotečni sustav. Dakle datotečni sustav (ext2/3/4, XFS, ZFS i sl.) se može instalirati samo na particiju na disku, pa prema tome, sve dok disk nije podijeljen na particije (minimalno jednu), na njega se ne može instalirati datotečni sustav. Definicija svih particija na disku se nalazi u particijskoj tablici (Engl. partition table), koja se nalazi u MBR zapisu (kod MBR sheme).
Dalje u tekstu, govoriti ćemo o Tzv. PC stilu odnosno vrsti particija, s kojima ćete se najčešće i susretati.
I dalje ćemo govoriti o PC stilu particioniranja i to o MBR vrsti, zbog lakšeg razumijevanja, a koja predstavlja stariji standard (potječe iz 1983.g), a vrlo sličan je princip s novijim standardom koji se zove GPT (GUID Partition Table).
MBR ima nekoliko ograničenja:
GPT je noviji sustav, koji za sada nema ograničenja:
S MBR particijama možemo raditi sa svim programima za particioniranje, dok sa GPT, samo s novijima, koji podržavaju GPT particije.
Pod Linuxom, za rad s MBR možemo koristiti programe:
fdisk, cfdisk i sličneDok za rad s GPT moramo koristiti (novije generacije programa), poput:
parted (GNU Parted), gdisk (GPT fdisk), cgdisk (Frontend za gdisk) i sl.
Bez obzira, koristimo li MBR ili GPT shemu, svaki novi disk je potrebno pripremiti za korištenje, što podrazumijeva:
Particija predstavlja logičku cjelinu tvrdog diska, koju operativni sustav može koristiti. Particija je i najmanja logička cjelina, na koju se može instalirati datotečni sustav.
Naime datotečni sustav (NTFS, ext2/3/4, XFS, ZFS i sl.) se može instalirati samo na particiju na disku, pa prema tome, sve dok disk nije podijeljen na particije (minimalno jednu), na njega se ne može instalirati datotečni sustav. Definicija svih particija na disku se nalazi u particijskoj tablici (Engl. partition table), koja se nalazi u MBR zapisu.
Svaki disk mora imati minimalno jednu particiju.
Formatiranje se odnosi na instalaciju datotečnog sustava na odabranu particiju. Dakle nakon što smo kreirali particiju na disku, potrebno je instalirati datotečni sustav, ovisno o operativnom sustavu, na kojem to radimo. Neki od datotečnih sustava su:
Kada smo instalirali datotečni sustav na odabranu particiju, disk je spreman za upotrebu.
Konačni kapacitet diska
Kupnjom novog diska, i spajanjem istoga na računalo, primijetiti ćete odstupanje kapaciteta diska od onoga deklariranog od strane proizvođača. Naime proizvođači diskova kapacitet označavaju dodavanjem metričkog prefiksa, kako je i za očekivati i to za dekadski brojevni sustav. Pa je tako:
Sve ovo je u redu za klasične mjerne jedinice - pr. 1kg = 1 000 g. što je točno ali računala koriste bazu 2 odnosno binarni brojevni sustav. Stoga su odnosi malo drugačiji, te je tako:
To znači kako je disk s tvorničkom deklaracijom proizvođača, s kapacitetom 1TB nešto manji, kada se iz metričkog dekadskog sustava kapacitet preračuna u binarni. Tako je 100GB u metričkom dekadskom sustavu jednako : 100GB x 1000 x 1000 x 1000 = 500.000.000.000 Bytea. Isti kapacitet računalo, jer koristi binarni sustav, bi vidjelo kao : 100GB x 1024 x 1024 x 1024 = 107 374 182 400 Bytea. To u praksi znači kako je deklarirani kapacitet diska, od strane proizvođača, nešto manji, zbog pretvorbe u binarni sustav. Pogledajmo koliko:
| Dekadski sustav (oznaka proizvođača) | Binarni sustav (kako to vidi računalo) |
| 100 GB | 93.13 GiB |
| 500 GB | 465.66 GiB |
| 1 TB | 931.32 GiB |
| 2 TB | 1862.65 GiB |
| 3 TB | 2794 GiB |
| 4 TB | 3725 GiB |
Oznaka za binarno preračunati kapacitet je malo slovo i koje se dodaje nakon metričkog prefiksa, te tako dobivam binarne prefikse. Prema binarnim prefiksima GB postaje GiB (gibibajt), TB postaje TiB (tebibajt) i tako dalje. Pogledajmo odnos između metričkih i binarnih prefiksa:
| Metrički dekadski prefiks | Vrijednost | Binarni prefiks | Vrijednost |
| k (kilo) | 1000 | ki (kibi) | 1024 |
| M (mega) | 1 000 000 | Mi (mebi) | 1 048 576 |
| G (giga) | 1 000 000 000 | Gi (gibi) | 1 073 741 824 |
| T (tera) | 1 000 000 000 000 | Ti (tebi) | 1 099 511 627 776 |
| P (peta) | 1 000 000 000 000 000 | Pi (pebi) | 1 125 899 906 842 624 |
| .. | .. | .. | .. |
Dodatno, kada se disk particionira te formatira, gubi se još malo kapaciteta, uglavnom ovisno o datotečnom sustavu a u konačnici sama iskoristivost kapaciteta pohranjenih podataka, ovisi i o veličini klastera, broju i veličini datoteka i sl.
Bez obzira da li imamo jedan disk ili se radi o RAID polju diskova (koje je ionako vidljivo kao jedan disk), procedura je ista:
Kako izgleda MBR shema, ako gledamo površinu jednog diska, s dvije particije, pogledajmo na slici.
Kako je vidljivo na slici, svaki disk na prvom sektoru (na početku diska) ima MBR (Master Boot Record) zapis, u kojemu se nalazi popis svih particija i njihove lokacije.
Svaka particija, na svom početku ima BR (Boot Record), koji se nekada zove i VBR (Volume Boot Record) zapis,a u kojemu se obično nalazi Tzv. second stage loader, za učitavanje operativnog sustava (ako ga imamo na toj particiji).
Ovakva struktura se često koristi kada imamo potrebu za instalacijom dva (ili više) operativnih sustava, svakog, na svojoj particiji. U tom slučaju particija s koje se pokreće operativni sustav, mora biti označena kao bootabilna. Tada se prva faza boot loadera nalazi u MBR zapisu a druga faza tj. second stage boot loader za operacijski sustav se nalazi u BR zapisu, na svakoj particiji.
Druga moguća upotreba je jednostavno kod primjena u kojima želimo razgraničiti i razdijeliti disk na više particija, na kojima ćemo imati različite stvari : pr. na prvoj particiji že biti operativni sustav a na drugoj podaci. Ili će na obije particije biti podaci ali za različite namjene.
Nakon prvog sektora na particiji se nalazi DATA dio, koji možemo formatirati s željenim datotečnim sustavom (NZFS, ext2/3/4, XFS, ZFS, …).
Vratimo se na MBR
Detaljnije, MBR sadrži informacije o particijama i njihovim pozicijama (na kojoj lokaciji počinje i završava koja particija). Osim toga u MBR se nalazi i tkzv. first-stage boot loader koji se učitava i pokreće kod podizanja sustava. On prvo pronalazi aktivnu particiju, potom pogledom na particijsku tablicu pronalazi prvi sektor aktivne particije.
Pozicija na prvom sektoru particije naziva se Boot Record (BR), ili Volume Boot Record (VBR).
Na tom prvom sektoru aktivne particije nalazi se tkzv. second-stage boot loader.
Ako je to bila aktivna particija tada second-stage boot loader tj. VBR pokreće prvi dio operativnog sustava, pohranjenog na podatkovnom dijelu particije (Data dio), koji onda nastavlja dalje s učitavanjem ostalih komponenti sustava.
Ograničenja MBR-a
Korištenjem MBR particijske tablice koja se kako smo rekli nalazi u dijelu MBR-a, je ograničeno na diskove čija je maksimaln veličina particije do 2TB. Dakle Tvrdi diskovi s većim particijama od 2 TB ne mogu koristiti MBR shemu.
Stoga se u novije vrijeme u novim verzijama BIOS-a, koji se zove UEFI (Unified Extensible Firmware Interface), više ne koristi MBR shema nego nova GPT (GUID Partition Table) shema, koju smo već spomenuli a koja nadilazi ovo ograničenje.
Mi ćemo se u daljnjem tekstu bazirati na MBR shemi, zbog lakšeg razumijevanja.
Podsjetimo se : Aktivna može biti samo jedna od maksimalno 4 primarne particije.
Što kada želimo imati “Multiboot” sustav
U slučajevima kada želimo instalirati dva ili više operativnih sustava, te imati mogućnost odabira koji operativni sustav želimo da se pokrene npr. instalirali smo 2 ili više Linuxa ili Linux i Windows ili neki drugi OS.
U ovakvom scenariju potreban nam je Boot Loader koji je instaliran u MBR, a koji ima mogućnost pokretanja Operativnog sustava sa željene particije, na kojoj se unutar BR zapisa nalazi boot loader druge razine (onaj od samog operativnog sustava).
Primjer:
Imamo instalirana 2 Linuxa, svaki na svojoj particiji.
Prvo smo instalirali Linux Centos (particija 1) i pri tome smo Boot loader instalirali na “root” particiju tj. na Boot Record od particije 1. (u primjeru /dev/sdb1). Nakon toga smo instalirali Linux Slackware na drugu particiju (/dev/sdb2) ali smo na kraju instalacije rekli da želimo boot loader instalirati na MBR od diska (/dev/sdb).
Particija 1 : Linux CentOS
Particija 2 : Linux Slackware
Što se sada dogodilo:
Imamo dvije particije od kojih je svaka označena kao “boot” particija i sada nije bitno koja je od njih označena kao aktivna jer će se Loader na MBR brinuti o tome s koje particije će podići operativni sustav. Osnosno biti će nam ponuđen odabir željenog operativnog sustava.
Particije izgledaju ovako:
Disk Drive: /dev/sdb
Size: 1073741824 bytes, 1073 MB
Heads: 139 Sectors per Track: 8 Cylinders: 1885
Name Flags Part Type FS Type [Label] Size (MB)
------------------------------------------------------------------------------
sdb1 Boot Primary Linux ext3 CentOS 511.85
sdb2 Boot Primary Linux ext3 Slackware 561.91*
Odabirom 1 (Linux CentOS) Loader sa MBR pronalazi prvi sektor (tj .Boot Record) na prvoj particiji i učitava boot loader koji dalje podiže Linux CentOS.
Odabirom 2 (Linux Slackware) Loader sa MBR bi morao pronaći prvi sektor (tj .Boot Record) na drugoj particiji i učitavati boot loader koji dalje podiže Linux Slackware. –> Ovo bi bio normalan postupak.
Vratimo se na logički izgled diska. Slika prikazuje osnovni izgled diska s 4 primarne particije:
Originalna shema particioniranja PC računala, dozvoljava samo 4 primarne particije. Pošto je to s vremenom postalo premalo, uvedene su tkzv extended (proširene) ili logičke particije.
Uvođenjem proširenih particija zapravo je omogućeno unutar svake od primarnih particija, kreiranje do 15 pod particija (tj. Logičkih particija).
U daljem tekstu ćemo se zbog jednostavnosti, držati primarnih particija.
Za početak ćemo se bazirati na osnovnim Unix/Linux datotečnim sustavima, koji se nalaze na primarnoj particiji.
Unix/Linux sustavi diskove i particije vide prvo kao datoteke (u /dev/ direktoriju), koje se povezuju ( mount -aju) u neki postojeći direktorij – za razliku od Windows OS-a , koji particije naziva ( C:, D:,E:, …).
Primjer
Za tvrde diskove:
/dev/sda označava SATA tvrdi disk 1 , pri tome :/dev/sda1 označava SATA tvrdi disk 1, particiju 1/dev/sda2 označava SATA tvrdi disk 1, particiju 2/dev/sdb označava SATA tvrdi disk 2 , pri tome :/dev/sdb1 označava SATA tvrdi disk 2, particiju 1/dev/sdb2 označava SATA tvrdi disk 2, particiju 2/dev/sdc označava SATA tvrdi disk 3
Kako smo rekli prvih 512 byte-a na svakom disku sadrže MBR (Master Boot Record), koji sadrži particijsku tablicu , s popisanim svim particijama koje se nalaze na ostatku diska.
Pomoću naredbe dd, prekopirati ćemo MBR u datoteku na disku.
Nemojte pobrkati oznaku diska (recimo /dev/sda) i particije (prva /dev/sda1 i druga particija na istom disku /dev/sda2 )
Dakle kopiramo prvih 512 byte-a našeg diska (recimo da je to disk /dev/sda).
dd if=/dev/sda of=/root/MBR.bin bs=512 count=1 1+0 records in 1+0 records out 512 bytes (512 B) copied, 0.000391625 s, 1.3 MB/s
Sada smo dobili datoteku imena : MBR.bin unutar /root/ direktorija.
Popis particija iz MBR-a možemo vidjeti s naredbom file, koja prepoznaje sadržaj datoteka i daje nam informacije o njima.
file /root/MBR.bin /root/MBR.bin: x86 boot sector; partition 1: ID=0x83, active, starthead 1, startsector 16, 2000048 sectors; partition 2: ID=0x82, starthead 21, startsector 2000064, 2194240 sectors, code offset 0x0
Vidimo slijedeće :
0x83 što označava Linux vrstu particije active) što znači kako se s nje može pokretati sustav startsector) i na kojemu završava (sectors)0x82 što označava Linux swap vrstu particije startsector) i na kojemu završava (sectors)
Vrste standardno podržanih tipova particija možete vidjeti u tablici dolje:
| Oznaka (ID) | Opis | Oznaka (ID) | Opis | Oznaka (ID) | Opis | Oznaka (ID) | Opis |
| 01 | FAT12 | 39 | Plan 9 | 83 | Linux | C6 | DRDOS/sec (FAT-16) |
| 02 | XENIX root | 3C | PartitionMagic recov | 84 | OS/2 hidden C: drive | C7 | Syrinx |
| 03 | XENIX usr | 40 | Venix 80286 | 85 | Linux extended | DA | Non-FS data |
| 04 | FAT16 -32M | 41 | PPC PReP Boot | 86 | NTFS volume set | DB | CP/M / CTOS / … |
| 05 | Extended | 42 | SFS | 87 | NTFS volume set | DE | Dell Utility |
| 06 | FAT16 | 4D | QNX4.x | 88 | Linux plaintext | DF | BootIt |
| 07 | HPFS/NTFS | 4E | QNX4.x 2nd part | 8E | Linux LVM | E1 | DOS access |
| 08 | AIX | 4F | QNX4.x 3rd part | 93 | Amoeba | E3 | DOS R/O |
| 09 | AIX bootable | 50 | OnTrack DM | 94 | Amoeba BBT | E4 | SpeedStor |
| 0A | OS/2 Boot Manager | 51 | OnTrack DM6 Aux1 | 9F | BSD/OS | EB | BeOS fs |
| 0B | W95 FAT32 | 52 | CP/M | A0 | IBM Thinkpad hiberna | EE | GPT |
| 0C | W95 FAT32 (LBA) | 53 | OnTrack DM6 Aux3 | A5 | FreeBSD | EF | EFI (FAT-12/16/32) |
| 0E | W95 FAT16 (LBA) | 54 | OnTrackDM6 | A6 | OpenBSD | F0 | Linux/PA-RISC boot |
| 0F | W95 Extd (LBA) | 55 | EZ-Drive | A7 | NeXTSTEP | F1 | SpeedStor |
| 10 | OPUS | 56 | Golden Bow | A8 | Darwin UFS | F4 | SpeedStor |
| 11 | Hidden FAT12 | 5C | Priam Edisk | A9 | NetBSD | F2 | DOS secondary |
| 12 | Compaq diagnostics | 61 | SpeedStor | AB | Darwin boot | FB | VMware VMFS |
| 14 | Hidden FAT16 <32M | 63 | GNU HURD or SysV | AF | HFS / HFS+ | FC | VMware VMKCORE |
| 16 | Hidden FAT16 | 64 | Novell Netware 286 | B7 | BSDI fs | FD | Linux raid autodetect |
| 17 | Hidden HPFS/NTFS | 65 | Novell Netware 386 | B8 | BSDI swap | FE | LANstep |
| 18 | AST SmartSleep | 70 | DiskSecure Multi-Boo | BB | Boot Wizard hidden | FF | BBT |
| 1B | Hidden W95 FAT32 | 75 | PC/IX | BE | Solaris boot | ||
| 1C | Hidden W95 FAT32 (LBA) | 80 | Old Minix | BF | Solaris | ||
| 1E | Hidden W95 FAT16 (LBA) | 81 | Minix / old Linux | C1 | DRDOS/sec (FAT-12) | ||
| 24 | NEC DOS | 82 | Linux swap / Solaris | C4 | DRDOS/sec (FAT-16 ) |
Prije svega, moramo objasniti kako se uopće zapisuju podaci na neki disk “storage” tj. medij koji se sastoji od blokova podataka iste veličine tj. “block device-a”.
“Block device” je zapravo virtualni uređaj za zapisivanje podataka spremljenih u blokove (podataka), pri čemu je moguć pristup bilo kojem od tih blokova podataka neovisno o pristupu nekom drugom bloku podataka. Ovakav način pristupa se naziva “Random Access”.
Dakle kada se podaci zapisuju na tvrdi disk, oni se zapisuju u blokovima (podataka) i na isti način im se pristupa za čitanje.
Uređaji koji koriste “Block device” su :
Pogledajmo naš tvrdi disk (/dev/sda ):
ls -al /dev/sda brw-rw---- 1 root disk 8, 0 Apr 8 15:57 /dev/sda
Prvo slovo u ovlastima (permissions) ove datoteke koja predstavlja naš cijeli tvrdi disk je b , što znači da je on “Block Device”.
Dakle u radu s diskovima i particijama se podrazumjeva da radimo s “Block Device”-ima.
Ostale tipove datoteka (i direktorija) možete vidjeti u poglavlju “DIrektoriji i datoteke”
U Linux svijetu je i sama particija određena, posebna datoteka u /dev/ direktoriju a želimo joj pristupiti preko datotečnog sustava koji je kreiran na njoj, i koji se, kao što smo rekli brine o datotekama i direktorijima.
Zbog toga se svaka particija, formatirana sa određenim datotečnim sustavom, mora povezati s određenom točkom u postojećoj strukturi odnosno stablu direktorija.
Kako to izgleda:
Primjerice drugi SATA tvrdi disk (/dev/sdb), particija 1 (/dev/sdb1) je formatirana sa ext4 datotečnim sustavom i nju ćemo povezati s novim direktorijem koji smo nazvali /hdd-novi
Dakle /dev/sdb1 će se mapirati (mountati) u /hdd-novi
Kod mountanja je potrebno znati i koji je datotečni sustav u pitanju te se on mora dodati kao parametar.
Primjer
Datotečne sustave ext3 i ext4 nije potrebno navoditi jer se podrazumijevaju. Za ostale se mora navesti vrsta datotečnog sustava.Takav slučaj je pr. XFS datotečni sustav. Ručno to možemo odraditi na sljedeći način (za ext4 datotečni sustav):
mount /dev/sdb1 /hdd-novi
Da je ovo bio XFS datotečni sustav, naredba bi izgledala ovako:
mount -t xfs /dev/sda1 /hdd-novi
Sa -t prekidačem se odabire koji file sustav je u pitanju.
Od tog trenutka, sadržaj direktorija /hdd-novi je particija SATA tvrdog diska 1, i to particija broj jedan (1), sve do novog restarta računala.
Dakle ovo mapiranje koje smo napravili nije permanentno (trajno). Objasniti ćemo i automatski način, koji osigurava rad i nakon restarta računala.
Pogledajte i poglavlje: Posebne particije: /proc
Svi mountani datotečni sustavi su vidljivi pozivanjem naredbe mount, bez parametara:
mount /dev/mapper/VolGroup-lv_root on / type ext4 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) tmpfs on /dev/shm type tmpfs (rw) /dev/sda1 on /boot type ext4 (rw) ... /dev/sdb1 on /hdd-novi type xfs (rw) ...
Skratili smo ispis ali je vidljiv i naš novo mountani datotečni sustav, s particije /dev/sda1.
Napredno
Dodatno, svaki mountani datotečni sustav ili mrežni disk, vidljiv je i u posebnoj particiji odnosno datotečnom sustavu /proc i to u dvije datoteke:
/proc/mounts - ovo je ono što i vidimo pozivanjem čiste naredbe mount. Dakle jednostavan prikaz svih mountanih particija/proc/self/mountinfo - ovdje se vidi znatno više detalja, koje ćemo sada i objasniti, u primjeru s jednim redom unosa. Ova datoteka se inače povezuje s trenutnim aktivnim, radnim procesom.
Jedan unos u datoteci /proc/self/mountinfo izgleda ovako: (ovo je samo primjer)
36 35 8:17 / /mnt2 rw,noatime master:1 - ext4 /dev/sdb1 rw,errors=continue | | | | | | | | | | | (1)(2) (3) (4) (5) (6) (7) (8) (9) (10) (11)
Objašnjenje stupaca:
(1) - mount ID - jedinstveni identifikator mounta, koji se može ponovno iskoristiti nakon umount-a(2) - parent ID - identifikator vršnog procesa koji je napravio mount(3) - major:minor: vrijednosti uređaja koji je mountan - pogledajte poglavlje Uređaji detaljnije(4) - root: odnosno vršni direktorij datotečnog sustava u koji se mounta(5) - mount point relativan u odnosu na root procesa koji je napravio mount(6) - mount options odnosno opcije i parametri s kojima je napravljen mount(7) - opcionalna polja (ovo polje može biti prazno ako nema dodatnih opcija). Opcije mogu biti:shared:X - mount je dijeljen (shared) u peer grupi Xmaster:X - mount je (slave) peer grupi Xpropagate_from:X - mount je (slave) te prima propagacije iz peer grupe Xunbindable - mount je (unbindable)(8) - ovdje je znak minus (-) koji je separator između opcija (7) i polja devet (9)(9) - je filesystem type polje koje označava datotečni sustav koji je mountan(10) - je source particija ili disk koji je mountan - pr. /dev/sdb1(11) - ovo su takozvane super options - opcije za datotečni sustav - za blok uređaj koji je mountan
Pogledajmo kako izgleda jedan stvarni unos za naš SATA disk, odnosno njegovu prvu particiju /dev/sdb2, formatiranu s ext4 datotečnim sustavom, a koju smo mountali u direktorij /DISK2:
25 21 8:17 / /DISK2 rw,relatime - ext4 /dev/sdb1 rw,barrier=1,data=ordered
Praktično isto kao i tvrdi disk, uz razliku , da kada nam više ne treba, moramo napraviti i unmount (jer u protivnom nećemo moći izvaditi CD/DVD medij iz uređaja): Ako je CD/DVD-ROM , uređaj vidljiv kao /dev/cdrom i ako ga želimo mountati u direktorij /cdrom :
mount -t iso9660 /dev/cdrom /cdrom
Nakon završetka rada ca CD/DVD medijem – kada ga želimo izvaditi , moramo izaći iz /cdrom direktorija te moramo napraviti unmount.
umount /dev/cdrom
U određenim slučajevima, kada na lokalnom ili mrežnom disku imamo dostupnu ISO image (sliku) datoteku, nekog CD-ROM ili DVD-ROM diska, moguće ju je mountati u neki lokalni direktorij, kao da se radi o normalnom CD/DVD-ROM disku ubačenom u CD/DVD-ROM uređaj.
Kreirajmo lokalni direktorij (/mnt/CD-DVD), u koji ćemo ju mountati:
mkdir -p /mnt/CD-DVD
Ako se ISO image datoteka nalazi u : /ISO/Linux.iso, tada:
mount -o loop /ISO/Linux.iso /mnt/CD-DVD
Napomena: naredbi mount smo dodali opciju, kako bi koristila poseban loop uređaj (-o loop), a koji Linux koristi upravo kako bi se datotekama, koje se u ovom slučaju nalaze unutar ISO image slike CD/DVD-ROM diska, moglo pristupati kao da se nalaze na stvarnom blok uređaju (disku).
Od sada, u direktoriju: /mnt/CD-DVD će se nalaziti sve datoteke s te ISO image datoteke.
Ako u bilo kojem trenutku, više ne trebamo ovaj CD/DVD disk, moramose nalaziti u nekom direktoriju izvan direktorija koji predstavlja taj CD/DVD-ROM disk. U našem slučaju izađimo iz dirktorija /mnt/CD-DVD - primjerice:
cd /
Sada možemo odmountati CD/DVD disk image:
umount /mnt/CD-DVD
Kako bi mogli razumjeti automatsko mountanje particija, prvo moramo razumjeti /etc/fstab.
/etc/fstab sadrži popis svih datotečnih sustava, njihovih lokacija i ostalih parametara koji su potrebni kako bi se neki datotečni sustav mountao prilikom podizanja sustava.
Dakle kod svakog podizanja operativnog sustava, prvo se čita datoteka /etc/fstab te se na osnovu njenih unosa, prvo mounta root direktorij (/ ) i to sa datotečnog sustava i particije na kojoj se nalazi cijeli operativni sustav. Nakon toga se mountaju i ostali datotečni sustavi, prema redosljedu, kojim su navedeni u gore navedenoj konfiguracijskoj datoteci.
Što se nalazi u /etc/fstab i kako to izgleda na primjeru root / direktorija, pogledajte u tekstu koji slijedi.
Ako je primjerice /dev/sda1 sistemska particija na kojoj se nalazi cijeli operativni sustav Linux, a formatirana je sa ext4 datotečnim sustavom, i ona se treba mountati u / direktorij koji predstavlja korijen (eng. root = korijen) stabla direktorija cijelog operativnog sustava.
| Datotečni sustav | Direktorij u koji se mounta | Datotečni sustav | Opcije | Dump | Pass |
| /dev/sda1 | / | ext4 | errors=remount-ro | 0 | 1 |
U opcijama koje vidimo, može se dodavati dosta parametara, a ovaj koji mi imamo (errors=remount-ro) znači kako će se u slučaju grešaka ova particija mountati samo kao read-only (bez prava snimanja), zbog toga kako bi se mogla pokrenuti provjera tog datotečnog (file) sustava, ako dođe do greške.
Za provjeru i popravljanje integriteta podataka, postoje alati koji su specifični za točno određeni datotečni sustav. U našem slučaju to je ext4, pa se obično koristi alat fsck.ext4.
Za sada je važno znati da kada se radi provjera ili popravljanje “podataka” na datotečnom sustavu, isti mora biti u stanju read-only.
To je stoga, kako se ne bi dogodilo da netko (ili neki program) u pozadini radi neke izmjene na podacima, jer one mogu dodatno pogoršati stanje.
Dump može imati vrijednost 0 ili 1 (uključena ili isključen opcija)
“Dump” označava staru metodu Backupa, kod gašenja sustava – ovo se ne koristi pa je preporuka da ostane na 0
Pass može imati vrijednost 0, 1 ili 2 :
0 - isključeno
1 - pokreni fsck prvo na ovoj particija
2 - pokreni fsck na ovoj particiji nakon one koja ima 1
Pass-ing označava postoji li potreba za automatskim pokretanjem provjera datotečnog sustava (fsck) , za root (/ ) se preporuča da bude na 1 .
U slučaju root (/) datotečnog sustava, to znači kako će datotečni sustav biti provjeravan automatski nakon određenog broja restarta sustava.
Kako je to konfigurirano, možemo vidjeti s naredbom dumpe2fs.
Probajmo saznati i kako to izgleda na našem sustavu, na root particiji (/dev/sda1) :
Izlistati će se dosta toga a nas zanima samo ovo:
dumpe2fs -h /dev/sda1 ... ... ... Mount count: 9 Maximum mount count: 36
To znači da je sustav restartan 9 puta te da će se nakon 36 puta pokrenuti fsck (privjera stanja diska).
Druga važna particija koju svaki Linux mora imati je takozvana swap particija. U Windows operacijskim sustavima postoji swap datoteka, a u Linux svijetu je za to potrebna posebna swap particija, sa posebnim swap datotečnim sustavom optimiziranim za ovu upotrebu.
U slučaju kada nam je sva radna (RAM) memorija puna, a za rad nam je potrebno još RAM memorije, sustav uključuje SWAP memoriju odnosno počinje koristiti swap particiju na tvrdom disku kao proširenje RAM memorije. To je proces koji se odrađuje automatski, od strane operacijskog sustava. SWAP nije zamijena za RAM memoriju, već je samo (privremena) pomoć.
Za više detalja o sustavu virtualne memorije, unutar kojega je implementiran i swap, pogledajte poglavlje: Virtualna memorija
Preporuke kod kreiranja swap particije (ovo se radi samo kod instalacije operativnog sustava) su:
U slučaju kada vam sustav intenzivno počinje koristiti swap, to je znak da je potrebno nadograditi RAM memoriju. To se može provjeriti pomoću naredbe free :
Provjerimo koliko nam je zauzeće memorija (u GB) [server u primjeru ima 96GB RAM i SWAP od 93GB]
free -g
total used free shared buffers cached
Mem: 96 60 33 0 0 40
-/+ buffers/cache: 19 74
Swap: 93 0 93
Kako izgleda unos u /etc/fstab za swap particiju (ako je swap particija /dev/sda2 ):
| Datotečni sustav | Direktorij u koji se mounta | Vrsta datotečnog sustava | Opcije | Dump | Pass |
| /dev/sda2 | none | swap | sw | 0 | 0 |
Pogledajmo koja swap particija je u upotrebi. Za ovu namjenu. ćemo koristiti naredbu swapon s perkidačem -s, koji če nam dati status:
swapon -s Filename Type Size Used Priority /dev/sda2 partition 127965744 0 -1
Naredba swapon, Ove podatke, izvlači iz datoteke: /proc/swaps.
Dakle vidimo kako se za razliku od root (/) particije swap ne mounta nigdje te da je njegova vrsta swap.
Kako ćete vidjeti u slijedećem poglavlju, u određenim datotekama unutar /proc direktorija, nalaze se i datoteke u koje se zapisuju razne statistike, vezane i za swap particiju.
Jedna od tih datoteka je i datoteka: /proc/meminfo. Za više detalja o njoj pogledajte poglavlje: Sadržaj /proc/meminfo datoteke. Ukratko u njoj se zapisuju statistike o upotrebi swap memorije, a koje nam daje i naredba free.
Druga korisna naredba je naredba koja dolazi u paketu sysstat, a zove se vmstat. Ova naredba nam također može dati osnovne podatke o iskorištavanju swap particije. Više o ovoj naredbi, pogledajte u poglavlju: Naredba vmstat
Drugi primjer upotrebe naredbe vmstat, za ovu potrebu, bi bio:
vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 0 1639248 37048 253984 0 0 8 12 36 336 0 0 99 0
Pogledajmo stupac: —swap–, u kojemu imamo polja:
si (swap IN), koji označavaju koliko se memorije čita sa swap particije so (swap OUT), odnosno, koliko se podataka iz RAM memorije počinje prebacivati u swap memoriju na disku
Za više podataka, moramo pogledati statistike iskorištenja sustava virtualne memorije, za svaki proces (prema PID broju), Ove statistike se nalaze u direktoriju /proc/PID/status, pri čemu je PID, process ID od svakog pojedinog pokrenutog Linux procesa. Ako nas recimo zanima statistika za program nginx, čiji PID ćemo saznati ovako:
pidof nginx 3953 3952 3951
Probajmo prvo sa prvim procesom (jer ih nginx u ovom slučaju ima pokrenuto tri). Dakle tražimo ključnu riječ VmSwap jer je tu vidljiva količina swap memorije u upotrebi (ako se koristi):
grep VmSwap /proc/3953/status VmSwap: 0 kB
Vidimo kako je vrijednost 0, što znači kako ovaj proces ne koristi swap memoriju.
Primjer: kako pronaći konkretno zauzeće swap memorije za sve pokrenute programe (procese) pod linuxom ?
Izlistati ćemo sve datoteke sa statistikama upotrebe sustava virtualne memorije, za sve procese (sve PIDove), i to ključnu riječ: VmSwap:
grep VmSwap /proc/*/status ...
Ovako bi dobili spis za svaki PID.
Napravimo to malo ljepše, uz sortirani ispis. Naime ovdje možemo koristiti i polje Name, koje nam daje ime procesa/programa, uz polje koje tražimo (VmSwap):
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | uniq
...
U ispisu, neki od posebnih programa, a ovo se odnosi na kernel thread programe, imaju malo drugačije statistike, pa one neće biti vidljive brojčano, a i ne interesiraju nas statistike kernel thread programa, već normalnih programa.
Gore navedenu skriptu možete i sami malo poboljšati.
Primjer ispisa gore navedene skripte, u slučaju kada se swap počinje intenzivno koristiti
Dolje je vidljiv primjer u kojemu su na računalu pokrenuta virtualna računala, a koja su iskoristila svu dostupnu dodijeljenu im RAM memoriju, te su u nedostatku RAM memorije počela koristiti i swap memoriju (disk). Mada se moglo raditi o bilo kojem programu koji je potrošio svu dostupnu RAM memoriju, kada bi operacijski sustav morao početi koristiti swap disk, kao nadogradnju RAM memorije:
kvm 3841912 kB kvm 1762252 kB kvm 1204392 kB kvm 1159060 kB ... ...
Vidljiva su četiri procesa kvm - to su hipervizori za virtualna računala, od kojih svaki troši podosta swap memorije jer je iskoristio svu dodijeljenu mu RAM memoriju, što naravno, uopće NIJE dobro za cijeli sustav.
kvm troši oko 3.8 GB swapkvm troši oko 1.7 GB swapkvm troši oko 1.2 GB swap kvm troši oko 1.1 GB swapRješenje ovog problema je povećanje dostupne RAM memorije virtualnim računalima, kako ne bi bila primorana koristiti swap disk (memoriju).
Osim root / particije, na kojoj se nalazi cijeli operacijski sustav, kod podizanja sustava, mountaju se i posebni pseudo datotečni sustavi za posebne namjene.
Virtualni file sustav “procfs” mounta se u direktorij /proc a kreira se u RAM memoriji, kod svakog podizanja sustava.
On nam daje informacije o svim procesima, poruke kernela te sistemske atribute (koje je moguće mijenjati).
Naredbe ps , top , free za ćitanje iz njega te primjerice sysctl i slične za čitanje i zapisivanje u specifične datoteke unutar ovog direktorija. Kreira ga “proc(fs)” u trenutku podizanja sustava.
Dakle ovaj virtualni datoteččni sustav kreira hijerarhijsku strukturu poddirektorij i datoteka koje predstavljaju trenutna stanja kernela.
Neke od datoteka unutar /proc/ sustava (direktorija) su :
/proc/apm - informacije o Advanced power management sustavu/proc/bus - direktorij koji sadrži informacije o uređajima spojenim na sve sabirnice (PCI, USB, …)/proc/cpuinfo pokazuje podatke o procesoru (CPU)/proc/devices - sadrži listu svih upravljačkih programa koji su trenutno aktivni u kernelu/proc/dma - informacije o DMA kanalima/proc/filesystems - lista datotečnih sustava koji su trenutno podržani od sustava/proc/ide - direktorij unutar kojega su razni IDE (disk) uređaji/proc/iomem - memorijske adrese svih uređaja (Video ROM, VGA, PCI sabirnica, ACPI, …)/proc/ioports - I/O portovi (memorijske adrese) za komunikaciju sa svim uređajima/proc/irq - direktorij s poddirektorijima za svaki IRQ (interrupt)/proc/interrupts pokazuje podatke o hardverskim signalima prekida (interrupts)/proc/kcore - image (slika) cijele RAM memorije računala (trenutno aktivne - stalno se osvježava)/proc/kmsg - trenutne poruke kernela/proc/loadavg - trenutno opterećenje sustava/proc/locks - kernel locks odnosno lista datoteka koje je kernel zaključao (lock)/proc/meminfo - pokazuje podatke o RAM memoriji, zauzeću swap memorije i druge podatke o ostalim dijelovima sustava virtualne memorije/proc/modules - pokazuje podatke o trenutno učitanim kernel modulima/proc/mounts - pokazuje što je sve mountano/proc/mttr - daje nam informacije o MTRR Memory Type Range Registers vrsti procesorskih registara, zaduženih za pristup memorijskom opsegu unutar kojega se nalaze uređaji poput PCI ili AGP grafičkih kartica i njihove memorije/proc/net/ - unutar ovog direktorija su statistike i konfiguracije mrežnih kartica, protokola i opcija/proc/net/arp - ovdje se nalazi ARP tablica/proc/net/dev - ovdje su mrežni uređaji i njihove statistike/proc/net/dev_mcast - Layer 2 multicast grupe/proc/net/dev_stat - status mrežnih sučelja/proc/net/ip_fwchains - Firewall chain linkage/proc/net/ip_fwnames - imena firewall chaina/proc/net/ip_masq - masquerading tablice/proc/net/…/proc/net/netstat - mrežne statistike/proc/net/raw - raw statistike/proc/net/route - routing tablica kernela/proc/net/snmp - SNMP podaci/proc/net/sockstat - statistika na razini socketa/proc/net/tcp - TCP socketi/proc/net/udp - UDP socketi/proc/net/unix - UNIX domain socketi/proc/net/wireless - wireless mrežna sučelja - podaci/proc/net/igmp - multicast IP adrese kojima se računalo prisdružilo/proc/net/psched - globalni packet scheduler parametri/proc/net/… /proc/net/udp6 - UDP ipv.6 socket/proc/net/tcp6 - TCP ipv.6 socket/proc/net/raw6 - raw mrežne statistike za IP v.6./proc/parport - informacije o paralelnom portu/proc/partitions - sadrži particijske tablice/proc/rtc - informacije o RTC (Real time clock)/proc/self/ - je poveznica na trenutno pokrenuti proces. Omogućava svakom procesu da gleda svoje parametre i opcije bez potrebe da poznaje svoj PID/proc/scsi/ - direktorij sa SCSI uređajima, njihovoj konfiguraciji i sl./proc/slabinfo - daje informacije o zauzeću memorije na slab razini/proc/stat - daje razne statistike o sustavu/proc/swaps - daje statistike o swap prostoru/particiji/proc/sys/ - u ovom direkrtoriju se nalaze poddirektoriji i datoteke zadužene za spremanje raznih opcija i parametara svih komponenti sustava te dodatnih informacija o njemu:/proc/sys/fs - daje informacije o datotečnom sustavu (Filesystem)/proc/sys/fs/dentry-state - status directory cachea/proc/sys/fs/file-max - sadrži maksimalan broj file deskriptora koji se može alocirati/proc/sys/fs/…/proc/sys/kernel - direktorij koji sadrži mnoge poddirektorije i datoteke zadužene za funkcioniranje globalnih funkcija kernela/proc/sys/vm - direktorij u kojemu se nalaze mnoge opcije (datoteke) zadužene za sustav virtualne memorije (Virtual Memory) i komponente koje se oslanjaju na sustav virtualne memorije, čije trenutne postavke se mogu mijenjati:/proc/sys/vm/drop_caches - ovdje se može promijeniti ponašanje cache memorije (standardno je 0):1 - za pražnjenje (oslobađanje) disk cache memorije2 - za pražnjenje slab cache memorije3 - za pražnjenje (oslobađanje) i disk i slab cache memorije/proc/sys/vm/…/proc/sys/dev - ovdje se nalaze parametri specifični za pojedine uređaje (RAID kontroler, SCSI, …)/proc/sys/net/ipv4/ - direktorij u kojemu se nalaze parametri i konfiguracija mrežnih protokola od razine OSI 3 na dalje: IP v.4., ICMP, TCP, UDP , … /proc/version pokazuje podatke o kernelu (verzija, arhitektura, …)
Standardni unos /proc datotečnog sustava/particije u /etc/fstab je :
proc /proc proc defaults 0 0
Unutar /proc/ direktorija, nalaze se prvo poddirektoriji s brojevima u nazivu. Od njih svaki broj predstavlja PID pokrenutog procesa a točno je definirana i struktura poddirektorija unutar PID direktorija.
Tako je primjerice PID od trenutno pokrenutog httpd (web poslužitelj) procesa Br. 4027.
Definirana je slijedeća struktura (PID ćemo nazvati općenito direktorij koji nosi neki PID broj )
/proc/PID/cmdline - argumenti s kojima je naredba izvršena/proc/PID/cpu - trenutni CPU (jezgra) koja ga pokreće/proc/PID/cwd - link na trenutni radni direktorij ovog procesa/proc/PID/environ - vrijednosti environment varijabli pokrenutog procesa/proc/PID/exe - link na izvršnu datoteku (executable)/proc/PID/fd - u ovom direktoriju se nalaze svi file deskriptori od ovog procesa/proc/PID/maps - ovo su memorijske mape (Memory maps) izvršnih datoteka i biblioteka ovog procesa, iz kojih se vidi u koje su se memorijske lokacije učitale/proc/PID/mem - ovo je memorija koju koristi ovaj proces/proc/PID/root - link na root direktorij ovog procesa/proc/PID/stat - statusi ovog procesa/proc/PID/statm - statusi memorije, koju zauzima ovaj proces/proc/PID/status - status ovog procesa - lijepo formatiran - prikazuje i statistike zauzeća sustava virtualne memorije (RAM, swap, …)/proc/PID/…
Virtualni datotečni sustav “sysfs” koji se mounta u /sys direktorij a kreira se u RAM memoriji, kod svakog podizanja sustava.
On strukturirano i uniformirano prikazuje informacije o sustavu te nudi kontrolu nad njim.
Upravljački programi (engl. Drivers) pomoću kernela kreiraju svoju strukturu direktorija i datoteka (slično kao kod /proc/ ali na strukturiran način). Ovdje se također nalaze i informacije i konfiguracije (koje je moguće mijenjati).
Kod podizanja sustava, kada kernel pronalazi uređaje (CPU, Disk kontorler, mrežna kartica, usb kontroler).
Tako su recimo svi podaci, konfiguracije i parametri za recimo SATA ili SCSI disk /dev/sda dostupni unutar poddirektorija : /sys/block/sda/.
S druge strane kasnije, kada se recimo dodaje vanjski USB disk, sustav kreira pripadajuču datoteku unutar /sys/ direktorija. /sys/bus/usb/devices/ .
Njegov standardni unos u /etc/fstab je :
sysfs /sys sysfs defaults 0 0
tmpfs je datotečni sustav koji drži sve datoteke u virtualnoj memoriji.
On se ponaša poput RAM diska, dakle sve datoteke i direktoriji koji se kreiraju, nalaze se zapravo u RAM memoriji.
Točnije on sve sprema u internu “cache” memoriju kernela te se sam može proširivati (kapacitetom) ili skupljati odnosno smanjivati dinamički, prema potrebi.
On je također u mogućnosti i koristiti “Swap” disk ako zatreba.
S obzirom na činjenicu kako se on nalazi u Page cache memoriji ili prema potrebi na swapu, sav njegov sadržaj je vidljiv isključivo kao Cache.
Osim toga, moguće je vidjeti i njegov kapacitet sa standardnim naredbama poput df i du.
Njega uglavnom koristi kernel, kao interni “brzi” disk.
Dodatno, neke sistemske biblioteke (engl. Library) ga koriste kao dijeljenu memoriju i očekuju kako će se on mountati kao /dev/shm.
Njegov standardni unos u /etc/fstab je :
tmpfs /dev/shm tmpfs defaults 0 0
U praksi ga (vjerojatno) nikada nećete koristiti.
Za kreiranje particija (govorimo o MBR vrsti particija) najčešće imamo dostupna dva programa:
fdisk (komandnolinijski odnosno naredbeni)cfdisk (grafički komandnolinijski odnosno naredbeni)U slučaju upotrebe velikih diskova odnosno particija, većih od 2 TB, moramo koristiti GPT vrstu particija, a samim time moramo koristiti programe koji znaju raditi s GPTom. To su:
gdisk (naredbeni) ilicgdisk (grafički naredbeni)
Pošto su primjeri vezani za MBR vrstu, mi ćemo koristiti cfdisk koji će nam prikazati disk i particije na vizualan i malo razumljiviji način.
U ovom primjeru koristiti ćemo drugi SATA hard disk ( /dev/sdb ) i na njemu kreirati samo jednu particiju.
Pokrenimo cfdisk na /dev/sdb disku :
cfdisk /dev/sdb
cfdisk (util-linux 2.20.1)
Disk Drive: /dev/sdb
Size: 599785472000 bytes, 599.7 GB
Heads: 255 Sectors per Track: 63 Cylinders: 72919
Name Flags Part Type FS Type [Label] Size (MB)
---------------------------------------------------------------------------------------------------------------------------------
Pri/Log Free Space 599785.48
[ Help ] [ New ] [ Print ] [ Quit ] [ Units ] [ Write ]
Postaviti će nam se pitanja:
Sada dolazimo do sljedećeg:
cfdisk (util-linux 2.20.1) Disk Drive: /dev/sdb Size: 599785472000 bytes, 599.7 GB Heads: 255 Sectors per Track: 63 Cylinders: 72919 Name Flags Part Type FS Type [Label] Size (MB) --------------------------------------------------------------------------------------------------------------------------------- sdb1 Pri/Log Linux 599785.48 [ Bootable ] [ Delete ] [ Help ] [ Maximize ] [ Print ] [ Quit ] [ Type ] [ Units ] [ Write ]
Dakle particija je spremna, oznaka joj je /dev/sdb1 (broj 1 označava da je to prva particija), te je tip (vrsta) particije označena kao “Linux“, što i želimo jer ju kasnije želimo formatirati sa nekim od Linux File sustava.
Sada sve promijene treba snimiti na disk , odabirom WRITE
Sustav će nas upozoriti da ćemo s ovime izgubiti sve podatke na ovom disku, ako želimo nastaviti treba upisati yes
Nakon što se sve završi možemo izaći iz programa sa QUIT
Sada imamo kreiranu particiju koju moramo formatirati.
Da bi mogli koristiti particiju, moramo ju formatirati s nekim file (diskovnim) sustavom na kojemu ćemo moći raditi s direktorijima i datotekama. Dakle formatiranje se odnosi na instalaciju datotečnog sustava na odabranu particiju. Naime, nakon što smo kreirali particiju na disku, potrebno je instalirati datotečni sustav, ovisno o operativnom sustavu, na kojem to radimo. Mi ćemo particiju formatirati sa Linux ext4 datotečnim sustavom, na sljedeći način (koristiti ćemo default postavke formatiranja).
Sintaksa je : “naredba za formatiranje” “block device particija)”
U našem slučaju to će biti:
mkfs.ext4 /dev/sdb1
Nakon toga će se kreirati datotečni sustav na toj particiji (što može potrajati ovisno o veličini particije):
mke2fs 1.42.5 (29-Jul-2012) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 36610048 inodes, 146431992 blocks 7321599 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=4294967296 4469 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
Sada imamo formatiranu particiju /dev/sdb1 , koju možemo mountati.
U našem slučaju napraviti ćemo to automatski u direktorij /STORAGE
mkdir /STORAGE
Za test probati ćemo to prvo ručno:
mount /dev/sdb1 /STORAGE
mount ... ... /dev/sdb1 on /STORAGE type ext4 (rw,relatime,barrier=1,data=ordered)
Zanima nas /dev/sdb1 što izgleda ok
Pogledajmo i veličinu particija koje su mountane:
df -h Filesystem Size Used Avail Use% Mounted on ... .... .... .... ... /dev/sdb1 550G 198M 522G 1% /STORAGE
Dakle /dev/sdb1 je veličine 522GB i mountan je u /STORAGE
Sada ćemo ga unmountati i to napraviti tako kako bi se mountao kod svakog podizanja sustava.
!! Oprezno !!
umount /STORAGE
Dodajmo na kraj datoteke /etc/fstab , sljedeći red (objašnjeno je u nekoliko poglavlja prije)
/dev/sdb1 /STORAGE ext4 errors=remount-ro 0 1
Nakon prvog restarta cijelog servera, mount nove particije će biti automatski odrađen, ali to možemo i ovako:
mount -a
U slučajevima kada želimo postići veću sigurnost, skalabilnost ili brzinu pisanja ili čitanja na tvrdi disk ili SSD disk, potrebno je koristiti tehnologije u kojiima se koristi više fizičkih diskova u istovremenom radu.
Povezivanja više fizičkih diskova u neki logički disk odnosno polje diskova moguće je pomoću tkzv. RAID tehnologija ili tkzv. “Volume Managera”.
RAID je skraćenica od redundantnog polja nezavisnih diskova (engl. Redundand Array of Independent Disks).
O ćemu se radi ?
Podaci se zapravo zapisuju (i čitaju) na više diskova paralelno, na način koji je definiran u tkzv. RAID polju, koje smo odabrali prilikom inicijalizacije RAID polja. Postoji nekoliko standardnh RAID polja od kojih svako ima neke prednosti i mane.
Osim toga postoje dvije mogućnosti kreiranja RAID polja :
Softversko RAID polje se kreira iz operatvnog sustava a hardversko iz RAID kontrolera tj. posebne kartice poput ove na slici dolje
Na slici je RAID kontroler tvrtke “Adaptec” https://www.adaptec.com (Adaptec 2100S) .
Slika prikazuje hardverski RAID kontroler za spajanje SCSI tvrdih diskova pomoću 68 pin-skog konektora/kabela, preko kojeg je moguće spojiti do 15 tvrdih diskova. Ovaj RAID kontroler se na matičnu ploču spaja preko PCI sabirnice.
Na njemu je vidljivo sljedeće:
U slučaju upotrebe hardverskog RAID kontrolera prilikom uključivanja računala nakon što se inicijalizira BIOS na matičnoj ploči inicijalizira se i BIOS RAID kontrolera. Tada je potrebno ući u BIOS RAID kontrolera te kreirati željeno RAID polje (ili više njih) sa dostupnim tvrdim diskovima spojenim na RAID kontroler.
Ako raspolažemo s većim brojem tvrdih diskova, moguće je kreirati više RAID polja tj. tkzv. Logičkih diskova. Uglavnom nakon što snimimo konfiguraciju RAID polja koja smo kreirali, RAID kontroler počinje s inicijalizacijom RAID polja, u potpunosti (što može trajati i satima [ovisno o RAID polju i broju i brzini tvrdih diskova]) ili samo djelomično.
U slučaju kada se RAID polja ne moraju potpuno inicijalizirati (što je slučaj kod novijih RAID kontrolera), možemo rastartati računalo. Potom će BIOS-u računala biti prijavljen po jedan Logički disk za svako RAID polje koje smo kreirali. RAID polja će se kasnije u pozadini inicijalizirati nakon startanja operativnog sustava a ti logički diskovi će nam biti vidljivi kao običan fizički tvrdi disk (po jedan za svako RAID polje koje smo kreirali), koji možemo normalno particionirati i formatirati.
U slučaju kada se RAID polje mora inicijalizirati unutar BIOSa RAID kontrolera, potrebno je pričekati kako bi se proces završio, što može potrajati satima osvisno o veličini i tipu RAID polja. Nakon inicijalizacije se restarta računalo, svako RAID polje (Logički disk) se prijavljuje BIOSu matične ploče, te je vidljivo operativnom sustavu kao običan fizički tvrdi disk (isto kao u gornjem slučaju).
Malo detaljnije
Pogledajmo logičku shemu hardverskog RAID kontrolera.
RAID kontroler ima svoj centralni procesor (CPU) i specijalizirani procesor (RAID ASIC) a obično su obije funkcionalnosti integrirane u jednom chipu. Specijalizirani (dio) procesora se zove RAID ASIC i on je zadužen za RAID polja.
Dakle svo zapisivanje ili čitanje na RAID polje sa strane operacijskog sustava od gore, odnosno zapisivanje na fizičke diskove (na slici prema dolje), kao i sve potrebne kalkulacije (pr. izračunavanje pariteta kao kod RAID 5 ili RAID 6 polja) odrađuje RAID ASIC.
RAID kontroler ima i svoju ROM i RAM memoriju kao i disk kontroler na koji se zapravo spajaju svi diskovi.
Važno je znati da RAID kontroler ima svoj “minijaturni” operacijski sustav niže razine a koji je pohranjen u ROM memoriji RAID kontrolera (iz nje se i učitava).
Unutar tog “minijaturnog” operacijskog sustava se nalaze metode za pristup svim diskovima spojenim na njega kao i sve potrebno za kreiranje i rad RAID polja unutar kojega se nalaze diskovi.
Možemo promatrati RAID kontroler i kao minijaturno računalo, jer on ima:
Sada promatrajmo diskove koji su u konačnici spojeni na RAID kontroler kao na jednu komponentu koja komunicira s ostatkom računala odnosno “pravim” operacijskim sustavom Linux i to preko upravljačkog programa (Engl. Driver) za naš RAID kontroler.
Linux operacijski sustav preko upravljačkog programa za naš RAID kontroler vidi samo polja diskova koja su kreirana od strane RAID kontrolera, i to kao jedan jedini disk. Kreirali smo RAID 10 polje unutar kojega se nalaze četiri (4) tvrda diska (“disk 1” do “disk 4”), a operacijski sustav (Linux), vidjeti će jedan jedini tvrdi disk, koji je zapravo cijelo RAID 10 polje diskova. U primjeru će RAID 10 polje biti vidljivo kao disk /dev/sdb.
Također smo kreirali još jedno polje diskova koje je RAID 1 a u kojemu su dva diska (“disk 5” i “disk 6”). I ovo polje diskova prezentirano je operacijskom sustavu, kao jedan zasebni (individualni) disk, konkretno vidljiv kao /dev/sda.
Svaki od tih diskova se s točke operacijskog sustava sastoji od svih dijelova od kojih se sastoji bilo koji “normalan” tvrdi disk (trake, cilindri, klasteri i sektori). On se nadalje ponaša kao običan “Block Device” odnosno “Blok uređaj”.
Zbog toga je svaki taj “logički” disk potrebno particionirati te kasnije formatirati s nekim datotečnim sustavom. Svi programi dalje koriste taj datotečni sustav za pohranjivanje datoteka, kao da se radi o običnom tvrdom disku.
Za sve funkcionalnosti RAID polja kao i diskova koji su unutar tih polja, brine se RAID kontroler. Stoga je važno da je RAID kontroler koji ste odabrali, kao i njegov operacijski sustav (Firmware) te pripadajući upravljački program ,najbolji mogući odnosno provjeren i dokazan u dugotrajnom i stabilnom radu.
RAM memorija na RAID kontroleru
Kao što je vidljivo iz obije slike RAID kontrolera, na svakom RAID kontroleru nalazi se i brza RAM memorija koja se koristi kao brzi međuspremnik između RAID kontrolera i samih diskova u određenom RAID polju. Ova RAM memorija stoga mora biti vrlo pouzdana. Zato se u RAID kontrolere ugrađuje isključivo tip memorije koji ima automatsku korekciju greške odnosno ECC (engl. Error Correcting Code) memorija. Postoji nekoliko varijanti ECC memorija:
Ovakve memorije se inače ugrađuju i u poslužitelje. ECC memorije možemo prepoznati i po tome što imaju neparan broj memorijskih “chipova”. ECC memorija na slici ih ima 9, dale stvarni ukupni kapacitet ove memorije je zbroj kapaciteta 8 memorijskih “chipova”.
Slika prikazuje RAM memoriju PC-100 ECC, kapaciteta 128MB, tvrtke Kingston http://www.kingston.com (kompatibilnu s RAID kontrolerom Adaptec 2100S, na slici prije):
Ova brza memorija, osim što drastično ubrzava operacije prema RAID kontroleru odnosno RAID polju diskova, uvodi i jedan problem.
Što će se dogoditi ako je naš operativni sustav poslao na RAID kontroler na zapisivanje određene podatke, koje je RAID kontroler prvo spremio u ovu brzu RAM memoriju ali trenutak prije nego je podatke stvarno počeo zapisivati na diskove, nestalo je ekektrične energije. U ovom slučaju ostati ćemo bez tih podataka, koji su bili u RAM memoriji RAID kontrolera.
Ima li pomoći ?.
Naravno, radi se o opciji koja je dostupa za sve novije RAID kontrolere a to je slična ECC RAM memorija ali koja na sebi ima punjivu bateriju. U slučaju nestanka električne energije, ova baterija čuva stanje RAM memorije cijeli niz sati, sve dok se računalo/poslužitelj ne pokrenu. Tada RAID kontroler sve podatke iz ove ECC RAM memorije, a zahvaljujući njenoj bateriji, uredno zapisuje na tvrde diskove u RAID polju, na koje su se podaci inicijalno i trebali zapisati.
Ova opcija za RAM memoriju RAID kontrolera se zove BBU (engl. Battery Backup Unit).
Izgled ECC RAM memorije sa BBU, za RAID kontroler tvrtke LSI Logic http://www.lsi.com , je vidljiv na slici:
Sada ćemo se spustiti jednu razinu niže. Pogledajmo stanje u kojemu koristimo RAID kontroler s jednim RAID poljem na kojemu je kreirana jedna particija s MBR shemom.
Sa strane RAID kontrolera (pogled A), vidljivi su svi diskovi u RAID polju. U RAID polju se podaci raspoređuju po svim diskovima, ovisno o samom RAID polju. Tako je i sam MBR raspoređen (kopiran) na više diskova u RAID polju. Isto se događa i s BR i svim podacima (DATA dio).
Nadalje RAID kontroler prijavljuje BIOSu računala cijelo RAID polje kao jedan (običan) (logički) disk (pogled B ). Ako sve pogledamo s točke tog logičkog diska (pogled B) on se ponaša kao običan disk, koji se sastoji od MBRa, BRa i dijela za podatke (DATA dio).
Pogledamo li ipak sve iz točke operativnog sustava, sa strane korisnika (pogled C), dostupna nam je particija diska (DATA dio), na koju možemo instalirati odatotečni sustav, po želji : NTFS, ext2/3/4, XFS, ZFS ili koji već trebamo.
Softverska RAID polja unutar Linuxa
U slučaju upotrebe softverskog RAID polja koje u Linuxu odrađuje tkzv. LVM2 odnosno “Logical Volume Manager verzije 2” nakon podizanja operativnog sustava pomoću alata koji dolaze sa LVM2 paketom, kreiramo željeno RAID polje na cijelom tvrdom disku ili željenim particijama. Nakon što se to polje inicijalizira, možemo ga normalno formatirati i dalje koristiti kao da je u pitanju normalna particija na običnom tvrdom disku.
LVM2 donosi i druge mogućnosti osim samog RAID polja, a neke od njih su :
U oba slučaja preporuča se definiranje tvrdog diska čija je jedina namjena promjena neispravnog diska, kada greška nastupi. Tvrdi disk koji namjenimo za taj zadatak naziva se engl. “Hot Spare” disk. U slučaju greške na nekom od diskova, automatiziran proces rekreiranja (engl. Rebuild) RAID polja kreće s upotrebom ovog “Hot Spare” diska, koji nakon završetka procesa postaje funkcionalan disk koji je član RAID polja u kojem je bio neispravan disk. Tada se neispravan disk može izvaditi i zamijeniti (uglavnom novi zamjenjeni disk tada postaje novi “Hot Spare”).
Danas u upotrebi imamo nekoliko RAID polja od kojih svako ima neke prednosti i neke mane.
Važno je znati da hardverski ili softverski RAID kontroleri kod inicijalizacije RAID polja, logičku površinu svih tvrdih diskova u polju dijele na male blokove podataka (ovisno o RAID kontroleru i/ili softveru). Ove male logičke cjeline postaju najmanje jedinice za zapis podataka, praktično kao što su “clusteri” tj. blokovi na datotečnom sustavu. Veličina ovih blokova podataka u RAID terminologiji se zove “engl. Stripe size”.
Ovo je važno jer svi diskovi u nekom RAID polju moraju imati istu podjelu na najmanje blokove podataka koji se mogu čitati ili pisati tj. nad njima provoditi određene logičke operacije. Najčešća veličina “Stripe size”-a je 64kB ali ju je moguće i mijenjati (ne preporuča se ukoliko ne znate zašto to radite) prije nego se krene u proces inicijalizacije RAID polja.
Standardna RAID polja su:
RAID 0 ili “Stripe” polje sastoji se od minimalno 2 diska. Ukupan kapacitet ovog polja jednak je zbroju kapaciteta svih diskova u polju. U ovo polje moguće je dodavati diskove različitih veličina ali polje će se kreirati tako, da će na svim diskovima biti iskorišten samo kapacitet od najmanjeg diska.
Ako imamo diskove od 120 GB , 320 GB i 500 GB, ukupni kapacitet će biti 120 GB x 3 = 360 GB.
Zapisivanje podataka u RAID 0 polje radi se tako, što se podaci koji se trebaju zapisati dijele na blokove (pr. 64kB) i pri tome se razlomljeni blokovi podataka pravilno zapisuju (raspoređuju) na sve diskove u polju.
Zamislimo da imamo dva diska kao na slici. Podaci se tada raspoređuju i zapisuju, pola na jedan a pola na drugi disk i to redom kako dolaze. Ako su recimo blokovi (Stripe size) od 64kB na svakom disku kao najmanje jedinice za zapisivanje i imamo 384kB podataka za zapisati, došaša se slijedeće:
Ovo polje ne daje nam nikakvu sigurnost odnosno redundanciju. Ako se pokvari bio koji disk u polju, SVI podaci će biti izgubljeni. Najveća prednost ovog polja je u njegovoj brzini i kapacitetu. Kod zapisivanja se podaci snimaju na sve diskove paralelno,a isto tako se i čitaju sa svih diskova paralelno,zbog toga je brzina RAID 0 polja najveća od svih RAID polja.
RAID 1 ili “Mirror” odnosno zrcalno polje, sastoji se od minimalno 2 diska. U ovom polju moguće je imati i više od 2 diska uz isto ograničenje za kapacitet kao za RAID 0 (kapacitet najmanjeg diska se koristi na svim diskovima). Ovo polje radi identičnu (zrcalnu) kopiju svih podataka s prvog diska na drugi (ili na više njih) i to također kako podaci dolaze, razbijanjem u blokove (engl. Stripe).
Ako imamo 2 diska u RAID 1 polju i zapisujemo pr. 192kB podataka događa se sljedeće:
Ovime imamo zapisano svih 192kB na oba diska (pogledajte sliku lijevo).
Ovo polje daje nam najveću sigurnost jer su svi podaci zapisani na prvi disk zapisani i na drugi disk (ili koliko ih već ima u polju). Brzina čitanja je veća jer se podaci mogu čitati u parovima (polovina podatka s prvog a pola s drugog diska). Na brzinu čitanja najviše utječe implementirana funkcionalnost čitanja s više diskova paralelno što ovisi o RAID kontroleru tj. softveru koji to odrađuje (lošije implementacije daju i lošije rezultate). Brzine kod zapisivanje su jednake brzini jednog diska jer se podaci moraju istovremeno zapisivati na sve diskove u polju.
Za ovo RAID polje potrebna su nam minimalno 3 tvrda diska.
Ovo je prvo specifično polje koje koristi računanje pariteta niza podataka, koje je procesorski zahtjevnije od RAID 0 i RAID 1 polja.
Ovdje do izražaja dolaze hardverski RAID kontroleri koji imaju poseban procesor (CPU) koji izračunava paritet za svaki niz podataka.
Zamislimo RAID 5 polje sa 4 tvrda diska kao na slici:
Uzmimo standardni Stripe size od 64kB. U ovom polju, sa 4 tvrda diska svaki niz podataka se lomi na 3 dijela (ukupan broj diskova -1). Zamislimo da moramo zapisati 768kB podataka. U prvom nisu se zaopisuje:
U sljedećem nizu podataka razlomljeni podaci se zapisuju na prvi (B1), drugi (B2) i četvrti disk (B3) a paritet se izračunava i zapisuje na treći disk (B P).
Kod svakog sljedećeg niza podataka, paritet se izračunava i zapisuje na neki drugi disk, tako da ako nam se pokvari bilo koji disk u polju, od preostalih diskova se pomoću paritetnih podataka mogu izračunati (restaurirati) podaci koji nedostaju.
Kako radi računanje pariteta (XOR funkcija) ?
Prvo se podsjetimo XOR logičke operacije
| Ulaz A | Ulaz B | XOR rezultat |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Dakle ako su oba ulaza jednaka, rezultat je nula (0) a ako su ulazi različiti, rezultat je jedan (1).
Vratimo se na naša 4 diska i “Stripe”-ove od 64kB. Pošto nam je 64kB preveliki broj, za razumijevanje logike rada, zamisliti ćemo da je “Stripe size” samo 4 bita.
Zamislimo da moramo zapisati sljedeći podatak : 101111100110.
Pošto se on mora razlomiti na 3 dijela po 4 bita (4. bita nam je Stripe size) to će izgledati ovako : 1011 1110 0110.
Sada svaki od ovih razlomljenih dijelova ide prema diskovima:
Podaci za disk 1 : 1011
Podaci za disk 2 : 1110
Podaci za disk 3 : 0110
Radi se XOR prvi disk: 1011 i drugi disk: 1110 = 0101
Sada se radi XOR prvog rezultata: (0101) sa trećim diskom i dobivamo paritetne podatke: 0011
Dakle na četvrti disk se zapisuje paritet : 0011
Sada imamo sljedeće zaipise u prvom nizu zapisivanja:
| Disk 1 | Disk 2 | Disk 3 | Disk 4 |
| 1011 | 1110 | 0110 | 0011 |
…i tako redom, drugi niz, pa paritet na disku 3, pa sljedeći niz s paritetom na disku 2, pa sljedeći niz s paritetom na disku 1, … … …
Zamislimo da nam se pokvario “Disk 2”.
Dakle imamo stanje:
| Disk 1 | Disk 2 | Disk 3 | Disk 4 |
| 1011 | _ _ _ _ | 0110 | 0011 |
Sada se ponovno radi XOR operacija, redom (Disk1, Disk 3, Disk 4):
Disk 1: 1011 XOR Disk 3: 0110 rezultat = 1101
Rezultat prvog XOR: 1101 XOR Disk 4: 0011 = 1110
Dobili smo rezultat odnosno sadržaj bloka tj. Stripea koji je neispravan : 1110 , što je točno.
Što se događa kada imamo neispravan disk ?
Ako nemamo Hot Spare disk ili nismo zamijenili neispravan disk, RAID kontroler će raditi XOR u radu ( u letu), za svaki niz podataka, tako da će sve raditi i dalje (djelomično usporenije) ali ako nam se istovremeno pokvari još jedan disk, izgubiti ćemo SVE podatke.
Ako smo ipak imali Hot Spare disk, RAID kontroler će početi s procesom restauriranja podataka (engl. rebuild) na Hot Spare disk. Ako nismo imali Hot Spare disk, kada izvadimo neispravni disk i ubacimo ispravni, proces restauriranja će se pokrenuti. Ovaj proces kreće uglavnom automatski, u radu. Pošto sada RAID kontroler mora preračunati podatke za svaki niz podataka na cijeloj površini svih tvrdih diskova, to može potrajati satima ili čak danima - u slučaju da imamo velike količine podataka.
Karakteristike RAID 5 polja
Brzina čitanja je prilično velika jer se podaci mogu čitati s više diskova istovremeno.
Brzina pisanja je manja od RAID 0 i RAID 1 polja jer se podaci zapisuju na više diskova paralelno ali se za svaki niz podataka mora izračunavati i paritet.
Ukupni kapacitet cijelog polja je jednak zbroju svih diskova minus jedan (-1) disk.
RAID 5 polje dozvoljava ispad samo jednog tvrdog diska iz polja i to bilo kojeg diska u polju.
Za ovo RAID polje potrebna su nam minimalno 4 tvrda diska. Ovo polje je slično RAID 5 polju s time kako se ovdje računaju dva (2) pariteta koja se razmještaju na različite tvrde diskove u polju.
Zamislimo osnovno RAID 6 polje poput ovoga na slici
Paritet se razmješta po istom principu kao kod RAID 5 polja, svaki puta se za svaki novi niz podataka pomiče na druge diskove. S razlikom što ovdje imamo dva pariteta od kojih se svaki zapisuje na svoj disk. Za prvi niz podataka, prema tome imamo (ako je Stripe size 64kB):
Dalje se sve mijenja slično kao kod RAID 5, s ciljem kako bi se za svaki slijedeći niz podataka, pariteti zapisivali na druge diskove.
Ovo polje diskova stoga omogućava ispad do dva bilo koja tvrda diska u polju.
Ukupni kapacitet polja jednak je zbroju kapaciteta svih diskova minus kapacitet dva diska (-2). Brzina čitanja je slična ili nešto sporija kao kod RAID 5 polja (ovisno o implementaciji). Brzina pisanja također ovisi o implementaciji (hardver [i to koji ?] / softver) a također je slična ili lošija od RAID 5 zbog dvostrukog izračunavanja pariteta.
Često se koriste i kombinacije RAID 1,5 i 6 sa RAID 0 poljem. Ovakva polja nazivamo ugnježđenim RAID poljima (engl. Nested) ili hibridnim RAID poljima.
Ovo RAID polje često se naziva i RAID 01. Ovo polje (engl. Mirror of Stripes) nastaje kreiranjem dva ili više RAID 0 polja na dva ili više diskova koja se stavljaju unutar većeg RAID 1 polja. Konačno RAID 1 polje se prijavljuje kao logički disk BIOSu matične ploče računala.
Kapacitet je jednak polovici kapaciteta svih diskova. Ovo polje, otporno je na ispad cijelog jednog RAID 0 polja (pošto RAID 0 ispada uslijed kvara samo jednog diska), a RAID1 (engl. Mirror) zrcaljenje štiti s identičnom kopijom, koja se nalazi na drugom RAID 0 polju. U slučaju ispada dva diska iz različitih RAID 0 polja, cijelo RAID 01 polje se ruši i gube se SVI podaci. Proširivanje ovog polja (kapacitetom) je nepraktično (i skoro neizvedivo u praksi) jer zahtjeva manipulacije na svim RAID 0 poljima.
Brzina čitanja je prilično velika pošto se podaci mogu čitati sa svih diskova istovremeno (dio podataka s a svakog diska). Brzina pisanja je također prilično velika pošto se podaci mogu čitati sa svih diskova istovremeno (dio podataka sa svakog diska).
Za rad ovog polja potrebno je minimalno 4 diska, kao što je vidljivo na slici
Ovo RAID polje često se naziva i RAID 10. Za rad ovog polja potrebno je minimalno 4 diska Ovo polje je slično RAID 01 ali prema logici rada, potpuno obrnuto. Po dva diska se dodaju u RAID 1 polje (engl. Mirror) odnosno zrcalno se kopiraju jedan na drugi.
Druga dva diska također, u svoje RAID 1 polje, a isto tako i treća, četvrta , peta ili x-ta dva diska. Potom se kreira RAID 0 (engl. Stripe) koji povezuje sve zrcaljene parove diskova u jedan veliki logički disk.
Ispadom (kvarom) od po jednog diska iz svakog RAID 1 polja, nemamo problem. Jedino ispadom oba diska unutar pojedinog RAID1 polja gubimo sve podatke. Dakle ovo polje, otporno je na ispad bilo kojeg diska unutar bilo kojeg RAID1 (engl. Mirror) zrcalnog para diskova, na bilo kojem RAID 1 paru diskova.
Kapacitet je jednak polovici kapaciteta svih diskova. Brzina čitanja je prilično velika pošto se podaci mogu čitati sa svih diskova istovremeno (dio podataka sa svakog diska). Brzina pisanja je također prilično velika pošto se podaci mogu čitati sa svih diskova istovremeno (isto dio podataka sa svakog diska). Dodatna prednost je i u tome što neki RAID kontroleri omogućavaju proširenje kapaciteta vršnog RAID 0 polja (koje je vidljivo kao logički disk) dodavanjem novog para RAID 1 (engl. Mirror) diskova.
Primjer rada RAID 10 polja je vidljiv na slici
Kako se zapisuju podaci ?. Ako imamo 512kB podataka (uz standardni stripe size od 64 kB) koji se trebaju zapisati, događa se slijedeće:
Osim navedenih ugniježđenih RAID polja, moguća su i polja RAID 100, RAID 50 i RAID 60
Softversko RAID polje u Linuxu odrađuje Tzv. LVM2 odnosno “Logical Volume Manager verzije 2”.
Nakon podizanja operativnog sustava pomoću alata koji dolaze sa LVM2 paketom, kreiramo željeno RAID polje na particijama. Nakon što se to polje inicijalizira, možemo ga normalno formatirati i dalje koristiti kao da je u pitanju normalna particija na običnom tvrdom disku (ili neko RAID polje na hardverskom RAID kontroleru).
LVM2 (Logical volume management) v.2 je kao što i samo ime kaže logički management za pohranu podataka.
Pomoću LVM-a “logičke” LVM particije se mogu rasprostirati preko više fizičkih tvrdih diskova te se mogu vrlo lako proširivati prema potrebi.
Prema LVM-u “Physical Volume” (PV) se mapira na particiju fizičkog diska. Prema tome moguće je na jednom tvrdom disku imati jednu ili više PV-a.
Logička “Volume” grupa (VG) (Volume Group) se nalazi iznad PV-a kao logički “Volume” ili logički disk, koji predstavlja logičko polje dostupnih diskova (ekvivalent fizičkim tvrdim diskovima u hardverskom RAID polju).
Iznad Volume Group-e (VG) se nalazi “Logical Volume”-a na koji se primjenjuje kreiranje nekog od ekvivalenata RAID polja.
Nadalje, svaki “Logical Volume” (može ih biti jedan ili više) je potrebno formatirati s nekim datotečnim sustavom (ext3/4, xfs ili dr.)
Logička shema LVM-a je vidljiva na slici:
Krenimo s kreiranjem LVM2 polja.
Dodati ćemo dva tvrda diska (ili dva diska unutar naše virtualke).
Diskovi će biti vidljivi kao :
1. Potrebno je kreirati po jednu particiju na svakom disku. Za kreiranje particija pogledajte prethodno poglavlje.
Razlika je u tome što ćemo za tip (engl. Type) particije odabrati LVM (8e).
Dakle kreirajmo jednu primarnu particiju na disku /dev/sdb i jednu na disku /dev/sdc.
Sada smo dobili dvije particije (nas vakom disku po jednu):
Slika prikazuje izgled kreirane particije na disku /dev/sdb
2.Sada moramo kreirati fizički uređaj (engl. Physical Storage Device) koji će LVM(2) moći koristiti i to za svaku particiju od koje ćemo kreirati LVM polje.
pvcreate /dev/sdb1 /dev/sdc1 Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdc1" successfully created
Sada možemo provjeriti da li su fizički LVM uređaji (engl. Physical Volume) kreirani:
pvscan
PV /dev/sdb1 lvm2 [512 MB]
PV /dev/sdc1 lvm2 [512 MB]
Total: 2 [1 GB] / in use: 0 [0 ] / in no VG: 2 [1 GB]
Za više informacija o PV-ovima, LVM-a, možemo vidjeti s naredbom:
pvdisplay
Slika prikazuje ispis naredbe pvdisplay:
3. Kreiranje LVM grupe (engl. Volume Group). “Volume Group”-a je polje diskova unutar kojeg se nalazi minimalno jedan ili više fizičkih LVM uređaja (engl. Physical Volume). Ovo još uvijek nije ekvivalent RAID polju već više kao spremište diskova, dostupnih kasnije za kreiranje ekvivalenta RAID polju (što će biti sljedeća točka). Sada ćemo kreirati “Volume Group” u koju ćemo dodati obije particije koje smo pripremili
Kreirajmo Volume grupu imena “VolGroup01” u koju ćemo dodati particije : /dev/sdb1 i /dev/sdc1:
vgcreate VolGroup01 /dev/sdb1 /dev/sdc1 Volume group "VolGroup01" successfully created
4. Sada kada imamo Volume grupu (VG), od nje možemo kreirati neko od ekvivalenta RAID poljima, koje se zove “Logical Volume”.
Mogući izbor je :
Moguće je i kreirati ekvivalente klasičnih RAID polja.
Mi ćemo se odlučiti za RAID1 pošto imamo dvije particije od 500MB. Inicijalno ćemo iskoristiti samo 400MB. Logical Volume grupu ćemo nazvati RAID
lvcreate --type raid1 -L400M -n RAID VolGroup01 Logical volume "RAID"created
Sada smo kreirali Linearni “Volume”.
Umjesto njega mogli smo kreirati i “Stripe” model (ekvivalent RAID0). Kod njega je potrebno korištenjem prekidača “-i” definirati na koliko diskova se “Stripe” proteže (kod nas na dva):
lvcreate -i2 -L400M -n RAID VolGroup01 Logical volume "RAID"created
Pogledajmo što smo dobili:
lvscan ACTIVE `/dev/VolGroup01/RAID` [400.00 MiB] inherit
lvdisplay
5. Za formatiranje LVM “RAID” polja diskova je potreban sličan postupak kao da formatiramo bilo koju particiju na bilo kojem “normalnom” disku. Formatiranje ćemo odraditi sa ext4 Linux file sustavom.
mkfs.ext4 /dev/VolGroup01/RAID ... .... ... ... ... ....
Nakon formatiranja možemo i ručno ili automatski mount-ati ovu particiju, pr. u /mnt/LVM direktorij:
mkdir /mnt/LVM mount /dev/VolGroup01/RAID /mnt/LVM
6. Ako smo se odlučili proširiti kapacitet sa 400MB na recimo 450MB ili želimo dodati još jedan disk (particiju) te proširiti kapacitet na njega imamo 2 izbora:
6.1 Proširenje kapaciteta na postojećim diskovima (jer nam je ostalo mjesta koje smo ipak odlućili iskoristiti):
Želimo proširiti kapacitet sa 400MB na 450MB jer nam još toliko treba a toliko i imamo slobodno:
A.
lvextend -L+50 /dev/VolGroup01/RAID
Sada moramo proširiti i File system da prepozna novu veličinu:
B.
resize2fs /dev/VolGroup01/RAID
6.2 Proširenje kapaciteta dodavanjem novog diska :
Proširivanje kapaciteta dodavanjem novog diska moguća je ali potrebno je paziti koje RAID polje smo prethodno kreirali. Primjerice ako imamo RAID1 polje s dva diska, bilo bi preporučljivo dodati još dva diska u novo RAID1 polje te proširiti postojeće polje.Ovdje je bitno shvatiti da proširenje radi bez brisanja postojećih podataka.
Pr. Dodajemo 1 novi disk (/dev/sdd) i kreiramo LVM tip particije (/dev/sdd1) te ga dodajemo u postojeću “Volume Group”-u :
vgextend VolGroup01 /dev/sdd1
Sada ponovno moramo/možemo raditi klasične operacije proširenja iz prethodnog primjera: A,B
BRISANJE Cijelog “RAID” polja
OPREZ (svi podatci će biti izgubljeni): Brisanje “Logical Volume” grupe tj. pratično brisanje cijelog RAID polja(u našem slučaju “VolGroup01” koji pokazuje na RAID polje imena “RAID”):
lvremove VolGroup01
Prije nego krenemo s detaljnim upoznavanjem diskovnog podsustava, prvo pogledajte gdje je on smješten u samom kernelu - poglavlje Kernel.
Sada se možemo detaljnije upoznati s Linuxovim diskovnim ulazno/izlaznim (I/O) sustavom.
Što se događa u kojem sloju diskovnog I/O sustava (VFS):
Standardni scenarij
Što se događa na Page cache sloju ?
Page cache ubrzava pristup datotekama:
sync (ako nekoga baš zanima).
Ako želimo vidjeti koliko podataka je označeno kao dirty pages, to možemo pregledavanjem posebne datoteke /proc/meminfo, u koju se stalno osvježavaju informacije o RAM memoriji:
cat /proc/meminfo | grep Dirty Dirty : 10154 kB
Ovo stanje se stalno mijenja, kako se podaci iz ove cache memorije prosljeđuju prema nižim slojevima - iako se sadržaj u cache memoriji i dalje čuva zbog ubrzavanja operacija čitanja ili pisanja.
Kako smo rekli, podaci koji su privremeno pohranjeni u page cache a još nisu snimljeni na disk se označavaju kao dirty. Međutim, svako malo (obično svakih 30 sekundi), poseban kernel proces (zvan kernel thread), pregledava koje su sve stranice (pages) u page cache memoriji označene kao dirty te ih on prosljeđuje na zapisivanje prema disku. Ovaj poseban proces se zove flush i na novijim Linux kernelima (2.6.32 ili novijim) se pokreće po jedan ovakav proces, za svaki fizički disk.
Pogledajmo poslužitelj koji ima dva fizička diska (/dev/sda i /dev/sdb):
ls -al /dev/sda brw-rw---T 1 root disk 8, 0 Dec 1 21:21 /dev/sda
i
ls -al /dev/sdb brw-rw---T 1 root disk 8, 16 Dec 1 21:21 /dev/sdb
Vidimo kako prvi disk (sda) ima oznaku 8,0 - to su identifikatori diska, dok drugi disk (sdb) ima identifikatore: 8,0.
Sada pronađimo flush procese (ps -eaf) na sustavu:
ps -eaf | grep -i flush root 2703 2 0 Nov28 ? 00:00:00 [flush-8:0] root 2704 2 0 Nov28 ? 00:00:00 [flush-8:16]
Vidimo kako za svaki identifikator diska (8:0) i (8:16) postoji pokrenut po jedan Linux kernel proces (thread) imena flush, s čime smo dokazali teoriju. Za više detalja o uređajima, pogledajte poglavlje Uređaji (devices) detaljnije.
Linux veličinu Page cache memorije konstantno optimizira, odnosno povećava ili smanjuje, ovisno da li kernel ili aplikacije traže više ili manje RAM memorije. Dakle cilj je da page cache dio RAM memorije, bude što veći, kako bi se što više toga držalo u njemu te samim time ubrzalo sve operacije čitanja ili zapisivanja na fizički disk.
Naredbom kojom inače možemo vidjeti zauzeće RAM memorije, možemo ugrubo vidjeti i koliko se RAM memorije koristi kao page cache. Naredba o kojoj govorimo je free (koristiti ćemo prekidač -m kako bi vidjeli zauzeće izraženo u MB):
free -m
total used free shared buffers cached
Mem: 96669 23394 73275 0 956 3070
-/+ buffers/cache: 19367 77301
Swap: 89343 0 89343
Navedni poslužitelj na kojemu gledamo zauzeće RAM memorije, ukupno ima 96GB RAM memorije, od koje se vidi kako se koristi 19367 MB (19 GB) kao cache. Ovo je samo okvirna vrijednost - pogledajte poglavlje Sustav virtualne memorije - VM Slabs.
Manje standardan scenarij
Samo kod SCSI i SATA diskva s podrškom za NCQ (Native Command Queuing), moguće je dodatno razgraničiti dva slučaja sinkronog zapisivanja. Prvi je slučaj kada disk čim primi podatke u svoju cache memoriju, odmah odgovori, kako su podaci zapisani, te aplikacija može nastavit sa slanjem drugog bloka podataka za zapisivanje. Druga (sporija) metoda je slučaj kada disk tek, kada je iz svoje cache memorije stvarno i snimio podatke na svoju površinu, šalje aplikaciji poruku da šalje slijedeći blok podataka za zapisivanje (ovo je sada standardno ponašanje). Postoji i novija implementacija koja se zove FUA (Force Unit Access) i koja ima nekoliko opcija u kojima se govori koji dijelovi iz cache memorije se moraju hitno zapisati na površinu diska a koji ne. Ova opcija nije standardno uključena.
Poseban scenarij
U najekstremnijim ili posebnim slučajevima, moguće je direktno pristupiti na blok sloj (Block Layer), bez datotečnog sustava. Ovdje su moguća dva scenarija :
Nakon ovoh slojeva dolazimo do IO Schedulera, koji ima nekoliko algoritama od kojih može samo jedan biti aktivan odnosno odabran za dohvaćanje i zapisivanje podataka. Dodatno, postoje posebne baze podataka, koje opcionalno mogu također pristupati određenim particijama ili diskovima na ovaj način, te one same mogu kreirati svoj, posebni datotečni sustav, kojemu ponovno žele pristupati direktno, bez Linux slojeva, koji se koriste za normalne datotečne sustave.
Što se događa na Virtual block sloju ?
Ovo je opcionalan sloj, ako koristimo neko od softverskih RAID riješenja, poput:
Na ovom opcionalnom sloju, kreiraju se logička RAID polja, pa se tako sve mogućnosti logičkog (softverskog RAID) polja, ako primjerice koristimo Linux LVM2, događaju upravo ovdje. Ako ne koristimo neko logičko RAID polje, ovaj sloj se ne koristi. Ovaj sloj se dalje spaja na niže slojeve diskovnog podsustava.
Ako pak koristimo primjerice LVM2, tada više informacije o tom polju možemo dobiti s naredbom: dmsetup. Pogledajmo i osnovni primjer, u kojemu ćemo izlistati sve Volume grupe, koje smo kreirali s LVM2 volume managerom
dmsetup info Name: VolGroup-lv_swap State: ACTIVE Read Ahead: 256 Tables present: LIVE Open count: 1 Event number: 0 Major, minor: 253, 1 Number of targets: 1 UUID: LVM-FR9uenpE4f0RBorHqsT98N1pVYm1uuR32tcb4YGWTUk9ngqrEvpGfb8i3G1LivgS Name: VolGroup-lv_root State: ACTIVE Read Ahead: 256 Tables present: LIVE Open count: 1 Event number: 0 Major, minor: 253, 0 Number of targets: 1 UUID: LVM-FR9uenpE4f0RBorHqsT98N1pVYm1uuR3YCgjAXHpQs1IB772TvlbSkazIkFRuPO2
Za sada su nam vidljive dvije osnovne stvari:
Za više detalja o Linux LVM2 pogledajte poglavlje: LVM2.
Dolazimo do nižih slojeva
cfq: U većini slučajeva se koristi Completely Fair Queuing odnodno cfq scheduler koji daje dobar odnos propusnosti (throughput) i brzine odziva (latency). CFQ smješta sinkrone zahtjeve poslane od svakog procesa u red (queue). To se odrađuje za svaki proces. Tada se određuju vremenski okviri za svaki procesni niz (process queue) u kojima se odrađuje jedan po jedan procesni niz prema disku. Duljina vremena u kojem će se odrađivati pojedini procesni niz te broj upita unutar tog niza ovisi o postavljenom prioritetu za taj (svaki) niz. S druge strane svi asinkroni upiti za sve procese se spajaju zajedno u samo nekoliko nizovai to jedan niz za jedan prioritet. cfq IO Scheduler je najuniverzalniji te se često koristi kao standardan u mnogim distribucijama linuxa. Osim toga on ima neke optimizacije za rad s SSD diskovima.Deadline scheduler ima dobro vrijeme odziva odnosno latenciju ali ima veću propusnost u odnosu nqa CFQ. Deadline scheduler garantira pokretanje procesa obrade zahtjeva unutar određenih vremenskih okvira. To se postiže tako što se svim IO operacijama koje dolaze do njega postavljaju vremenski okviri unutar kojih se moraju obraditi (engl. time deadline ili expiration time). Zapravo se podaci stalno popunjavaju u oba dva para nizova: par nizova za sortitranje i par nizova : jedan za čitanje i jedan za pisanje. Relativno jednostavan mehanizam ubacuje zahtjeve (niz podataka) u sorting nizove i u Deadline nizove (oba para imaju niz za čitanje i niz za pisanje). U prvi par nizova (sorting niz) se sortiraju podaci prema sektorima a u drugi prema deadline vremenima. Potom io scheduler algoritam određuje koji blokovi podataka će se uzimati iz kojeg od parova nizova.Dakle prije prelaska na slijedeći zahtjev određuje se koji niz koristiti. Nizovi za čitanje (engl. read queue) imaju uvijek viši prioritet, jer procesi (na višoj razini OS-a) ulaze u fazu čekanja na operaciju čitanja (engl. read), dok se ona se izvrši. Deadline I/O scheduler pokazuje bolje rezultate (naročito za operacije čitanja) od CFQ I/O schedulera za određene višenitne ( multithreaded ) programe i također za neke baze podataka. Noop scheduler stavlja sve zahtjeve u jednostavan FIFO (First In First Out) spremnik. Ovaj scheduler se koristi kada se zna da host neće mijenjati tok podataka koji će se zapisivati na određene sektore prema disku. Dakle host (OS) nije svjestan kako će se podaci zapravo zapisati na disk već to prepušta nekoj drugoj komponenti poput hardverskog RAID kontrolera, koji se brine o tome na koji disk i na koju poziciju će zapisivati podatke na diskove u njegovom RAID polju.Anticipatory scheduler implementira spajanje zahtjeva prema I/O sustavu te optimizira pristup disku, smanjivanjem fizičkih pomicanja glave diska (ova funkcionalnost nema utjecaja kod SSD diskova). On riješava i probleme kada imamo puno zahtjeva za zapisivanjem između kojih imamo nekoliko zahtjeva za čitanjem. Odnosno on riješava problem kada se između većeg broja zahtjeva za zapisivanjem mora čekati na operacije čitanja. Dakle on nakon svakog zahtjeva za čitanjem ne prebacuje odmah na sljedeći zahtjev koji bi bio zapisivanje, već čeka jedan mali vremenski okvir za drugim zahtjevom za čitanje, pa se tek onda prebacuje na zahtjeve za zapisivanje. Naziv je došao od rada u kojem on očekuje (engl. anticipating) sinkrone zahtjeve za čitanje na gore opisan način. Anticipatory scheduler nije dobar odabir za Storage uređaje (NAS/SAN) ali je ponekada vrlo dobar odabir za neke baze podataka (koje u pravilu imaju više zapisivanja nego čitanja). Ovaj scheduler se ne koristi u kernelima 2.6.33 i novijima jer su njegove dobre funkcionalnosti ugrađene kao opcija koju treba optimizirati unutar cfq schedulera. Ova opcija unutar cfq scehdulera je slice_idle.
Na razini Block Device Drivera nalazi se nekoliko slojeva. Pogledajmo i sliku samo donjeg segmenta diskovnog podsustava:
Na slici je vidljivo, što se događa na blok sloju komunikacije. Kako bi vam bilo razumljivije, pogledajte i poglavlje Uređaji (devices) detaljnije.
Naime ovdje je vidljiva veza između uređaja (posevnih datoteka u /dev) direktoriju, koje indirektno predstavljaju (disk) uređaje, preko upravljačkih programa. Za SATA/SAS/SCSI diskove, ova poveznica je malo složenije jer se sastoji od dva sloja (gledano od gore):
/dev/sda primjerice)sd posebnog upravljačkog programa, koji se spaja na konkretan upravljački program ispod njega (pr. ata_piix) koji konačno komunicira s disk kontrolerom i samim diskom.Za sve navedene slojeve diskovnog I/O sustava, postoji cijeli niz opcija i parametara koje je moguće konfigurirati (optimizirati). Važno je dobro proučiti i testirati optimizacije koje ste napravili jer loš odabir parametara ili opcija može usporiti diskovni sustav ili ga učiniti nepouzdanim.
U asinkronom načinu zapisivanja, zahtjev za zapisivanjem se normalno šalje diskovnom I/O sustavu ali naša aplikacija/proces, čim pošalje zahtjev za zapisivanjem, može nastaviti s radom i s novim zahtjevima. Potom kasnije može provjeriti status procesa zapisivanja. Kod ovog načina rada moguće je poslati više paralelnih I/O zahtjeva te kasnije provjeriti njihov status. Na ovaj način se diskovnom I/O sustavu daje mogućnost da on paralelizira više I/O operacija, kada je to moguće. Ovo je normalan način rada.
U sinkronom I/O procesu, što je dodatna metoda (opcija) zapisivanja na disk, zahtjev za zapisivanje se prosljeđuje diskovnom I/O sustavu, potom procedura zapisivanja zablokira dalji rad aplikacija, sve dok diskovni I/O sustav ne vrati aplikaciji potvrdu da je zapisivanje prošlo sve slojeve diskovnog podsustava te da je zapisivanje završilo na površini diska. Tada aplikacija može nastaviti dalje s novim operacijama zapisivanja.
Zamislimo dva scenarija u kojima trebamo zapisati četiri bloka podataka na disk:
1. Sinkroni I/O rad : šaljemo zahtjev prema diskovnom I/O sustavu za zapisivanje prvog bloka, potom se čeka potvrda da je prvi blok zapisan. Šalje se zahtjev za drugi blok, čeka se potvrda da je i on zapisan, …. i tako sve do zadnjeg bloka podataka. Dakle procedura je zahtjev za zapisivanje ta čekanje na potvrdu da je proces završio, tek potom može ići sljedeći zahtjev. Vrijeme odziva za sva četiri zahtjeva je jednako zbroju svih vremena od svih odrađenih zahtjeva.
2. Asinkroni I/O rad : šaljemo sva četiri bloka na zapisivanje, paralelno, potom čekamo potvrdu da su sva četiri bloka zapisana. Pošto je diskovni I/O sustav zaprimio četiri zahtjeva paralelno, on će ih i pokušati izvršiti paralelno. Vrijeme odziva je jednako vremenu za pojedini (od primjerice ta četiri) zahtjev koji je najduže trajao. Tada dobivamo sve četiri potvrde istovremeno i nastavljamo (proces/aplikacija) s radom.
Kod obije metode rada, u ekstremnim slučajevima, kod vrlo velikih opterećenja diskovnog podsustava, najprije kod sinkronog zapisivanja jer ono pristupa disku što direktnije a potom i kod asinkronog, može doći do zagušenja diskovnog podsustava, što je vidljivo kao I/O Wait stanje (iowait statistika). Za detalje pogledajte poglavlje: Praćenje performansi I/O sustava
Svaka datoteka predstavlja jedan kernel objekt koji je zadužen za određenu opciju ili parametar. Neki se mogu samo pročitati (koriste se za statistike) a drugi se mogu i mijenjati i služe za optimizaciju sustava.
Sve opcije i informacije dostupne za “Filesystem” sloj se nalaze unutar strukture direktorija /proc/sys/fs/.
Pogledajmo sadržaj ovog direktorija:
ls -F /proc/sys/fs/ aio-max-nr dir-notify-enable fsync-enable inotify/ nfs/ overflowuid relatime_interval ve-xattr-policy aio-nr epoll/ fuse-ve-odirect lease-break-time nr_open pramcache/ suid_dumpable xfs/ binfmt_misc/ file-max inode-nr leases-enable odirect_enable pramcache_ploop_nosync ve-area-access-check dentry-state file-nr inode-state mqueue/ overflowgid quota/ ve-mount-nr
Objasniti ćemo nekoliko opcija i informacija dostupnih na ovom sloju.
| Opcija/parametar/datoteka | Opis |
| aio-max-nr | Ovo je maksimalan broj dozvoljenih paralelnih I/O operacija. Uglavnom je postavljen 65536. Odnosi se na Asinkrone I/O zahtjeve. Za neke namjene (pr neke baze podataka) ovaj broj je potrebno povečati. |
| aio-nr | Informacija o tome koliko je trenutno aktivnih asinkronih I/O operacija |
| dentry-state | Daje nam informacije o cache memoriji za direktorije. Sastoji se od 6 podataka u nizu. Prvi bro joznačava ukupan broj unosa direktorija koji su u “cache” memoriji. Drugi broj pokazuje broj neiskorištenih unosa u “cache” memoriji. Treći broj govori koliko sekundi je prošlo između zadnjeg unosa koji je oslobođen i kada je zauzet novi unos. Četvrti govori o trenutnom broju unosa koji je sustav zatražio, Zadnja tri broj se trenutno ne koriste |
| /quota/allocated_dquots | Prikazuje broj alociranih disk kvota (quota) odnosno ograničenja (može ih biti više zbog toga se broji njihov broj). |
| /quota/free_dquots | Broj slobodnih disk kvota |
| file-max | Označava maksimalan broj “File Handle”-ova dostupnih za cijeli operacijski sustav. U slučajevima da naš OS otvara veliki broj datoteka, potrebno je povečati ovaj broj. Poruke tipa “Running out of file handles” ukazuju na ovaj problem. Za detalje pročitajte poglavlje o file deskriptorima jer postoji dodatno ogranićenje na sloju iznad ovoga (ulimit -n će pokazati koliko je file descriptora dostupno za programe). |
| file-nr | Prikazuje broj “File descriptor”-a u tri broja. Prvi broj je broj trenutno upotrebljnih, drugi je broj alociranih ali neiskorištenih i treći broj je ukupan broj dostupnih. |
| … | … |
Za više informacija možete pogledati: https://www.kernel.org/doc/Documentation/sysctl/fs.txt
Definicija parametara scheduler-a se nalazi definirana u datotekama unutar direktorija /sys/block/*/.
Svaka datoteka predstavlja jedan kernel objekt koji je zadužen za određenu opciju ili parametar.
Opcije ili parametri su specifični za pojedini disk. Dakle datoteke unutar direktorija /sys/block/sda/ su zadužene za disk /dev/sda odnosno /sys/block/sdb/ za disk /dev/sdb i tako dalje.
Pogledajmo što je sve moguće optimizirati na “Generic Block Device” sloju , za recimo disk /dev/sdb.
Pogledajmo sadržaj direktorija :/sys/block/sdb/
ls -F /sys/block/sdb/ alignment_offset capability device@ ext_range inflight queue/ removable sdb1/ slaves/ subsystem@ uevent bdi@ dev discard_alignment holders/ power/ range ro size stat trace/ ve_device_add
Vidimo da ovdje postoje i dodatni direktoriji koji predstvljaju logičku cjelinu.Unutar tih direktorija se nalaze datoteke u kojima su opcije specifične za tu logičku cjelinu.
Tako je recimo unitar poddirektija queue - cijela putanja /sys/block/sdb/queue/ vidljiv niz opcija (datoteka). Ovdje se nalaze opcije koje spadaju pod “General Block I/O” :
ls -F /sys/block/sdb/queue add_random discard_zeroes_data iostats max_sectors_kb minimum_io_size optimal_io_size rotational unpriv_sgio discard_granularity hw_sector_size logical_block_size max_segments nomerges physical_block_size rq_affinity discard_max_bytes iosched/ max_hw_sectors_kb max_segment_size nr_requests read_ahead_kb scheduler
Objasniti ćemo nekoliko osnovnih opcija/parametara na ovom sloju:
| Datoteka/opcija | Značenje/opis |
| rq_affinity | “IO affinity” osigurava procesiranje svih I/O zahtjeva za (ovaj) disk da ih odrađuje isti CPU koji je inicira I/O zahtjev. Ovime se osigurava to, što se obrada I/O operacija ne prebacuje sa CPUa na CPU, što može znatno usporiti obradu. Obično je ova opcija standardno uključena. |
| max_hw_sectors_kb | Maksimalna veličina pojedinog (svakog) I/O zahtjeva (block size) u kilobajtima |
| nr_requests | Koliko I/O zahtjeva ja moguće alocirati na blok sloju za operacije čitanja ili zapisivanja. Ukupna stvarna veličina je dvostruko veća od odabrane (read+write) |
| optimal_io_size | Ako nije postavljeno na 0 sam “storage” uređaj može postaviti svoju preporučenu vrijednost. |
| read_ahead_kb | Definirano kao veličina memorije u kilobajtima kojue će kernel alocirati kao predmemoriju kod sekvencijalnog čitanja s diska. 128KB je standardna vrijednost. Ako se koristi softverski RAID poput LVM2 ili sko imate potrebe za čitanjem večih količina sekvencijalnih (podataka u nizu) podataka tada se povećanje ovog “buffer”-a može isplatiti. |
| rotational | Ako je vrijednost “1” to znači da je uređaj standardni tvrdi disk (“rotacijski” uređaj) ako je vrijednost “0” tada se vjerojatno radi o SSD disku. Ova opcija se koristi za provjeru tipa uređaja. |
| … | … |
Više podataka o ostalim opcijama možete vidjeti na :
1. https://www.kernel.org/doc/Documentation/block/queue-sysfs.txt
2. https://www.kernel.org/doc/Documentation/block/
Unutar direktorija /sys/block/sdb/queue/iosched/ nalaze se datoteke (opcije) za optimizaciju samog I/O schedulera. Datoteke koje će se pojaviti unutar ovog poddirektorija ovise o tome koji smo IO scheduler odabrali. Pogledajmo što je dostupno (u našem slučaju je u upotrebi deadline scheduler):
ls -F /sys/block/sdb/queue/iosched/ fifo_batch front_merges read_expire write_expire writes_starved
Pogledajmo osnovne opcije specifične za neke I/O schedulere:
CFQ
| Datoteka/opcija | Značenje/opis |
| fifo_expire_async | Broj milisekundi koje asinkroni I/O zahtjev može/smije ostati neposlužen (neobrađen) |
| fifo_expire_sync | Broj milisekundi koje sinkroni I/O zahtjev može/smije ostati neposlužen (neobrađen) |
| low_latency | 0 - isključeno: Latencija se ignorira, svaki proces za I/O ima puni vremenski okvir za obradu. 1 - uključeno: Prioritet je pravila raspodjela zahtjeva, ispred propusnosti. Forsira se maksimalno “wait time” od 300 milisekundi za svaki I/O proces |
| quantum | Broj I/O zahtjeva poslanih na uređaj (disk) u jedinici vremena (odjednom). Limitira se “queue depth”. Može uzrokovati probleme s “običnim” diskovima ali poboljšati performanse u slučaju upotrebe RAID kontrolea s većom količinom “cache” RAM memorije |
| slice_idle | Vremenski okvir u milisekundama unutar kojih CFQ smije čekati na sljedeći I/O zahtjev, unutar jednog niza (queue) prije nego smije preći na obradu na drugi niz (queue) |
| … | … |
Više detalja je dostupno na : https://www.kernel.org/doc/Documentation/block/cfq-iosched.txt
DEADLINE
| Datoteka/opcija | Značenje/opis |
| fifo_batch | Broj I/O operacija koje se mogu izvršiti u jednom koraku (engl. batch). Niže vrijednosti mogu smanjiti latenciju. Više vrijednosti mogu povečati propusnost ali uz povečanje latencije. |
| read_expire | Vremenski okvir u milisekundama unutar kojeg se svaka operacija čitanja mora odraditi (standardno je 500 ms.) |
| write_expire | Vremenski okvir u milisekundama unutar kojeg se svaka operacije zapisivanja mora odraditi (standardno je 5000 ms.) |
| writes_starved | Broj koraka čitanja (read batch) koji se može procesirati prije nego dođu na red koraci za zapisivanje (standardno su dvije operacije čitanja). Povečavanjem se daje još veći prioritet čitanju u odnosu na zapisivanje. |
| … | … |
Više detalja je dostupno na : https://www.kernel.org/doc/Documentation/block/deadline-iosched.txt
1. Kako za disk /dev/sda provjeriti koji “IO scheduler” koristi
cat /sys/block/sda/queue/scheduler noop anticipatory deadline [cfq]
Vidimo kako se koristi [cfq]
2. Promijenimo “IO scheduler” iz cfq u deadline , za disk /dev/sdb, na kojemu imamo SQL bazu podataka, za koju smo na osnovu pokrenutih testova dobili bolje rezultate s deadline. Ova promijena iz primjera neće biti trajna (traje do prvog restarta računala). Trajnu konfiguraciju nećemo objašnjavati jer izlazi iz okvira osnova.
echo deadline > /sys/block/sdb/queue/scheduler
3. Kako provjeriti statistike pristupa disku /dev/sda ?
Prva metoda : sadržaj datoteke /sys/block/sda/stat - ovo je metoda za statistiku pojedinog diska.
Druga metoda : sadržaj datoteke /proc/diskstats - ovo je metoda za statistiku svih diskova.
cat /sys/block/sda/stat 200441 1457 7037314 1023095 22728 71 352178 24031 0 113482 1047037
Statistike se zapisuju u realnom vremenu i podjeljene su u 11 dijelova.
Opis segmenata statistike :
read I/Os requests Ukupan broj uspješnih I/O operacija čitanjaread merges requests Ukupan broj I/O operacija čitanja koje su zbog optimizacije uspješno odrađene kroz jedan zahtjev. Uvo se događa u slučajevima kad je dvije operacije čitanja moguće odraditi u jednom koraku (pr. kada se u dva koraka moraju čitati susjedni sektori a moguće ih je spojiti u jedan zahtjev za čitanje)read sectors sectors Ukupan broj sektora koji su uspješno pročitani.read ticks milliseconds Vrijeme potrebno kako bi se pročitao pojedini sektor. Ovo vrijeme je kumulativno (povećava se za svaki pročitani sektor)write I/Os requests Ukupan broj uspješnih I/O operacija pisanja. write merges requests Ukupan broj I/O operacija pisanja koje su zbog optimizacije uspješno odrađene kroz jedan zahtjev. Uvo se događa u slučajevima kad je dvije operacije zapisivanja moguće odraditi u jednom koraku (isto kao i točka 2 samo za zapisivanje)write sectors Ukupan broj sektora koji su uspješno zapisani.write ticks Vrijeme (u ms) potrebno kako bi se zapisao pojedini sektor. Ovo vrijeme je kumulativno (povećava se za svaki zapisani sektor)in_flight Trenutni broj I/O operacija u sekundi (tkzv. IOPS )io_ticks Vrijeme (u ms) potrebno za I/O operacije (vrijeme je isto kumulativno).time_in_queue Vrijeme (u ms) potrebno za sve I/O operacije
4. Permanentna konfiguracija disk schedulera
Za permanentnu konfiguraciju disk schedulera pogledajte poglavlje Udev rules.
Za dodatne detalje pogledajte :
1. http://kernel.dk/blk-mq.pdf
„Sparse files“ (Sparse iz Engleskog - rijetke ili prorijeđene ) su datoteke u osnovi baš kao i bilo koje druge datoteke osim što blokovi podataka (koji se zapravo zapisuju na disk) a koji sadrže samo nule (tj, ništa) nisu zapravo pohranjeni na disku. To znači da možete imati naizgled 10 GB datoteku – ali od tih 10 GB ako stvarnih podataka ima samo 1 GB – na disk će se zapisati samo tih 1 GB datoteka.
Pogledajmo sliku takve datoteke:
To može biti osobito korisno u situacijama u kojima se puni kapacitet datoteke možda nikada u potpunosti neće koristiti. Jedna od takvih situacija bi bila virtualizacija odnosno diskovi virtualnih strojeva. Ako virtualni stroj nikada ne popunjava disk u potpunosti, to znači da određena količina diska nikada neće imati ništa osim nula u njemu – to u konačnici omogućuje uštedu prostora na disku pomoću sparse files („rijetke datoteke“ ).
Što se događa u inicijalnom trenutku kreiranja ovakve datoteke ?
Operativni sustav (koji podržava sparse files) kreira ovakvu datoteku, koja je zapravo prazna, odnosno naznačeno je da je popunjena blokovima nula. Čim neki blok sadrži podatke, podaci se zapisuje na disk na odgovarajući način i datoteka na disku raste.
Osim vrlo korisne upotrebe, naročito kod virtualizacije, postoje i neki potencijalni problemi s korištenjem sparse datoteka.
Najočigledniji bi bio u slučaju kada „korisnički“ program ili Linux naredba ne prepoznaje ili ne zna koristiti sparse datoteke.
Rezultat ovakvog rada bi bio da u gornjem slučaju kada imamo sparse datoteku od 10GB, ali koja je iskorištena samo 1GB te nakon upotrebe našeg „problematičnog“ programa ili naredbe ona odjednom naraste na stvarnih 10GB.
Čak i programi koji mogu/znaju raditi sa sparse datotekama – to im uglavnom mora biti izričito rečeno.
Drugi problem je u tome što se sve vezano za upravljanje diska temelji se na tome kako se koriste sektori ili blokovi na disku- a veličina diska prijavljena za sparse datoteke je puna veličina datoteke (ne stvarni broj blokova na disku). To također znači da će bilo koji program koji radi isključivo s blokovima na disku (npr. naredba du) prijaviti različite vrijednosti (veličine) od ostalih programa ili servisa.
Još jedan problem je da li backup programi prepoznaju ili snimaju ispravno sparse datoteke. Backup program koji ne prepoznaje (i pravilno koristi) sparse datoteku za rezultat ima već navedeni primjer u kojemu mala sparse (prorijeđena) datoteka od 1GB odjednom naraste na 10GB te za nju više nema prostora za pohranu.
Da biste pomoću ls naredbe dobili stvarnu veličinu sparse datoteke (umjesto samo veličine datoteke koja je prijavljena sustavu) potreban je prekidač -s:
ls -lsh total 36K 24K -rw-r--r-- 1 root root 22K Jun 2 09:42 file.out.txt 4.0K -rwxr-xr-x 1 root root 68 Jun 1 16:32 generator.sh
Blokovi koji se koriste u lijevom stupcu su kilobajti (KB) korišteni za alociranje blokova na disku. Veličina samih datoteka, koja je prijavljena sustavu je vidljiva u šestom stupcu. Ako usporedimo veličinu alociranih blokova i prijavljenu veličinu datoteka vidimo kako se radi o normalnim datotekama odnosno ovdje nema sparse datoteka
Stvaranje „sparse“ datoteka u osnovi je jednostavan proces za koji ćemo koristiti naredbu dd.
Sa dd kreiramo datoteku s generatorom nula /dev/zero kao ulazom (if=) te skačemo na poziciju 10 GB dalje (seek=10G). Na ovaj način je kreirana “prazna” datoteka, koja kreće s nulama, te skače 10GB dalje. Zbog toga je njena vidljiva veličina +-10GB a stvarna (jer Linux podržava sparse datoteke) samo 8KB (Zapravo zauzima samo dva bloka od 4KB). - Standardna veličina bloka je 4KB (ovo je veličina klastera) - pogledajte poglavlje “Geometrija diskova”.
U primjeru dolje ćemo kreirati sparse datoteku veličine 10GB.
dd if=/dev/zero of=sparse-file bs=1 count=1 seek=10G 1+0 records in 1+0 records out 1 byte (1 B) copied, 5.0734e-05 s, 19.7 kB/s
Pogledajmo što smo dobili :
ls -lsh total 36K 24K -rw-r--r-- 1 root root 22K Jun 2 09:42 file.out.txt 4.0K -rwxr-xr-x 1 root root 68 Jun 1 16:32 generator.sh 8.0K -rw-r--r-- 1 root root 11G Jun 2 09:43 sparse-file
Dakle vidljivo je da je naša sparse datoteka prijavljene veličine 11GB ali da u blokovima (prvi stupac) zauzima samo 8KB (jer je potpuno prazna).
Usporedimo nekoliko Linux naredbi i njihovu “svjesnost” o sparse datotekama
Naredba du
Ova naredba nam daje podatak o veličini datoteka na disku - unutar nekog direktorija ili rekurzivno i za sve poddirekorije unutar trenutnog (naravno i datoteke).
Sve verzije ove naredbe svjesne su sparse datoteka ali je moguće vidjeti i veličine koje su prijavljene sustavu.
Pogledajmo :
du -hs 40K .
Dakle zauzeće u trenutnom direktoriju je 40KB.
Sada pogledajmo kako se to vidi inače (prekidač –apparent-size):
du -hs --apparent-size 11G .
Sada vidimo da je vidljiva upotreba 11GB jer se sada ne prepoznaju sparse datoteke.
Naredba tar
Naredba tar koristi se za kreiranje arhive, s time da ona ima mogućnost i komprimiranja iste arhive “u letu”.
Za više informacija o programu tar i njegovim mogućnostima pogledajte poglavlje o Arhiviranju.
Naredba tar je jedna od onih kojoj se mora reći da su u pitanju sparse datoteke.
Izradimo nekomprimiranu TAR arhivu (u ovom slučaju naziva sparse-file.tar), naše sparse datoteke:
tar -cv -f sparse-file.tar sparse-file
Kreiranje ovakve arhive koja nije svjesna sparse datoteka, će potrajati, kao i njeno kasnije ekstarktiranje (možda i satima - ovisno o brzini računala/poslužitelja)
Što smo dobili ?
ls -alhs ... ... 6.1G -rw-r--r-- 1 root root 6.1G Jun 2 14:16 sparse-file.tar ... ...
Dobili smo arhiviranu datoteku koja je veličine 6.1GB i koja na disku zauzima također 6.1GB.
Probajmo sada isto (ime arhive će biti sparse-file-S.tar) ali dodajmo tar-u spoznaju kako se radi o sparse datoteci - pomoću dodatnog prekidača -S:
tar -cvS -f sparse-file-S.tar sparse-file
Što smo sada dobili :
ls -alhs ... ... 12K -rw-r--r-- 1 root root 10K Jun 2 14:16 sparse-file-S-.tar ... ...
Sada imamo nešto posve drugačiji rezultat - veličina u blokovima na disku je samo 12KB, dok je vidljiva veličina 10KB.
U svakom slučaju razlika je vidljiva.
Probajmo sada uključiti i gzip komprimiranje - pomoću prekidača -z ali bez sparse podrške:
tar -czv -f sparse-file.tgz sparse-file
Rezultat će biti datoteka sparse-file.tgz koja je GZIP komprimirana TAR arhiva.
ls -alhs ... ... 10M -rw-r--r-- 1 root root 10M Jun 2 14:11 sparse-file.tgz ... ...
Sada smo dobili znatno manju arhivu ali koja kada se bude ekstraktirala, biti će veličine 10GB, što baš i ne želimo.
I na kraju napravimo isto kao u prethodnom primjeru ali uključimo sparse (-S):
tar -czvS -f sparse-file-S.tgz sparse-file
I kako to sada izgleda :
ls -alhs ... ... 4.0K -rw-r--r-- 1 root root 138 Jun 2 14:14 sparse-file-S.tgz ... ...
Dobili smo malu arhivu, koja je svjesna sparse datoteka (4KB u blokovima i 138 Byte-a), te će ona, kada bude ekstraktirana također zadržati sparse svojstva.
Naredba cp
Linux naredba za kopiranje datoteka ili direktorija cp u većini slučajeva standardno može kopirati i sparse datoteke. Ona na osnovi heurističke analize datoteke, može zaključiti da li se radi o običnoj ili sparse datoteci. Naime prije kopiranja se provjerava da li datoteka ima “dovoljno” veliki niz nula u sadržaju, te ako ima, smatra se sparse datotekom.
Iako da bi bili 100% sigurni da će sparse datoteka biti ispravno prekopirana, možemo koristiti prekidač –sparse=always
Pogledajmo kako
cp --sparse=always sparse-file /root/test/new-directory
Provjerimo da li se sve prekopiralo kako treba i kolika je stvarna veličina datoteke na disku ( -s prekidač )
ls -alhs ... ... 8.0K -rw-r--r-- 1 root root 11G Jun 2 09:43 sparse-file ... ...
Dakle sve je u redu, jer je stvarno zauzeće diska samo 8 KB.
rsync
rync program za izradu sigurnosnih kopija, između cijelog niza mogućnosti, podržava i sparse datoteke.
Za primjere i više detalje o ovoj naredbi pogledajte poglavlje rsync.
Programi poput : scp , ftp , sftp i pax ne podržavaju sparse datoteke !.
Za praćenje performansi I/O sustava, potrebno nam je nekoliko osnovnih alata. Instalirati ćemo paket koji sadrži večinu alata koji će nam biti potrebni i za praćenje performansi drugih komponenti našeg sustava (CPU, “Context switch”, RAM, Mreža, …).
Za puno razumjevanje, važno je dobro se upoznati s Linux sustavom virtualne memorije, opisanim u poglavlju “Memory management u Linuxu”
Prvo instalirajmo paket sysstat.
yum -y install sysstat
Nakon instalacije ovog paketa, biti će nam dostupno nekoliko programa odnosno alata, koje ćemo ukratko objasniti:
sar prikuplja i prikazuje SVE aktivnosti sustava.sadc odnosno “system activity data collector”. Ovo je alat koji u pozadini prikuplja sve statistike za sar alat.sa1 prikuplja statistike u binarnom formatu. sa1 ovisi o sadc od kojeg zapravo prikuplja podatke. Obićno se pokreće preko cron-a, u određenim vremenskim intervalimasa2 kreira dnevnu statistiku (summary) , prikupljanih podataka. Također se obićno pokreće preko cron-a, u određenim vremenskim intervalima (jedan puta na dan).sadf alat služi za kreiranje sar izvještaja u CSV, XML, i drugim formatima.iostat kreira CPU i I/O statistikempstat kreira CPU statistikepidstat kreira statistike za pokrenute procese ili pojedini proces (prema proces ID-u (PID)).nfsiostat kreira I/O statistike za NFS mrežni datotečni sustavcifsiostat kreira I/O statistike za CIFS mrežni datotečni sustav
Pošto govorimo o I/O sustavu, pogledajmo nekoliko najčešće traženih statistika našeg I/O sustava.
1. Pogledajmo sveukupne I/O aktivnosti , pomoću naredbe sar. Prikupljati ćemo statistiku u realnom vremenu, svaku sekundu (1) te to ponavljati pet (5) puta. Dakle imati ćemo pet statistika
sar -b 1 5 Linux 2.6.32-42-pve (server1) 11/11/2015 _x86_64_ (4 CPU) 20:40:26 AM tps rtps wtps bread/s bwrtn/s 20:40:27 AM 11.00 0.00 11.00 0.00 28.00 20:40:28 AM 3.00 0.00 3.00 0.00 32.00 20:40:29 AM 7.00 0.00 7.00 0.00 64.00 20:40:30 AM 4.00 0.00 4.00 0.00 120.00 20:40:31 AM 16.00 0.00 16.00 0.00 360.00 Average: 8.20 0.00 8.20 0.00 120.80
Vidljivo je da prosječno imamo : 8.2 IOPS tj, I/O operacija u sekundi (tps) … u trenutku analize nismo imali operacije čitanja sa diskova (rtps) … imali smo oko 8.2 operacija zapisivanja na disk (wtps) … u trenutku analize nismo imali operacije čitanja sa diskova (rtps) pa nije bilo niti pročitanih byte-a (bread/s) … imali smo oko 120 byte-a zapisanih na disk (bwrtn/s)
Opis vrijednosti :
1.1 Pogledajmo sveukupne I/O aktivnosti povezane sa sustavom virtualne memorije , pomoću naredbe sar -B. Prikupljati ćemo statistiku u realnom vremenu, svaku sekundu (1) te to ponavaljti pet (5) puta. Dakle imati ćemo pet statistika
sar -B 1 5 Linux 2.6.32-42-pve (server1) 11/17/2015 _x86_64_ (40 CPU) 21:22:34 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 21:22:35 PM 0.00 40.00 37.00 0.00 1081.00 0.00 0.00 0.00 0.00 21:22:36 PM 0.00 0.00 29.00 0.00 835.00 0.00 0.00 0.00 0.00 21:22:37 PM 0.00 36.00 20.00 0.00 847.00 0.00 0.00 0.00 0.00 21:22:38 PM 0.00 32.00 75.00 0.00 930.00 0.00 0.00 0.00 0.00 21:22:39 PM 0.00 1456.00 20.00 0.00 884.00 0.00 0.00 0.00 0.00 Average: 0.00 312.80 36.20 0.00 915.40 0.00 0.00 0.00 0.00
Opis (fokus je na parametre važne za I/O sustav i sustav virtualne memorije povezan s disk I/O sustavom):
Dodatne opcije koje su važne za dublje razumjevanje i analizu I/O sustava
kswapd servisa, u svakoj sekundi. kswapd servis je zadužen za skeniranje raspoložive RAM memorije. Kada raspoloživa RAM memorija padne ispod neke točke, ovaj servis započinje alociranje Swap memorije (swap particije na tvdom disku).pgsteal mehanizma. Možemo ga promatrati ovako:Pojam “page” koji se spominje kod diskovnog sustava se odnosti na “page cache” odnosno priručnu memoriju prema diskovnom sustavu a ne na “page cache” tablice ili druge mehanizme ili pojmove vezane za sustav virtualne memorije. (Ovo je malo zbunjujuće zbog gotovo istih naziva). U svakom slučaju standardna veličina stranice je 4kB jer je to standardna veličina stranice na razini memorije - točnije na razini sustava virtualne memorije.
Pojednostavljeno veza između procesa/programa/aplikacije, “page cache” i diska je vidljiva na slici:
1.2 Pogledajmo detaljnije I/O operacije ali prema svakom disku zasebno pomoću naredbe sar. Provjere ćemo raditi svake sekunde (1) i to dva puta (2), pošto će ispis biti malo duži.
Naš sustav ima dva tvrda diska :
/dev/sda)/dev/sdb)sar -p -d 1 2 Linux 2.6.32-42-pve (server1) 11/11/2015 _x86_64_ (4 CPU) 20:56:01 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 20:56:02 AM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 20:56:02 AM sdb 4.00 0.00 36.00 9.00 0.00 0.00 0.00 0.00 20:56:02 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 20:56:03 AM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 20:56:03 AM sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util Average: sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: sdb 2.00 0.00 18.00 9.00 0.00 0.00 0.00 0.00
Ovdje vidimo još više detalja od kojih je tps zapravo IOPS (kao i prije).
“rd_sec/s” i “wr_sec/s” su operacije čitanja i pisanja.
Dodatne nove opcije su :
Ono što je sada zanimljivo su opcije pred kraj:
1.3 Pogledajmo detaljnije I/O operacije ali prema svakom disku zasebno pomoću naredbe iostat.
Sada ćemo dobiti slične statistike kao iz prethodnog primjera lia pomoću naredbe iostat.
Koristiti ćemo prekidać -m da bi dobili ispis u MB/s.
iostat -m
Linux 2.6.32-42-pve (server1) 11/11/2015 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
4.22 0.00 1.09 0.01 0.00 94.69
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 1.43 0.00 0.01 631 13286
sdb 25.24 0.42 0.48 460796 529849
Dakle ovdje je sve prilično jasno : Broj operacija prema disku (tps [IOPS]), MB/s za operacije čitanja (MB_read/s) te pisanja (MB_wrtn/s).
Dodatno imamo :
1.4 Pogledajmo detaljnije I/O operacije ali za sve pokrenute procese (programe/aplikacije) pomoću naredbe pidstat.
Ako naredbu pidstat pokrenemo s prekidačem -d , dobiti ćemo statistiku za diskovni sustav, kao što smo rekli za sve pokrenute procese/programe/aplikacije.
pidstat -d
Linux 2.6.32-42-pve (server1) 11/17/2015 _x86_64_ (4 CPU)
20:06:17 PM PID kB_rd/s kB_wr/s kB_ccwr/s Command
20:06:17 PM 1 37.67 0.07 0.00 init
20:06:17 PM 1215 0.00 1.43 0.00 kjournald
20:06:17 PM 1351 0.01 0.00 0.00 udevd
20:06:17 PM 3058 0.00 0.00 0.00 xfsalloc/0
20:06:17 PM 6422 0.00 0.00 0.00 sendmail
... ... ... ... ... ...
Opis :
2 Ručni rad - pogledajmo I/O operacije ali za pojedini pokrenuti proces. U slučaju da smo želimo vidjeti I/O operacije za pojedini pokrenuti program/aplikaciju, prvo saznajmo njen “process id ” odnosno PID broj.
Recimo da je to Apache Web server, sa svojim procesima. Saznajom njihove PID-ove:
pidof httpd 2738847 6441
Sada možemo gledati I/O operacije za svaki od tih procesa u realnom vremenu.
Sve I/O statistike se stalno zapisuju u datoteku imena io unutar /proc/ direktorija i poddirektorija koji ima ime jednako PID-u. Dakle za PID 6441 je to datoteka /proc/6441/io.
Pogledajmo njen sadržaj:
cat /proc/6441/io rchar: 334965 wchar: 901 syscr: 207 syscw: 16 read_bytes: 20480 write_bytes: 36864 cancelled_write_bytes: 8192
Pošto se statistika stalno osvježava, svaki novi pogled u datoteku daje nove statistike (jer se popunjava u realnom vremenu).
Što je sve dostupno od statistika:
Više informacija o procfs datotečnom sustavu (/proc/ direktorij) možete vidjeti na :
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt
2.1 Pogledajmo I/O operacije ali za pojedini pokrenuti proces, pomoću naredbe pidstat.
U slučaju da smo želimo vidjeti I/O operacije za pojedini pokrenuti proces/program/aplikaciju, prvo saznajmo njen “process id ” odnosno PID broj. U našem slućaju gledati ćemo statistiku našeg Apache (httpd) servisa, čiji trenutni PID je 6441.
Pratiti ćemo statistiku u realnom vremenu, svake sekunde (1) , četiri puta (4)
pidstat -d -p 6441 1 4 Linux 2.6.32-42-pve (server1) 11/17/2015 _x86_64_ (4 CPU) 20:17:13 PM PID kB_rd/s kB_wr/s kB_ccwr/s Command 20:17:14 PM 6441 0.00 0.00 0.00 httpd 20:17:15 PM 6441 0.00 0.00 0.00 httpd 20:17:16 PM 6441 0.00 0.00 0.00 httpd 20:17:17 PM 6441 0.00 0.00 0.00 httpd Average: 6441 0.00 0.00 0.00 httpd
Podaci iz statistike su isti kao i iz prethodnog primjera: kB/ za čitanje (kB_rd/s) , pisanje (kB_wr/s) i “cancelled_write_bytes” (kB_ccwr/s).
Ovo je vrlo zgodna naredbe jer možemo pratiti stanje pojedinog proces u realnom vremenu u vremenskim intervalima u kojima želimo pratiti stanje procesa.
3. Pogledajmo statuse na razini VFS sloja (Filesystem Layer), pomoću naredbe sar -v.
Sada ćemo pogledati osnovne statistke na “Filesystem” sloju. Statistike ćemo gledati svake sekunde (1) i to četiri (4) puta.
sar -v 1 4 Linux 2.6.32-42-pve (server1) 11/20/2015 _x86_64_ (4 CPU) 20:22:53 PM dentunusd file-nr inode-nr pty-nr 20:22:54 PM 35271 5680 44127 2 20:22:55 PM 35271 5680 44127 2 20:22:56 PM 35276 5680 44132 2 20:22:57 PM 35276 5680 44132 2 Average: 35274 5680 44130 2
Opis :
dentunusd - Broj neiskorištenih unosa u priručnoj memoriji za direktorije (engl. Directory cache).file-nr - Ukupan broj otvorenih “File handle”-ova za cijeli sustav, trenutno.inode-nr - Ukupan broj otvorenih “Inode handle”-ova za cijeli sustav, trenutno.pty-nr - Ukupan broj pseudo terminala otvorenih na sustavu (Ne zaboravimo - ovo su isto posebne datoteke).
4. Disk I/O wait
Postoje i slučajevi u kojima CPU čeka na diskovni podsustav, jer je diskovni podsustav preopterećen. Pogledajte primjer iz poglavlja: Naredba vmstat za CPU.
Ako nam alati koji dolaze unutar sysstat paketa nisu dovoljni te želimo još dublju analizu I/O prometa, dostupan je paket blktrace unutar kojega dolazi nekoliko programa od kojih ćemo spomenuti samo dva :
Ova dva alata nam omogućavaju vrlo detaljnu analizu pristupa I/O sustavu.
Prikupljanje informacija o diskovnom I/O (ako želimo pratiti disk /dev/sdb):
Prvo provjerimo da li imamo mountan datotečni sustav debugfs
mount | egrep debugfs
Ako nemamo mountan debugfs, moramo ga mountati:
mkdir /sys/kernel/debug mount -t debugfs debugfs /sys/kernel/debug
Instalirajmo paket blktrace :
yum install blktrace
Sada možemo krenuti sa snimanjem svih I/O aktivnosti za željeni disk (/dev/sdb).
blktrace -w 30 -d /dev/sdb -o izlaz.sdb.out
S navedenim primjerom će se snimati I/O aktivnosti diska, sa svim detaljima,u trajanju 30 sekundi te snimiti u datoteku “izlaz.sdb.out”
Sada možemo pomoću programa blkparse parsirati dobivenu log datoteku i prikazati na razumljiviji način (izvještaj je u binarnom formatu pa je potreban ovaj korak).
Ovisno o količini prometa prema disku, možemo imati nekoliko izlaznih datoteka. Mi smo dobili dvije, analizirajmo prvu (izlaz.xvdg.out.blktrace.0) :
blkparse -i izlaz.xvdg.out.blktrace.0 ... ... ...
Ako želimo trenutni ispis statistike, bez zapisivanja u datoteku, možemo pokrenuti i naredbe:
blktrace -d /dev/sda -o - | blkparse -i -
Nakon nekoliko trenutaka možemo prekinuti ovaj program, sa CTRL c.
U svakom slučaju, pozvali prve dvije naredbe ili ovu zadnju, dobiti ćemo slijedeći ispis.
Naime izrezali smo samo vrlo mali, sitni, djelić ovog ispisa :
... ... ... 202,96 0 0 0.132479634 0 m N cfq2517S / sl_used=8 disp=6 charge=6 iops=1 sect=192 202,96 0 0 0.132480223 0 m N cfq2517S / del_from_rr 202,96 0 0 0.132482419 0 m N cfq2515S / set_active wl_prio:0 wl_type:1 202,96 0 0 0.132483548 0 m N cfq2515S / fifo=(null) 202,96 0 0 0.132484188 0 m N cfq2515S / dispatch_insert 202,96 0 0 0.132485535 0 m N cfq2515S / dispatched a request 202,96 0 0 0.132486273 0 m N cfq2515S / activate rq, drv=1 202,96 1 466 0.133106889 0 C R 120927 + 32 [0] 202,96 1 0 0.133110911 0 m N cfq2515S / complete rqnoidle 0 202,96 1 0 0.133111855 0 m N cfq2515S / set_slice=100 ... ... ... CPU0 (izlaz.sdb.out): Reads Queued: 127, 2,618KiB Writes Queued: 18, 157KiB Read Dispatches: 127, 2,618KiB Write Dispatches: 18, 157KiB Reads Requeued: 0 Writes Requeued: 0 Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB Read Merges: 0, 0KiB Write Merges: 0, 0KiB Read depth: 17 Write depth: 2 IO unplugs: 132 Timer unplugs: 0 Total (izlaz.sdb.out): Reads Queued: 1,439, 39,188KiB Writes Queued: 157, 2,341KiB Read Dispatches: 1,439, 39,188KiB Write Dispatches: 157, 2,341KiB Reads Requeued: 0 Writes Requeued: 0 Reads Completed: 1,438, 39,172KiB Writes Completed: 159, 2,349KiB Read Merges: 0, 0KiB Write Merges: 0, 0KiB IO unplugs: 1,259 Timer unplugs: .... ... ..
Osnovni opis:
ls -alh /dev/ | grep "202, 96" brw-rw---- 1 root disk 202, 96 Nov 19 05:01 sdb
A “IO was remapped to a different device”B “IO bounced”C - “IO completion”D - “IO issued to driver”G - “Get request”P - “Plug request”Q - “IO handled by request queue code”S - “Sleep request”U - “Unplug request”blkparse man stranicu.Više detalja nećemo objašnjavati, važno je da budete svjesni koliko detaljno je moguće analizirati I/O sustav.
Ako iz ovog izvještaja ipak želimo samo malo osnovnije stvari, možemo napraviti sljedeće:
yum install seekwatcher
Sada ćemo pretvoriti izvještaj u sliku (.png format) :
seekwatcher -t izlaz.sdb.out -o izlaz.png
Slika u našem slučaju izgleda ovako:
Dodatno, u paketu blktrace dolazi i program btt s kojim je također moguće izraditi izvještaj. Pogledajmo kako:
Prvo moramo izraditi odredišnu datoteku, iz svih log datoteka:
blkparse -i izlaz.xvdg.out.blktrace.* -d disk.out
I sada kada smo dobili statistiku u jednoj datoteci (disk.out), možemo ju analizirati s programom btt:
btt -i disk.out | more
Dobivamo detaljnu statistiku, poput ove (koju smo skratili):
==================== All Devices ====================
ALL MIN AVG MAX N
--------------- ------------- ------------- ------------- -----------
Q2Q 0.000003699 0.010400227 2.125710371 400
Q2G 0.000000158 0.000000753 0.000013885 19200
G2I 0.000000112 0.000000543 0.000013659 19200
Q2M 0.000001335 0.000001335 0.000001335 48
I2D 0.000000115 0.000000485 0.000002823 19200
M2D 0.000002910 0.000002910 0.000002910 48
D2C 0.000027688 0.000047481 0.000197677 401
Q2C 0.000029297 0.000049269 0.000209201 401
==================== Device Overhead ====================
DEV | Q2G G2I Q2M I2D D2C
---------- | --------- --------- --------- --------- ---------
( 8, 0) | 73.2023% 52.8059% 0.3243% 47.1385% 96.3713%
---------- | --------- --------- --------- --------- ---------
Overall | 73.2023% 52.8059% 0.3243% 47.1385% 96.3713%
==================== Device Merge Information ====================
DEV | #Q #D Ratio | BLKmin BLKavg BLKmax Total
---------- | -------- -------- ------- | -------- -------- -------- --------
( 8, 0) | 19200 19200 1.0 | 8 12 512 235776
==================== Device Q2Q Seek Information ====================
DEV | NSEEKS MEAN MEDIAN | MODE
---------- | --------------- --------------- --------------- | ---------------
( 8, 0) | 401 26530652.9 0 | 0(300)
---------- | --------------- --------------- --------------- | ---------------
Overall | NSEEKS MEAN MEDIAN | MODE
Average | 401 26530652.9 0 | 0(300)
==================== Device D2D Seek Information ====================
DEV | NSEEKS MEAN MEDIAN | MODE
---------- | --------------- --------------- --------------- | ---------------
( 8, 0) | 19200 554103.7 0 | 0(19099)
---------- | --------------- --------------- --------------- | ---------------
Overall | NSEEKS MEAN MEDIAN | MODE
Average | 19200 554103.7 0 | 0(19099)
==================== Plug Information ====================
DEV | # Plugs # Timer Us | % Time Q Plugged
---------- | ---------- ---------- | ----------------
( 8, 0) | 4( 0) | 0.000316734%
DEV | IOs/Unp IOs/Unp(to)
---------- | ---------- ----------
( 8, 0) | 1.0 0.0
---------- | ---------- ----------
Overall | IOs/Unp IOs/Unp(to)
Average | 1.0 0.0
==================== Active Requests At Q Information ====================
DEV | Avg Reqs @ Q
---------- | -------------
( 8, 0) | 0.0
==================== I/O Active Period Information ====================
DEV | # Live Avg. Act Avg. !Act % Live
---------- | ---------- ------------- ------------- ------
( 8, 0) | 5 0.000724715 1.039162389 0.09
---------- | ---------- ------------- ------------- ------
Total Sys | 5 0.000724715 1.039162389 0.09
...
...
...
Opis (sva vremena su u mili sekundama):
Q2Q — vrijeme između zahtjeva prema block layer sloju Q2G — koliko vremena je potrebno od kada je sa block layer došao do niza za izvršavanje (queue) do vremena kada je zahtjev alociran (allocated)G2I — vrijeme od kada je zahtjev alociran do vremena kada je upit ubačen u niz za izvršavanje unutar fizičkog diska i njegovog niza za izvršavanje (disk device queue)Q2M — koliko vremena je potrebno od kada je na blok sloju zahtjev došao do niza za izvršavanje (queue) do vremena kada je spojen s postojećim zahtjevom (request merging slučaj)I2D — vrijeme koje je potrebno od kada je zahtjev ubačen u niz za izvršavanje unutar fizičkog diska do vremena kada ga fizički disk stvarno izvršiM2D — vrijeme od trenutka kada je zahtjev došao do blok sloja (block layer) preko trenutka kada je zahtjev spojen s drugim zahtjevima (ako ih ima), pa sve do trenutka kada su svi zajedno došli do fizičkog diska, na izvršavanje (čitanje/pisanje)D2C — vrijeme obrade zahtjeva od strane fizičkog diska Q2C — ukupno vrijeme provedeno o blok sloju
Pogledajmo kako logički izgledaju ova vremena:
Da bi razumjeli detalje o file sustavu, potrebno je razumjeti neke činjenice o datotekama.
Svaka datoteka se na nivou file sustava sastoji od dva dijela:
Dakle ovako izgleda datoteka na Linux File Sistemu (pr. ext/3/4 ) ili na Unix file sustavu (pr. UFS):
Podaci unutar svake datoteke se zapravo nalaze unutar i-node-a. Hard link nastaje kada se u dijelu datoteke u kojem je i-node broj koristi i-node broj unutar kojeg su zapisani podaci od neke druge datoteke:
Prednosti i mane Hard Linkova:
Mogu se kreirati samo unutar jedne particije jer i-node tablica postoji za svaki file
system/particiju zasebno
.. ) = ima isti inode broj kao parent. ) = ima novi inode brojPrimjeri:
Kreirajmo datoteku imena text.txt
echo “probni text”> text.txt
Napravimo Hard link na nju (nova datoteka će se zvati hard.link)
ln text.txt hard.link
Provjerimo kako to izgleda ( i prekidač naredbe ls nam prikazuje I-node broj)
ls –ali 5636110 drwxr-xr-x 2 root root 4096 Nov 13 09:47 . 5636097 dr-xr-x---. 4 root root 4096 Nov 13 09:28 .. 5636111 -rw-r--r-- 2 root root 5 Nov 13 21:29 text.txt 5636111 -rw-r--r-- 2 root root 5 Nov 13 21:29 hard.link
Pogledajte I-node brojeve od datoteka : text.txt i hard.link.
Soft Linkovi zapravo pokazuju na već kreiranu datoteku ili direktorij s apsolutnom ili relativnom putanjom. Dakle soft link datoteka zapravo pokazuje na i-node broj od izvorne datoteke. To znači kako se soft link direktno veže na sadržaj izvorne datoteke, pošto se njen sadržaj (podaci) nalazi u i-node dijelu.
Logička shema je vidljiva na slici:
Prednosti i mane Soft Linkova
Brisanjem originala (source) soft link postaje neupotrebljiv (pokazuje i dalje na nepostojeću datoteku/direktorij).
Primjeri
Nastavak na primjere od Hard Linkova: Napravimo Soft link na text.txt (nova datoteka će se zvati soft.link)
ln -s text.txt soft.link
Provjerimo kako to izgleda
ls -ali 5636110 drwxr-xr-x 2 root root 4096 Nov 13 09:47 . 5636097 dr-xr-x---. 4 root root 4096 Nov 13 09:28 .. 5636111 -rw-r--r-- 2 root root 5 Nov 13 21:29 text.txt 5636111 -rw-r--r-- 2 root root 5 Nov 13 21:29 hard.link 5636112 lrwxrwxrwx 1 root root 8 Nov 13 09:34 soft.link -> text.txt
Uočimo razliku u I-node broju soft linka : datoteka imena : soft.link
Za svaki direktorij i datoteku zapisuju se i oznake vremena:
modify : kada je kreiran ili mijenjanaccess : kada mu je pristupanochange : kada je promijenjen status (i-node unosi)Primjeri:
Nastavljamo s već kreiranim datotekama. Provjerimo kako izgledaju oznake vremena:
ls -al drwxr-xr-x 2 root root 4096 Nov 13 19:03 . dr-xr-x---. 4 root root 4096 Nov 13 19:28 .. -rw-r--r-- 2 root root 5 Nov 13 19:29 hard.link lrwxrwxrwx 1 root root 8 Nov 13 19:34 soft.link -> text.txt -rw-r--r-- 2 root root 5 Nov 13 19:29 text.txt
Pogledajmo vremenske unose malo detaljnije (naredba stat) (pr. datoteka text.txt)
stat text.txt File: `text.txt'; Size: 5 ; Blocks: 8 ; IO Block: 4096 ; regular file Device: 801h/2049d ; Inode: 5636111 ; Links: 2 Access: (0644/-rw-r--r--);Uid: ( 0/root) ; Gid: ( 0/root) Access: 2013-11-13 19:47:34.519854892 +0000 Modify: 2013-11-13 19:29:17.359728861 +0000 Change: 2013-11-13 19:20:19.372604340 +0000
Kako promijeniti vremena pristupa/promijene datoteke:
Godina : 2013 , Mjesec : 11 , Dan : 11 , Sat : 12 , minuta : 01 , sekunda : 10.
touch -a -m -t 201311111201.10 text.txt
Provjerimo sada vremena:
stat text.txt File: `text.txt' Size: 5 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 5636111 Links: 2 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2013-11-11 12:01:10.000000000 +0000 Modify: 2013-11-11 12:01:10.000000000 +0000 Change: 2013-11-13 19:20:19.372604340 +0000
Kako još provjeriti vremena pristupanja/promjena ili pristupa datotekama ?
Provjerimo vrijeme zadnje promjene datoteke (u sekundama [UNIX vrijeme (Epoha)]
stat -c %Y file.sh 1458573410
i isto sa naredbom date
date -r file.sh +%s 1458573410
Napredno :
Pogledajmo sada detaljniji ispis za našu datoteku, na razini datotečnog sustava (pr. ext3 ili ext4).
ls -ali file.sh 21062 -rw-r--r-- 1 root root 10 Mar 22 19:13 file.sh
Nas zanima Inode broj od naše datoteke (u ovom slučaju je to 21062). Sada ćemo izvuči malo detaljniju statistiku na razin datotečnog sustava.
Naša datoteka se nalazi u direktoriju /root/test.
Vršni direktorij / je mountan sa particije /dev/sda1 i znamo kako se koristi ext4 datotečni sustav.
Pogledajmo :
mount ... ... ... /dev/sda1 on / type ext4 (rw) ... ... ...
Sada ćemo u pretragu upisati naš INODE i particiju na kojoj se nalazi (sjetimo sa da INODE ovisi o particiji)
debugfs -R 'stat <21062>' /dev/sda1 debugfs 1.41.12 (17-May-2010) Inode: 21062 Type: regular Mode: 0644 Flags: 0x80000 Generation: 2152679827 Version: 0x00000000:00000001 User: 0 Group: 0 Size: 10 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 8 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x56f136ff:5705f0b8 -- Tue Mar 22 19:13:51 2016 atime: 0x56f13681:db1b39b4 -- Tue Mar 22 19:11:45 2016 mtime: 0x56f136ff:5705f0b8 -- Tue Mar 22 19:13:51 2016 crtime: 0x56f1359a:bd10ae80 -- Tue Mar 22 18:07:54 2016
Sada vidimo još jedno polje a to je crtime.
U slučaju ext3 i ext4 datotečnog sustava u ovo polje (crtime) se upisuje vrijeme kreiranja datoteke.
Ostala polja su standardna za sve Unix/Linux datotečne sustave : ctime , atime i mtime.
Naredba debugfs se koristi za debugiranje ext2, ext3 i ext4 datotečnih sustava. Osim toga s njom je moguće i mijenjati određene parametre datotečnog sustava.
Za xfs datotečni sustav, za potrebe debugiranja, koristi se naredba xfs_io.
Pogledajmo statistike za XFS datotečni sustav:
Imamo kreiranu datoteku /root/test.txt
Provjerimo koje sve vremenske oznake XFS daatotečni sustav pohranjuje:
xfs_io xfs_io> open /root/test.txt xfs_io> stat -v fd.path = "/root/test.txt" fd.flags = non-sync,non-direct,read-write stat.ino = 805348398 stat.type = regular file stat.size = 0 stat.blocks = 0 stat.atime = Wed Mar 23 21:40:03 2016 stat.mtime = Wed Mar 23 19:48:11 2016 stat.ctime = Wed Mar 23 19:48:11 2016 fsxattr.xflags = 0x0 [] fsxattr.projid = 0 fsxattr.extsize = 0 fsxattr.nextents = 0 fsxattr.naextents = 0 dioattr.mem = 0x200 dioattr.miniosz = 512 dioattr.maxiosz = 2147483136
Vidljivo je kako se pohranjuju samo atime , mtime i ctime.
Dakle nema zapisa za vrijeme kreiranja datoteke kao kod ext 2/3/4 datotečnih sustava.
File descriptori su indeksi na unose u kernelu, prema (otvorenim) datotekama.
Postoje ih osnovne tri vrste (uz još nekoliko posebnih vrsta):
stdout - standardni izlaz (1)stdin - standardni ulaz (0)stderror - standardna greška (2)
Svaki puta kada otvorite neku datoteku (file), operacijski sustav kreira određenu vezu (stream) prema toj datoteci. File descriptor predstavlja vezu (stream) prema toj otvorenoj datoteci. U slučaju rada u terminalu, postoje gore navedene tri vrste posebnih file descriptora. Ova tri file descriptora : stdin, stdout, stderror, su obično spojena na terminal a ne na datoteke ili druge poveznice (kao ostali file descriptori).
To znači da kada nešto pišete u terminalu, sve što pišete odlazi na stdin a ono što vidite na ekranu odlazi zapravo na stdout.
Zamislimo neke datoteke : datoteka-1, datoteka-2 i datoteka-3. File deskriptori su indeksi odnosno pokazivači na te datoteke, koji se čuvaju u posebnoj tablici. Točnije, za svaki pokrenuti program (linux proces), održava se po jedna ovakva tablica, poput ove :
| Index | 1 | 2 | 3 |
| Datoteka | datoteka-1 | datoteka-2 | datoteka-3 |
Što se bilo kojeg programa, odnosno pokrenutog linux procesa tiče, njega ne zanima (niti je svjestan ) kako zapisivati podatke u datoteke, kako im uopće pristupiti i slično, o tome se brine sam kernel, koji je svjestan toga na kojem datotečnom sustavu se nalaze datoteke i drugih detalja. Programi/procesi za rad i komunikaciju koriste file deskriptore, pa se tako može dogoditi da se otvori po jedan file deskriptor na istu datoteku, za čitanje, po jedan za zapisivanje, i tako sve ovisno o namjeni. Slična situacija je i kod mrežne komunikacije, u kojoj se za komunikaciju, otvaraju posebni file deskriptori, ovisno o vrsti komunikacije (socket, pipe). Dakle poveznica između datoteka i file deskriptora nije 1:1.
File deskriptor tablica zapravo izgleda ovako nekako:
| Index | 41 | 42 | 43 | 44 |
| Datoteka | datoteka-1 | datoteka-1 | datoteka-2 | datoteka-3 |
| Način pristupa | čitanje | pisanje | dodavanje na kraj datoteke (append) | čitanje i pisanje |
Kod pokretanja bilo kojeg programa (procesa), prvo se otvaraju ona prva tri file deskriptora, koji moraju imati svoje brojeve (0,1 i 2) :
| Index | 0 | 1 | 2 |
| FD | stdin | stdout | stderror |
Potom se otvaraju i drugi file deskriptori, kako se program učitava u RAM memoriju.
Drugim riječima, možemo reći kako programi/procesi u Linuxu, za svako dohvaćanje vanjskih resursa, kao i za međusobnu i mrežnu komunikaciju, koriste file deskriptore.
Iz sigurnosnih i razloga iskorištavanja resursa sustava, ograničen je maksimalan broj file descriptora, koji se može definirati za cijeli sustav ali i svakog pojedinog korisnika. U svakodnevnom radu, posebno u radu servisa/daemona, ponekada nam je potrebno saznati koliko file descriptora su oni zauzeli. Ne zaboravimo kako je u Linuxu sve datoteka (file). Tako da svaki program pristupa priličnom broju datoteka, poput :
/dev/ datoteka (hardver ili posebne datoteke)
Prvo što moramo saznati je koji proces ID (PID) ima servis/daemon/program koji pratimo.
To možemo na nekoliko načina. Recimo kako se radi o procesu imena sshd (to je SSH
Server)
1. Način : Upotrebom naredbe za izlistavanje aktivnih Linux procesa ps :
ps -aux |grep sshd root 18670 0.0 0.0 66612 1228 ? Ss Feb22 0:00 /usr/sbin/sshd
PID se nalazi u drugom stupcu (u našem slučaju je to PID: 18670).
2. Način : Upotrebom naredbe pidof , koja nam na osnovu imane procesa vrati PID tog procesa:
pidof sshd 18670
Dakle imamo PID: 18670.
Sada moramo saznati koliko file descriptora ima otvoren naš PID 18670.
Za namjenu prebrojavanja file descriptora za određeni PID je zadužena naredba lsof
Listu ćemo dobiti ovako:
lsof -a -p 18670 ... ... ... ... ... ...
… i to datoteku po datoteku.
Pošto nama treba samo broj otvorenih file descriptora, koristiti ćemo naredbu word count tj. wc -l , da nam ih (samo) prebroji.
Tako da ćemo pokrenuti:
lsof -a -p 18670 |wc -l 39
I konačno smo dobili rezultat : 39 otvorenih file descriptora.
Želimo li vidjeti koliko file descriptora je u upotrebi na cijelom sustavu, a to ćemo postići na sličan način:
lsof | wc -l 334
Dakle cijeli Linux na kojem smo pokrenuli ovu naredbu koristi 334 file descriptora.
Pogledajmo file deskriptore za stdin(0) stdout(1) i stderr(2). I to za recimo naš Web poslužitelj Apache.
Pronašli smo PID našeg Apache Web poslužitelja : “29377”.
Pogledajmo koje sve file deskriptore ima otvorene (ispis je skraćen za potrebe prikaza):
lsof -p 29377 ... ... ... COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ... ... ... httpd 29377 apache 0r CHR 1,3 0t0 23086 /dev/null httpd 29377 apache 1w CHR 1,3 0t0 23086 /dev/null httpd 29377 apache 2w REG 0,52 2104 27263802 /var/log/httpd/error_log ... ... ...
U stupcu FD nalaze se file deskriptori, u formi: BrojStanje.
Dakle pod poljem FD tražimo file deskriptore 0 , 1 i 2:
stdin odnosno 0 je u stanju čitanja - “r” (READ) iz datoteke (polje NAME) : /dev/null (što znači da ne prima nikakav ulaz trenutno)stdout odnosno 1 je u stanju zapisivanja - “w” (WRITE) prema datoteci (polje NAME) : /dev/null (što znači da ništa trenutno ne šalje na “Ekran/MONITOR”jer sve završava u “NULL” datoteci)stderr odnosno 2 je u stanju zapisivanja - “w” (WRITE) prema datoteci (polje NAME) : /var/log/httpd/error_log, što znači kako se sve greške zapisuju (logiraju) u tu datoteku.
Isto smo, još jednostavnije mogli postići izlistanjem datoteka u direktoriju unutar /proc/PID/fd/ direktorija. Pri čemu je PID zapravo PID broj našeg procesa (u ovom slučaju 29377).
Pogledajmo sliku - pokrenuli smo naredbu ls -al /proc/29377/fd/:
Opis: Uokvireni su 0 , 1 i 2 koji predstavljaju stdin , stdout i stderr.
Za detalje oko lsof naredbe pogledajte poglavlje "List open Files lsof"
Naredba ulimit daje nam mogućnost definiranja sistemskih ograničenja od :
Pošto smo pričali o file deskriptorima, pogledajmo koja ograničenja nam sustav daje u startu. Zanima nas koliko file descriptora možemo imati (postoje soft i hard limiti). Limit na file descriptor-e znači zapravo koliko datoteka možemo imati istovremeno otvorenih
(tj. na koliko ih istovremeno možemo raditi ).
Pogledajmo Soft limit na file descriptore (ograničenje do kojeg možemo ići bez ikakve poruke sustava ) .
ulimit -Sn 1024
Pogledajmo Hard limit na file descriptore (ograničenje preko kojeg ne možemo ići [sustav nam neće dopustiti]):
ulimit -Hn 4096
U slučaju da nam je potrebno raditi s većim brojem datoteka (file desciptora-a), podignimo im Hard Limit.
Ovo je potrebno za neke velike baze podataka i sl. namjene. Mi ćemo trenutno podići limit na 8192 file descriptora.
ulimit -n 8192
Da bi ova promjena ostala stalna, potrebno ju je zapisati u neku sistemsku startup skriptu (ovisno o našim potrebama).
Što još možemo mijenjati s ulimit naredbom i koji su njeni drugi prekidači:
-a All current limits are reported-c The maximum size of core files created -d The maximum size of a process’s data segment -e The maximum scheduling priority (“nice”) -f The maximum size of files written by the shell and its children -i The maximum number of pending signals -l The maximum size that may be locked into memory -m The maximum resident set size (has no effect on Linux) -n The maximum number of open file descriptors (most systems do not allow this value to be set)
U slučaju potrebe za ograničenjem maksimalnog broja procesa koje pojedini korisnik može pokrenuti, također možemo koristiti naredbu ulimit ili definirati ograničenja za pojedinog korisnika na razini cijelog sustava. Prvo pogledajmo koja su standardna ograničenja (Soft i Hard limiti):
Soft limit na broj procesa:
ulimit -Su 773215
Hard limit na broj procesa
ulimit -Hu 773215
Sada ćemo za korisnika ucenik1 , postaviti Hard i Soft limite na max. broj pokrenutih procesa i to:
maksimalno 100 procesa kao soft limit.
maksimalno 500 procesa kao hard limit.
Editirajmo datoteku sa vi programom: /etc/security/limits.conf
Dodati ćemo sljedeće linije na kraj datoteke:
ucenik1 soft nproc 100 ucenik1 hard nproc 500
Nakon što snimimo ove promjene i korisnik se ponovno logira, provjerimo stanje:
ulimit -Su 100 ulimit -Hu 500
Vidimo kako su ograničenja aktivna.
Baratanje s file deskriptorima u kernel memoriji
Želimo li vidjeti više informacija o file deskriptorima na razini kernela, možemo to napraviti sa:
sysctl fs.file-nr fs.file-nr = 1184 0 9897041
Što to znači:
Postoji i drugi način provjere i konfiguriranja file deskriptora, pomoću direktne provjere ili upisa u kernel parametre.
Podjetimo se kako je /proc specifičan direktorij, koji sadrži parametre kernela. Provjerimo koliko kernel može alocirati file deskriptora (isti podatak od primjera gore) :
cat /proc/sys/fs/file-max 9897041
Na sličan način to možemo i promijeniti, pr. smanjimo ih sa: 9 897 041 na 1 000 000.
echo "1000000"> /proc/sys/fs/file-max
Ako to stavimo u neku datoteku, koja se pokreće kod podizanja sustava, to će postati permanentno, ali to se preporučuje upotrebom sysctl metoda (pogledajte sljedeće poglavlje).
Dodatno, moguće je ograničiti i broj file deskriptora, za pojedine korisnike.
Ograničiti ćemo korisnika ucenik na maksimalan broj od 512 file deskriptora
Editirajmo datoteku sa vi programom: /etc/security/limits.conf
Dodati ćemo sljedeće linije na kraj datoteke:
ucenik1 soft nofile 512 ucenik1 hard nofile 512
Kada se navedeni korisnik ponovno logira, imati će novo postavljeno ograničenje.
Ova mogućnost se više koristi za povećanje broja file deskriptora (koliko je to moguće), za poslužiteljske servise kojima je potreban veliki broj istih (pr. vrlo velike i korištene baze podataka), kod kojih nije rijetko, povečanje ovog broja do 65535 ili čak i više. Važno je biti unutar granica, za cijeli operacijskih sustav.
Sysctl je interface za baratanje s parametrima sustava, na razini kernela. U ovo se uklapaju i primjeri s file descriptorima iz prethodnog poglavlja, koje možemo permanentno konfigurirati korištenjem sysctl metoda. U datoteci /etc/sysctl.conf se nalaze upisani parametri kernela koji će biti učitani kod svakog pokretanja sustava.
Primjeri
Dodajmo sljedeće linije (preporuča se još jedna linija s opisom), u /etc/sysctl.conf :
# Maximum number of open files permited fs.file-max = 1000000
Postavili smo vrijednost na 1 000 000 file deskriptora.
Ako želimo provjeriti što se sve može konfigurirati preko sysctl pokrenimo:
sysctl -a
Ako želimo ponovno postaviti vrijednosti koje smo definirali u /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
fuser naredba, koristi se, za razliku od naredbe lsof kada imamo potrebu provjeriti koji proces koristi određenu datoteku, direktorij ili mrežni socket. Dodatno, moguće je vidjeti i informacije o tom procesu, kao i vrsti pristupa. Iako namjena ove naredbe nije direktno vezana za naredbu lsof kao niti za file deskriptore, njihova veza je indirektna, pa ju stoga spominjemo u ovom poglavlju.
fuser u svom ispisu, pod dijelom vrste pristupa (ACCESS), daje nam slijedeće:
c trenutni direktorij (current directory)e izvršna datoteka (executable) koja je pokrenuta f otvorena datoteka, slovo f se obično ne prikazuje u standardnom prikazuF otvorena datoteka za zapisivanje (write), slovo f se obično ne prikazuje u standardnom prikazur root direktorijm memorijski mapirana (mmap) datoteka ili dijeljena biblioteka
Česti prekidači ove naredbe su:
-c označava traženi mountan datotečni sustav-k ubij pronađene procese-i interaktivni rad - prvo pitaj prije nego što nešto radiš (pogotovo ako se koristi -k)-l lista signala koje možemo slati procesu kod ubijanja (koje navodimo u -IME-SIGNALA odnosno -SIGNAL)-m označava sve procese koji pristupaju datotečnom sustavu (mount point) na kojemu se nalazi i datoteke koju gledamo-n označava name space, koji je standardno datoteka (file) ali može biti i:-n tcp - označava TCP transportni mrežni protokol, odnosno otvoreni TCP port-n udp - označava UDP transportni mrežni protokol, odnosno otvoreni UDP port-4 - označava samo upotrebu IPv.4 protokola-6 - označava samo upotrebu IPv.6 protokola-v označava detaljniji (verbose) ispis-SIGNAL - vezano za -k. Ovo je oznaka signala koji će se poslati procesima koje se ubija s prekidačem -k.Lista signala koje standardno možemo poslati procesima kod njihovog gašenja/ubijanja :
Primjeri
1. Pogledajmo koji procesi koriste datoteke unutar našeg trenutnog (radnog) direktorija (/root):
cd /root/
fuser -v ./
USER PID ACCESS COMMAND
/root: root 15125 ..c.. bash
Koristili smo i prekidač -v za detaljniji ispis.
Vidimo kako je unutar direktorija /root aktivan linux proces s PID 15125, koji je zapravo naredba bash - a to je naša aktivna ljuska (shell), koji ima pristup na direktorij (oznaka c, pod ACCESS ).
2. Sada pogledajmo obratno: zanima nas koji proces koristi, odnosno je pokrenuo konkretnu naredbu (bash), koja se nalazi u /bin/bash:
fuser -v /bin/bash
USER PID ACCESS COMMAND
/bin/bash: root 15125 ...e. bash
Vidimo kako je korisnik root pokrenuo ovu naredbu, čiji je PID broj 15125, a pristup je e, što znači kako se radi o izvršnoj datoteci.
3. U ovom primjeru, zanima nas tko je otvorio TCP mrežni port 22 (SSH poslužitelj za udaljeni pristup):
fuser -v -n tcp 22
USER PID ACCESS COMMAND
22/tcp: root 6796 F.... sshd
root 14418 f.... sshd
Isto smo mogli dobiti i sa:
fuser -v 22/tcp
USER PID ACCESS COMMAND
22/tcp: root 6796 F.... sshd
root 14418 f.... sshd
Vidljivo je kako je TCP port broj 22 otvorio proces/naredba imena sshd, što je zapravo SSH poslužiteljski servis (daemon) te vidimo sve PID brojeve od oba SSH procesa. Prvi u ovom slučaju PID (6796 ) je inicijalni SSH servis, a drugi (14418) je onaj koji se pokrenuo za naše spajanje (preko njega smo se udaljeno spojili na SSH). Kada bi se još jedan SSH klijent spojio na ovaj poslužitelj imali bi slijedeće stanje:
fuser -v 22/tcp
USER PID ACCESS COMMAND
22/tcp: root 6796 F.... sshd
root 14418 f.... sshd
root 14770 f.... sshd
4. Pronađimo sve procese koji koriste mountani datotečni sustav koji je povezan s diskom /dev/sda:
fuser -c /dev/sdb /dev/sdb: 344 1688 1689 3462 3480 3494 3787 3806 3814 3820 3834 3835 3836 3837 3838 3840 3853 3868 3906 3907 3919 4018 4050 4076 4077 4078 4080 4081 4084 4090 4145 4146 4168 4235 4241 4242 4269 4320 4321 4322 4323 4324 4325 5770 14545 14763 15123
Dobili smo listu svih PID brojeva, svih procesa koji su otvorili neku datoteku na navedenom disku (/dev/sdb). Za više detalja smo mogli koristiti i prekidač -v ali bi dobili predugačku listu (za našu potrebu prikaza).
4.1 A sada bi mogli poubijati sve procese koji drže neke datoteke otvorene na navedenom disku (oprez - nemojte ovo raditi):
fuser -c -i -k /dev/sdb ...
Isto tako smo mogli poubijati odnosno pozatvarati procese koje drže određene (pojedine) datoteke.
Za provjeru slobodnog prostora odnosno kapaciteta diskova i particija ili zauzeća direktorija, koristi se nekoliko naredbi (jednu smo već upoznali):
lsblk prikazuje nam logičku podjelu i dostupnost “Block Device” uređaja.
df ili Disk Free - prikazuje nam koliko prostora (kapaciteta) imamo zauzeto/slobodno na svim mount-anim particijama.
du ili Disk Usage prikazuje nam zauzeće prostora za određeni direktorij i/ili poddirektorije.
Pogledajmo prvo naše diskove odnosno logičku sliku diskova i particija uz ostale blok uređaje (Block Device) , pomoću naredbe: lsblk
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom sda 8:0 0 120G 0 disk +¦sda1 8:1 0 100G 0 part / L¦sda2 8:2 0 20G 0 part [SWAP]
Dakle imamo:
sr0 uređaj - to je naš DVD/CD ROM
sda to je naš SATA tvrdi disk, kapaciteta 120GB , koji ima dvije particije:
sda1 : Prva ili root ( / ) odnosno sistemska particija, kapaciteta 100 GB
sda2 : Druga partcija koja je swap particija, kapaciteta 20GB
Naredba lsblk ima dosta prekidača, od kojih ćemo spomenuti prekidać -f koji će nam prikazati detalje o datotečnom sustavu (File System):
lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT sda +¦sda1 ext4 48edf714-2642-4cb2-82ac-b62043ec1055 / L¦sda2 swap 6c82a0a2-964a-4e94-a326-b1c75bcaec57 [SWAP]
Vidljivo je da je je sda disk podjeljen na dvije particija (sda1 i sda2) te da niti jedna od njih nema nazive (LABEL) , vidljivi su UUID-i i u što je mount-ana određena particija (MOUNTPOINT), detaljnije :
NAME : daje nam ime uređaja (u našem slučaju /dev/sda1 znači sda1) › Pogledajte poglavlje o diskovima i particijama
FSTYPE : daje nam vrstu odnosno tip datotečnog sustava › Pogledajte poglavlje o diskovima i particijama - u našem primjeru
sda1 koristi ext4 datotečni sustav (ovo je sistemska particija)
sda2 koristi swap datotećni sustav (ovo je swap particija)
LABEL : oznaka particije (proizvoljno opisno ime - može i ne mora biti upisano)
UUID : jedinstveni identifikator svake particije
MOUNTPOINT : označava u što je mount-ana particija › Pogledajte poglavlje o diskovima i particijama
Naredba df prikazuje nam zauzeće datotečnog sustava (File System) koji smo mount-ali. Navedena naredba ima veći broj prekidaća od kojih ćemo koristiti nekoliko:
Standardno se ispisuje zauzeće u blokovima podataka od 1KB.
-h ili -g : prikaz u GB (Human Readable format)
-i : prikaz prema i-node tablicama (iskorišteno/slobodno)
-T : prikaz uz ispis o vrsti/tipu datotečnog sustava (File System)
Primjeri
1.Ispišimo zauzeće mount-anih particija :
df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 100158332 2751504 97406828 2.7% /
Vidljivo je da nam je prikaz u blokovima od 1KB pomalo nepraktičan
2. Ispišimo zauzeće u nama (ljudima) malo ljepšem formatu (-h):
df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 100G 2.7G 97.3G 2.7% /
3. Prijašnjem primjeru dodajmo i ispis vrste datotečnog sustava (-T):
df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda1 ext4 100G 2.7G 97.3G 2.7% /
Naredba du (Disk Usage) daje nam ispis zauzeća diskovnog prostora za određeni direktorij odnosno sve njegove poddirektorije rekurzivno.
Neki od prekidaća su :
-h : ili “Human Readable” format - lakši za razumjevanje
-s : ili “Summary” odnosno sumariziran ispis bez ispisivanje svake datoteke i poddirektorija zasebno
Primjeri
1. Ispišimo samo sumarizirano (-s) zauzeće cijelog direktorija /home/ i svih njegovih poddirektorija zajedno (dakle koliko svi korisnici imaju u svojim “home” direktorijma) ali “lijepo” formatirano (-h):
Ova operacija može potrajati, ovisno o količini poddirektorija i datoteka
du -hs /home/ 54M /home/
Nakon što smo prošli diskovni podsustav i datotečni sustav, sljedeća veća komponenta samog računala i naravno njegovog operacijskog sustava je RAM (engl. Random Access Memory) ili “radna” memorija. RAM memorija se koristi za zapisivanje i čitanje podataka.
Ova memorija je specifična po tome što je brzina čitanja ili pisanja jednaka, neovisno o poziciji na koju se zapisuje, za razliku od drugih vrsta memorija poput tvrdog diska, CD/DVD i sl., koji imaju ova ograničenja zbog vrtnje ploča ili pomjeranja glave za čitanje/pisanje i sl.
Osim toga RAM memorija je vrlo brza, točnije najbrža memorija koju imamo u računalu. Vrijeme pristupa RAM memoriji se mjeri u nanosekundama dok se primjerice vrijeme pristupa tvrdog diska podacima, mjeri u milisekundama (što je oko 1.000.000.000 puta sporije). Osim toga i brzina prijenosa podataka RAM memorije je vrlo brza (također najbrža u našem računalu). Tako današnje DDR4 RAM memorije imaju propusnost od preko 50 GB/s.
Pojednostavljeno sve što radimo na računalu,prvo se učitava u RAM memoriju : od operativnog sustava, svih upravljačkih programa do naših programa koje koristimo.
Važno je znati kako se sadržaj RAM memorije gubi kod gašenja računala jer se RAM memorija mora stalno osvježavati (napajati).
Nakon uključivanja (pokretanja) računala:
boot loader-a, Sve navedeno se zapravo “učitava” u RAM memoriju.
BIOS je mali program koji je instaliran na matičnnoj ploči računala. On je zapravo vrsta “firmware”-a koji služi za inicijalizaciju hardvera, na najnižoj razini. Od inicijalizacije tipkovnice, miša, disk kontrolera, tvrdog diska, CD-DVD-ROM-a, do CPU-a ali i sve periferije. Ugrubo njegova osnovna namjena je inicijalizacija i testiranje svih hardverskih komponenti računala te pokretanje “boot loader”-a.
Dalje u radu, naš operativni sustav (u ovom slučaju Linux) i u konačnici naši programi, intenzivno koriste RAM memoriju, a sve što je od podataka potrebno sačuvati, zbog restarta ili gašenja računala, snima se na tvrdi disk.
Linux, zbog brzine rada, pokušava sve što je moguće više stvari (podataka) držati u RAM memoriji, a minimalno koristiti tvrdi disk.
Zbog gore navedene optimizacije u radu Linuxa, kod urednog gašenja Linuxa, on sve što je potrebno iz RAM memorije snima uredno na tvrdi disk te tek potom gasi računalo.
Problem nastaje kada se Linux nasilno ugasi : može se dogoditi da su svi vaši podaci ostali u RAM memoriji i da nisu snimljeni na tvrdi disk - sjetimo se kako se sadržaj RAM memorije gubi kod gašenja računala.
SDRAM (Synchronous Dynamic Random Access Memory) je DRAM (Dynamic Random Access Memory) vrsta memorije koja je sinkronizirana sa sistemskom sabirnicom.
To znači da ova vrsta memorije (a to su praktično sve današnje vrste memorija koje možemo susresti) čeka na signal takta (engl. clock signal) prije nego prihvati bilo koju kontrolnu naredbu. Svaka naredba prema memoriji se odrađuje unutar određenog takta, kroz takozvani cjevovod (engl. Pipeline) koji omogućava prihvaćanje većeg broja naredbi istovremeno.
Upotreba ovog cjevovoda omogućava prihvaćanje novih naredbi, prije nego li su prethodne izvršene tj. čekaju na izvršavanje. Obično postoje dva cjevovoda - jedan za čitanje a drugi za zapisivanje.
Kod zapisivanje podataka, naredbe za zapisivanje se ubacuju u cjevovod za zapisivanje, nakon prve naredbe može slijediti i druga u nizu, bez čekanja na dovršetak prve. Isto se događa i kod čitanja. Na konačan rezultat čitanja ili zapisivanja, tj. na dohvat podataka iz memorije, se zbog toga čeka određeni broj taktova - dok memorija stvarno za izvrši traženu operaciju,a ovo kašnjenje se zove SDRAM latencija (engl. Latency) i ona je važan parametar performansi memorije.
Memorija je podjeljena u određeni broj tkzv. “banki” (engl. Banks) ili područja za zapisivanje ili čitanje što omogučava čitanje ili pisanje u i iz više njih u isto vrijeme. Memorija je također podjeljena na stupce i polja za čitanje/pisanje.
Prve “modernije” vrste ovakve memorije su se jednostavno zvale SDR (Single Data Rate) SDRAM memorije, njeni nasljednici se zovu DDR (Double Data Rate) memorije.
Parametri rada
Tkzv (engl. Read cycle time) ili vrijeme odnosno ciklus čitanja je vrijeme između naredbe za čitanje određenog polja u memoriji i trenutka kada su ti podaci dohvačeni. Kod SDRAM memorije koja radi na 100MHz to vrijeme je bilo 10ns a kod DDR-400 memorije je to vrijeme smanjeno na 5ns, a toliko je ostalo i na svim novijim DDR memorijama.
Drugi parametar je (engl. Column Access Strobe (CAS) latency) koji označava vrijeme između slanja podatka o adresi polja i primanja stvarnih podataka. Brzina za gotovo sve vrste memorija je između 10.ns. i 15.ns. od starih SDR SDRAM do svih novih DDR (SDRAM) memorija. Jedino što se ovdje mijenja je broj ciklusa koji je potreban kako bi se odradila zadana operacija. S obzirom kako su vremena pristupa između 10.ns. i 15.ns. broj ciklusa na nižim taktovima je manji, dok je na većim taktovima veći : 10.ns. - 15.ns. na DDR-400 (radni takt 200MHz) je CL2-3 (2-3 takta) dok je to na DDR2-800 to CL4-6 tj. na DDR3-1600 je to CL8-12 taktova.
| SDR SDRAM memorija - oznaka | Takt (MHz) |
| PC66 | 66 |
| PC100 | 100 |
| PC133 | 133 |
Prve SDRAM memorije se zovu SDR (Single Data Rate) SDRAM memorije što znači da su omogučavale slanje jedne naredbe tj. čitanje/pisanje samo jednog podatka u jednom ciklusu (engl. clock rate).
Memorijski čipovi su radili uobičajeno na 100MHz ili 133MHz i imali su širinu sabirnice 4,8 ili 16 bita. Pošto se na svakom memorijskom modulu nalazi veći broj memorijskih čipova, memorijski moduli su bili 64 bitni (za non-ECC) ili 72 bitni (za ECC podvrstu memorije). Dakle omogučavali su čitanje ili pisanje 64 odnosno 72 bita po taktu.
DDR RAM
DDR RAM (engl. Double Data Rate) vrste memorija, tj DDR1 je nasljedila DDR2, potom DDR3 te DDR4 memorija iako imaj isto ime DDR, nisu kompatibilne jedna s drugom i to već od fizičkih dimenzija. One su u odnosu na starije SDR memorije omogučile veće frekvencije rada, kao i prijenos dvostruko više podataka u svakom taktu. Odatle i naziv “Double Data Rate”.
Koja je kalkulacija brzine prijenosa podataka:
Radni takt memorije (MHz) x Broj bitova koje može prenjeti od jednom / 8 (8 bitova = 1 bajt) = MB/s
Za SDR RAM = 100 MHz x 64 bita / 8 = 800 MB/s
Za DDR RAM istog takta = 100 MHz x 64 bita x2 (jer po taktu prenosi dvostruko više podataka) = 1600 MB/s
Fizički izgled DDR memorija:
(Slika je preuzeta s Wikipedije)
RAM memorije koje se danas koriste su : DDR4 ili DDR3 memorije.
Pogledajmo izmjerene stvarne brzine prijenosa podataka RAM memorija :
| Vrsta RAM Memorije i radni takt | Brzina GB/s |
| DDR4 - 3200 MHz | 51 |
| DDR4 - 2400 MHz | 38 |
| DDR4 - 2133 MHz | 34 |
| DDR3 - 1866 MHz | 30 |
| DDR3 - 1600 MHz | 25 |
| DDR3 - 1333 MHz | 21 |
| DDR3 - 1066 MHz | 17 |
| DDR2 - 667 MHz | 10 |
| DDR2 - 533 MHz | 8 |
Dual in-line Memory Module (DIMM) vrsta memorija zapravo označava fizički dizajn memorije, koja je naslijedila stariji oblik SIMM (Single In-line Memory Module) vrste memorija. Zapravo se radi o tome kako su stare SIMM memorije imale kontakte s obije strane memorijskog modula ali su kontakti s druge strane bili zapravo redundanti onima s prve strane. Osim toga SIMM memorije su bila 32. bitne. Kod DIMM memorija to nije slučaj, sve su 64. bitne te su kontakti s jedne strane pločice zaduženi za spajanje memorijskih čipova s jedne strane a drugi za spajanje memorijskih čipova s druge strane.
Fizički tipovi DIMM memorija:
| Broj pinova | Namjena |
| 72 | SO-DIMM (manji format) - za FPM DRAM i EDO DRAM |
| 100 | za printere |
| 144 | SO-DIM SDR SDRAM (manji format - za laptope i sl.) |
| 168 | SDR SDRAM |
| 172 | Micro DIMM - DDR SDRAM |
| 184 | DDR SDRAM |
| 200 | SO-DIMM (manji format - za laptope i sl.) - DDR SDRAM i DDR2 SDRAM |
| 204 | SO-DIMM (manji format - za laptope i sl.) - DDR3 SDRAM |
| 214 | SO-DIMM (manji format - za laptope i sl.) - DDR2 SDRAM |
| 240 | Micro DIMM - DDR2 SDRAM, DDR3 SDRAM, i FB-DIMM DRAM |
| 244 | Mini DIMM - DDR2 SDRAM |
| 260 | Mini DIMM - DDR4 SDRAM |
| 260 | SO-DIMM (manji format - za laptope i sl.) - DDR4 SDRAM |
| 260 | SO-DIMM “tip 2” (manji format - za laptope i sl.) - zarez na pločici je na drugom mjestu od prethodne 260 pin memorije - DDR3 ili DDR4 SDRAM |
| 288 | DDR4 SDRAM |
Postoji i nekoliko podvrsta memorija, koje se koriste uglavnom za poslužitelje ili posebne namjene.
Pogledajmo koje su to podvrste memorija.
ECC (engl. Error Correcting Code) tip memorije može detektirati i ispraviti greške u radu memorijskih čipova unutar memorijskog modula.
Detekcija i ispravljanje grešaka se odnosi na pogrešku unutar jednog bita podataka unutar jednog memorijskog modula i to na bilo kojem memorijskom čipu.
Detekcija i korekcija jednog bita se odnosi na mogućnost otkrivanja i ispravljanja greške na jednom bit na 64-bitnoj “riječi” (jedinica oriujenosa podataka kroz memorijsku sabirnicu). Uglavnom novije ECC memorije i memorijski kontroleri mogu otkriti (ali ne i ispraviti) i greške na dva bita po 64-bit-noj riječi.
Novije verzije ECC memorija i memorijskih kontrolera koji ih podržavaju, razvijaju se sa mogućnosti detekcije i korekcije dva pogrešna bita na 64-bit-nu riječ.
Za funkcionalnost ECC memorije, potrebna je i podrška od strane matične ploče odnosno memorijskog kontrolera, koji mora podržavati ECC memoriju. Dakle ECC memorije se ne mogu koristiti na matičnim pločama koje ih ne podržavaju (iako ih je fizički moguće ugraditi). To je zbog toga što funkcionalnost detekcije i korekcije greške odrađuje tkzv. EDAC čip odnosno njegova funkcionalnost je integrirana na svim novijih procesorima (engl. CPU) koji podržavaju ECC memoriju.
Postoji i još naprednija vrsta korekcije greške, patentirana od IBM-a pod nazivom “Chipkill ECC”, koja omogućava korekciju više bitova grešaka ili čak gubitak cijelog memorijskog čipa na memorijskom modulu.
Slika : Izgled SDR SDRAM PC-100 ECC memorije - obratite pažnju na broj čipova (9), za razliku od “obične” RAM memorije koji ih obično imaj 8:
U čemu je problem
Električne ili magnetske smetnje unutar računala mogu uzrokovati greške unutar memorijskih čipova, tako da dolazi do pogrešaka unutar jednog bita točnije rečeno, moguće je da jedan bit pređe u drugo stanje : 0 u 1 ili 1 u 0. Osim toga, moguće su i greške u samim čipovima, zbog pregrijavanja ili drugih faktora. Drugi najčešći faktor je pozadinsko zračenje (engl. Background Radiation) odnosno ionizirajuće zraćenje kojemu smo i sami izloženi a koje dolazi iz raznih “umjetnih” i prirodnih izvora (zračenje zvijezda i sl).
Postoji bojazan da će s obzirom na činjenicu da sve komponente pa i memorijski čipovi postaju sve manji te rade na sve manjim naponima, učinak pozadinskog zračenja postati sve veći. Ovu teoriju podupire činjenica da će neželjene čestice manjih energija moći neželjno mijenjati stanje memorijskih “stanica” (engl. Memory Cell).
Studija koju je provodio Google od 2007 do 2009 u koju je uključio vrlo veliki broj poslužitelja, a čiji su rezultati prikazani na konferenciji “SIGMETRICS/Performance” 2009. godine pokazala je da su ove greške mnogo češće nego su na to ukazivali laboratorijski rezultati ili teorija.
Skraćeno , rezultat je :
Više od 8% DIMM memorijskih modula na godinu, bilo je pogođen ovim greškama
Posljedice ovakvih grešaka (uglavnom grešaka na jednom bitu memorije), na sustavima koji nemaju ECC memorije mogu dovesti do rušenja aplikacije ili operativnog sustava ili korupcije podataka. Na velikim sustavima ovakve greške su jedan od češćih uzroka rušenja sustava.
ECC tip memorije se ugrađuje u “Cache” memorije unutar procesora. Dakle Level 1,2 ili 3 memorije unutar CPU-a su ECC memorije.
Linux
Iako možda ne zvuči nužno ili se o tome baš i ne razmišlja ali osim toga što nam ECC memorija u pozadini detektira i riješava pogreške, često želimo biti svjesni toga. Dakle možda neka od ECC memorija ugrađenih u naš poslužitelj stalno ima nekih problema koji se stalno i detektiraju i ispravljaju a da toga nismo svjesni.
Zbog ovoga je razvijena funkcionalnost, koja omogućava Linuxu, pristup memorijskom kontroleru (za koji smo rekli da je u novije vrijeme unutar CPU-a) i to njegovom EDAC dijelu, koji je zadužen za detekcije i korekcije grešaka na ECC memoriji.
Ova funkcionalnost je potpuno dostupna na svim kernelima 2.6.32 na dalje, te može biti već kompajlirana u kernel ili dostupna kao kernel modul.
Sastoji se od dvije komponente:
edac_core kernel module] komponente isb_edac ,e752x_edac, i7core_edac, i7300_edac , … kernel moduli]Info : Linux EDAC (https://www.kernel.org/doc/Documentation/edac.txt)
Primjeri:
Ako imamo Intel Sandy Bridge ili Ivy Bridge (točnije govorimo o njihovim memorijskim kontrolerima), tada je potrebno imati dva kernel modula:
edac_core koji je centralna komponenta tesb_edac koji je kernel modul za naš CPU/memorijski kontrolerProvjerimo da li su učitani :
lsmod | grep edac sb_edac 16606 0 edac_core 47267 3 sb_edac
Vidljivo je da edac_core koristi sb_edac što je ispravno.
Svi podaci i statistike EDAC-a se sada nalaze unutar strukture direktorija : /sys/devices/system/edac/mc/
Prvo pogledajmo koje sve memorijske utore imamo na sustavu:
dmidecode -t memory | grep "Locator: DIMM"
Locator: DIMM_A1
Locator: DIMM_A2
Locator: DIMM_A3
Locator: DIMM_A4
Locator: DIMM_A5
Locator: DIMM_A6
Locator: DIMM_A7
Locator: DIMM_A8
Locator: DIMM_A9
Locator: DIMM_A10
Locator: DIMM_A11
Locator: DIMM_A12
Locator: DIMM_B1
Locator: DIMM_B2
Locator: DIMM_B3
Locator: DIMM_B4
Locator: DIMM_B5
Locator: DIMM_B6
Locator: DIMM_B7
Locator: DIMM_B8
Locator: DIMM_B9
Locator: DIMM_B10
Locator: DIMM_B11
Locator: DIMM_B12
Ako gore navedena naredba ne daje rezultat, možemo probati sa :
dmidecode -t memory | egrep "Locator: A|Locator: B"
Dakle imamo 12 utora za prvi CPU i 12 utora za drugi CPU. Ovo je poslužitelj sa dva fizička procesora (CPU) i ukupno 24 memorijska utora.
Memorijski kontroler na svakom procesoru ima četiri memorijska kanala. Dakle ukupno ih imamo osam.
Sada možemo provjeriti stanje svih memorijskih kanala odnosno da li unutar nekog od memorijskih kanala ima grešaka na RAM memorijama koje su unutar kanala .
grep "[0-9]" /sys/devices/system/edac/mc/mc*/csrow*/ch*_ce_count /sys/devices/system/edac/mc/mc0/csrow0/ch0_ce_count:0 /sys/devices/system/edac/mc/mc0/csrow1/ch0_ce_count:0 /sys/devices/system/edac/mc/mc0/csrow2/ch0_ce_count:0 /sys/devices/system/edac/mc/mc0/csrow3/ch0_ce_count:0 /sys/devices/system/edac/mc/mc1/csrow0/ch0_ce_count:0 /sys/devices/system/edac/mc/mc1/csrow1/ch0_ce_count:0 /sys/devices/system/edac/mc/mc1/csrow2/ch0_ce_count:0 /sys/devices/system/edac/mc/mc1/csrow3/ch0_ce_count:0
Ispis smo razlomili na dva dijela (da se vidi što pripada prvom procesoru a što drugom).
Preciznije rečeno - sve što se nalazi unutar /sys/devices/system/edac/mc/mc0/ pripada prvom memorijskom kontroleru (mc = “memory controller”) a sve što je unutar /sys/devices/system/edac/mc/mc1/ pripada drugom. S obzirom kako se memorijski kontroleri nalaze unutar samog procesora (CPU) i prva izjava je točna.
U našem primjeru sve je u redu, pošto su sva stanja 0 - dakle 0 grešaka.
Što se još nalazi unutar svakog poddirektorija unutar /sys/devices/system/edac/mc/mc*/:
“Registered” memorija ili također poznata kao “Buffered Memory” ima poseban elektronički sklop zvan “Register”, na samom memorijskom modulu, koji se logički nalazi između memorijskih čipova na modulu i memorijskog kontrolera na matičnoj ploči.
Ovaj čip se koristi za stabilizaciju električnog opterečenja prema memorijskom kontroleru te omogućava ugradnju veće kolićine memorije na matičnu ploču. On je također zadužen i za “Buffer”-iranje kontrolnih linja prema samoj memoriji.
Registered memorije mogu biti “obične” ali i “ECC” memorije. Registered memorije neće raditi na matičnim pločama koje ih ne podržavaju.
Što se naziva tiće, “običnu” memoriju, u odnosu na ovu, nazivamo i “Unbuffered memory” ili “Unregistered memory” dok se “Registered” memorija naziva i RDIMM memorija.
Slika : 4GB 240 pin DDR2-3200 ECC Registered memorija:
Buffered Memory je stari naziv za Registered memoriju dok je Fully Buffered Memory ili FB-DIMM koristi buffer prema kontrolnim linijama memorije ali i prema svim podatkovnim linijama, stoga ove memorije imaju posebne dodatne čipove koji dodaju ovu funkcionalnost. Dakle između memorijskih čipova na memorijskom modulu i memorijskog kontrolera na matičnoj ploči (fizički na memorijskom modulu) je ugrađen AMB (engl. Advanced Memory Buffer) čip. Za razliku od “normalne” memorijske sabirnice koja je paralelna, pa je i sama memorija paralelna, kod FB-DIMM memorija AMB serijalizira sav promet i dalje ih paralelizira prema memoriskim čipovima na samom memorijskom modulu. Ova operacija pojednostavljuje pritup memoriji sa strane memorijskog kontrolera ali unosi malo kašnjenje zbog dodatne obrade koju odrađuje AMB. Neki AMB čipovi sami mogu odrađivati ECC funkcionalnost odnosno korekciju greške. Ova vrsta memorije kontrolira napajanje, sično kao Registered memorije. FB-DIMM radi samo na matičnim pločama koje podržavaju ovu vrstu memorije. FB-DIMM može biti i ECC.
Load Reduced DIMM (LRDIMM) je slična kao Registered ili FB-DIMM s time da LRDIMM ima čip koji buffferira kontrolne ali u ovom slučaju i podatkovne linije ali u paralelnom načinu rada. S ovime se zadržala velika brzina rada, mogućnost instalacije valike količine memorije na matičnu ploču uz malo kašnjenje zbog dodatne obrade kao što ga ima i FB-DIMM sa AMB čipom.
Ova vrsta memorije mora biti podržana na vašoj matičnoj ploči. Koristi se uglavnom za velike poslužitelje koji trebaju podržavati najveću moguću količinu RAM memorije.
Slika : Samsung LRDIMM DDR4-2133 32GB:
Slika je preuzeta sa Puget systems
Stariji procesori (CPU) imali su samo 32.bitnu arhitekturu te su samim time podržavali 32.bitno adresiranje RAM memorije. Ovdje se radi o tome da je sa 32. bita ili 232 moguće adresirati samo 4GB RAM memorije.
S druge strane procesori koji imaju 64. bitnu arhitekturu, što znači da su im 64. bitni : podatkovna i adresna sabirnica, registri, itd., te podržavaju adresiranje puno veće količine RAM memorije tj. 264 što je mogućnost adresiranja do 16 eksabajta RAM memorije. U praksi su zbog raznih razloga ti limiti drugačiji te je u 64. bitnom Linuxu moguće adresirati do 64TB RAM-a.
Važno je znati da osim samog procesora (CPU) i operacijski sustav mora biti 64. bitan, kao i svi upravljački i drugi programi koji su bitni za funkcioniranje operacijskog sustava.
Na 64. bitnom operacijskom sustavu, moguće je izvršavati i “stare” 32. bitne programe, uglavnom bez ikakvih problema. S druge strane 64. bitne aplikacije NIJE moguće izvršavati na 32. bitnom opercijskom sustavu !.
“Memory management” je proces upravljanja memorijom na razini operacijskog sustava. Njegova osnovna zadaća je osigurati mogućnost dinamičkog alociranja memorije, na zahtjev programa (procesa odnosno aplikacije) ali i osloboditi memoriju u trenutku kada više nije potrebna. Ova zadaća je vrlo važna i to dodatno s obzirom na činjenicu da su svi današnji Linuxi, kao i drugi operacijski sustavi u kojima više programa/procesa/aplikacija radi u isto vrijeme optimizirani za korištenje RAM memorije što je više moguće. To znači da će Linux pokušati iskoristiti što je više moguće RAM memorije na “inteligentan” način - da bi se ubrzale sve operacije koje se na taj način mogu ubrzati. Ovo ubrzanje se uglavnom odnosi na minimalnu upotrebu “swap”-a te na zapisivanje podataka na diskovni sustav tek kada je to stvarno neophodno.
Memory management koristi nekoliko metoda da bi povećao efikasnost korištenja memorije.
“Virtual memory systems”
Upotreba tkzv. virtualne memorije je metoda koja se koristi za odvajanje virtualnih memorijskih adresa koje koriste procesi, od stvarnih memorijskih adresa RAM memorije. Ova metoda omogućava odvajanje procesa u smislu korištenja posebnog memorijskog adresnog prostora te efikasnijeg korištenja RAM memorije pomoću metode koja se zove “Paging”.
Osim toga “Memory management” može koristiti i “Swapping” na disk, prema potrebi.
I na kraju, kvaliteta memorijskog managera ima znatan utjecaj na performanse cijelog sustava.
Korištenje Virtualne memorije odvaja korištenje fizičke memorije i od same aplikacije odnosno procesa. Dakle aplikacije koriste virtualni adresni prostor i to na način da kada aplikacija treba pristupiti memoriji, zahtjev za memorijskom adresom se translatira (pretvara) iz virtualnog adresnog prostora u fizički adresni prostor.
Ovo znači da vaš program nikada ne koristi “stvarne” memorijske adrese (tj. adrese fizičke RAM memorije), niti ima pristup do njih. Umjesto toga svaki program dobiva virtualne memorijske adrese koje koristi.
Memorijske adrese su zapravo pokazivači na memorijske lokacije na kojima se nalazi naš program. Kada program treba nešto zapisati ili čitati u ili iz memorije, on mora provjeriti s koje memorijske adrese će čitati koji dio podataka. O točnom načinu čitanja i zapisivanja ćemo kasnije kada budemo pričali o Pagingu.
Dakle upotrebom virtualne memorije, operativni sustav ima potpunu kontrolu nad fizičkom memorijom odnosno nad njenim pristupom. Samim time operativni sustav može ograničiti način na koji procesi (aplikacije) pristupaju memoriji. Ta kontrola se zove Memory protection odnosno sustav zaštite memorije i ona ograničava pristup svakog procesa, na dio memorije koji je alociran samo za njega te mu onemogućava ulazak u adresni prostor nekog drugog procesa (aplikacije). Implikacije ovoga su vrlo jasne : onemogućavanje malicioznih namjernih ili nenamjernih radnji.
Iako svaki proces (aplikacija) radi unutra svog ograničenog adresnog prostora u memoriji, često je potrebno dijeljenje određenog adresnog prostora memorije između više aplikacija. Primjerice potreban je pristup podacima koji se dijele između procesa (aplikacija). Klasičan primjer su neke biblioteke, kojima treba pristupati veći broj procesa (aplikacija) istovremeno. Ova metoda se zove Shared Memory.
Shared Memory odnosno sustav dijeljenja memorije je najbrža metoda za komunikaciju između procesa (aplikacija). Ovo se postiže klasifikacijom pristupa memoriji na tkzv. Primary Storage i Secondary Storage. Jedan od zadataka Memory Managera je i baratanje s ove dvije vrste pristupa memoriji, na razini svakog procesa.
Dakle adresni prostor koji vidi proces (aplikacija), aplikaciji izgleda kao kontinuirani adresni prostor, koji se sastoji od više dijelova ili segmenata.
Translacija Virtualnih adresa u fizičke se događa unutar procesora (CPU) i to unutar dijela koje se zove Memory Management Unit (MMU).
Slika prikazuje način mapiranja virtualne memorije u fizičku memoriju:
Prije nego se uveo “Paging”, operacijski sustav je morao učitati cijeli proces (aplikaciju) u memoriju, popunivši ju u kontinuiranom slijedu. S obzirom kako se ista stvar morala raditi za svaki proces (program), svaki od njih je zauzeo memoriju u kontinuiranom nizu. Problem je nastajao kada bi se neki proces (aplikacija) ugasio, te bi na tom mjestu ostala “prazna” odnosno nekorištena memorija i ta fragmentacija bi se sve više povećavala, gašenjem i podizanjem novih procesa (aplikacija) te uzrokovala probleme.
Kao što smo spomenuli, virtualna memorija je podjeljena na segmente odnosno tkzv. stranice (engl. Pages) odnosno blokove virtualnog adresnog prostora. Ovi blokovi su uglavnom veličine 4kB. Dakle sva raspoloživa memorija je “razlomljena” u blokove od 4kB. Slično kao što je površina tvrdog diska, razlomljena u sektore, koji su najmanje jedinice za zapis podataka na tvrdi disk.
Dijeljenje memorije (engl. Sharing) koje smo također spominjali, se nadzire od “Memory managera”.
Svaki proces (aplikacija) u memoriji podjeljen je u blokove (Pages) i to na način da je izvršni dio programa u jednom dijelu a dio koji sadrži podatke u drugom dijelu memorije razlomljene u blokove tj. “Pages”.
Memorija se djeli tako što se unutar tkzv. tablice stranica memorije (engl. Page Table) za različite procese, pokazuje na iste stranice (Memory Page) koje su dijeljene između njih.
Kako to radi
Korištenjem modela dijeljenja memorije, više nema potrebe za dupliciranjem zauzeća memorije. Osim toga na ovaj način procesi (aplikacije) lakše mogu dijeliti podatke. Dio memory managementa zadužen za dijeljenje memorije se zove “IPC System” (Inter Process Communication).
Pojednostavljeno više procesa (aplikacija) dijeli dio memorije, koji se koristi za njihovu međusobnu komunikaciju.
Ti dijelovi memorije, zbog toga što se dijele između procesa, moraju imati kontrolu : tko im može pristupiti a tko ne može. Za to je potreban mehanizam zaključavanja pristupa (engl. Locking) tom dijelu memorije. Ovdje se uključuju tkzv semafori (engl. Semaphores),a oni su zapravo jednostavne zastavice (engl. Flags).
Semafori odnosno zastavice rade tako da ako se određeni dio dijeljene memorije trenutno koristi od strane nekog procesa (aplikacije), tada se podiže zastavica i drugi procesi (aplikacije) koje bi u istom trenutku također željele pristupiti toj memoriji (na toj adresi), moraju malo pričekati, sve dok se semafor za pristup ne isključi.
Naredba koja barata s IPC System (Inter Process Communication) je ipcs.
Veličina odnosno količina RAM memorije koja se može koristiti kao “Shared Memory”, je definirana za cijeli operacijski sustav ali se može i povećavati ili smanjivati. Njena veličina je definirana brojem blokova (standardne veličine 4KB)
Postoje dva limita na veličinu dijeljene memorije:
Kako provjeriti ove vrijednosti ?.
Provjera veličine bloka - ovo je “Page size” (obično je 4096 byte tj. 4KB):
sysctl kernel.shmmni kernel.shmmni = 4096
Provjera SHMMAX:
sysctl kernel.shmmax kernel.shmmax = 68719476736
Provjera SHMALL:
sysctl kernel.shmall kernel.shmall = 4294967296
Izračun i opis parametara
SHMALL
Ova vrijednost može biti jednaka cijeloj RAM memoriji, jer želimo omogućiti upotrebu cijele RAM memorije kao dijeljene memorije.
Računica : RAM (GB) x 1024 x 1024 x 1024 = RAM u byte-ima / 4096 (tj. SHMMNI)
Primjerice za 8GB RAM = 8 x 1024 x 1024 x 1024 = 8589934592 / 4096 = 4194304
Dakle SHMALL treba biti veličine 4194304 (stranica)
Dodajmo ovu vrijednost trajno (u /etc/sysctl.conf)
kernel.shmall = 4194304
SHMMAX
Ova vrijednost definira maksimalnu veličinu (u byte-ima) pojedinog segmenta dijeljene memorije koji se može alocirati u adresnom prostoru (preko Linux sustava virtualne memorije). Ova vrijednost, naravno, mora biti manja od SHMALL.
U prosjeku, dovoljno je imati mogućnost kako bi se polovica RAM memorije mogla koristiti kao jedan segment dijeljene memorije.
Vrijednost SHMMAX je gornji limit, koliko maksimalno dijeljene memorije pojedini proces može alocirati.
Dakle ako imamo 8GB RAM i želimo da ova granica bude 4GB tada je računica :
4 GB x 1024 x 1024 x 1024 = 4294967296
Postavimo ovu vrijednost (u novi red) u /etc/sysctl.conf .
kernel.shmmax = 4294967296
Sada, nakon ove dvije promijene, potrebno je učitati nove promijene za SHMALL i SHMMAX.
sysctl -p
Nakon prvog restarta računala ove promijene će biti učitane automatski.
“Page Table” ili tablica memorijskih stranica odnosno blokova je strukturirana tablica u kojoj se nalaze sva mapiranja između virtualnih i fizičkih memorijskih adresa.
U operacijskim sustavima, koji koriste virtualnu memoriju (svi moderni OS-ovi) svaki proces vidi svoju memoriju koju koristi kao kontinuiranu. Zapravo je ta memorija raspoređena po fizičkoj RAM memoriji i eventualno se još nalazi dijelom na “Swap” particiji tvrdog diska. Kada proces (aplikacija) traži pristup memoriji, u nadležnosti je operacijskog sustava, da pogleda u “Page Table” tablicu te napravi povezivanje (mapiranje) virtualne memorijske adrese i fizičke memorijske adrese te dohvati tražene podatke (pročita ili snimi [“read” ili “write” ]).
Svaki unos u tablici : Virtualna adresa ↔ Fizička adresa se zove “Page table entry” (PTE).
“Memory Managemet Unit” (MMU) procesora (engl. CPU) pohranjuje (engl. Cache) unose iz “Page” tablice koji su nedavno korišteni, u svoju internu (vrlo malu) memoriju odnosno svoj međuspremnik (engl. Buffer). Ovaj međuspremnik se zove “Translation Lookaside Buffer” (TLB).
Kada se virtualna adresa treba translatirati u fizičku, prvo se provjerava TLB. Ako je unos pronađen i fizička adresa je poznata, nastavlja se s pristupom memoriji.
Ako traženi unos ne postoji u TLB memoriji (ovo je tkzv. “TLB miss”), nastavlja se s čitanjem originalne “Page” tablice i traži se potreban unos (ovo se zove “Page walk”). Kada se unos pronađe on se odmah i upisuje u TLB memoriju te se ponovno pokreće proces čitanja iz TLB memorije. Potom se standarno nastavlja s pristupom fizičkoj memoriji tj. točnoj adresi u njoj, gdje se nalaze traženi podaci.
Ovo je proces koji se stalno ponavlja, s obzirom da u TLB memoriju modernih procesora (CPU) stane tek nekoliko stotina unosa. Moramo biti svjesni da, što se više memorije alocira i dodjeli procesima (aplikacijama), “Page table” sve više i više raste. S obzirom je da “Page size” samo 4KB, to praktično znači da je za svakih alociranih 1GB RAM memorije, potrebna Page tablica, sa 262144 unosa, koji se stalno pretražuju, a oni zadnji korišteni se stavljaju u TLB međuspremnik, kako je gore objašnjeno.
Ako primjerice imate 8GB RAM koja je potpuno iskorištena, to znači da će “Page” tablica narasti na 2 097 152 unosa. Jasno je da ovo unosi znatne probleme, kod aplikacija koje koriste veću količinu RAM memorije, jer za svaki pristup svakoj pojedinoj memorijskoj lokaciji slijedi proces od gore (dakle pretraživanje stotine tisuća ili mlijuna unosa, za svako čitanje ili pisanje po svakoj lokaciji memorije veličine 4KB ).
Koliki je TLB modernih procesora
Za primjerice Intel “Nehalem” mikroarhitekturu odnosno generaciju CPU-a, stanje po pitanju Cache/TLB-a je sljedeće.
Ova generacija procesora ima dvo razinski Cache/TLB: manji L1 (ITLB1 i DTLB1) koji je i najbrži te potom veći L2 (DTLB1 ), koji je i malo sporiji. Koje su njihove veličine odnosno kapacitet ?
Pogledajmo sada procesor : Intel “Core 2 Duo E7500”, sa dvije fizičke jezgre :
Sada pogledajmo i noviji poslužiteljski procesor “Xeon” i to model “E5-2650 V.3”.
Slika prikazuje sustav sa 128GB RAM, od kojih 64GB pripada prvom fizičkom procesoru a 64GB drugom:
Ova logička shema je dobivena s naredbom :
lstopo --whole-system --no-io
Ovisno o arhitekturi samog procesora, TLB se nalazi unutar L1, L2 ili unutar MMU dijela CPU-a.
Vidljivo je da prvi fizički procesor (Socket P#0) ima fizičkih 10 jezgri (P#0 do P#12) a unutar svake od njih se nalaze po dvije logičke jezgre (to su “Hyper Threading” jezgre), oznaka PU P#“BROJ jezgre”.
Istu konfiguraciju ima i drugi fizički procesor. Naime ovo je poslužiteljska matična poloča koja ima dva procesora Intel Xeon E-2650 v.3. sa ukupno 40 jezgri (20 na prvom a 20 na drugom fizičkom procesoru).
Vratimo se na TLB
Slika prikazuje proces dohvaćanja podataka iz Page tablice i TLB memorije:
Dobro je znati kako se proces koji slijedi kod TLB promašaja (engl. TLB miss) može odraditi na dva načina :
Prosječne performanse TLB-a :
Osnovna računica ako je vrijeme dohvata 1 takt, a promašaj 30 taktova te postotak promašaja 1% , tada je potrebno 1.3 taktova procesora za dohvaćanje jednog unusa u TLB tablici.
Zbog čega toliko priče o TLB-u ?
Kao što smo rekli operacijski sustav istovremeno obrađuje više procesa u pozadini. To “istovremeno” baš i nije potpuno točno. Naime jedan procesor, odnosno u novijim arhitekturama se to odnosi na jednu jezgru procesora (engl. CPU Core), u bilo kojoj jedinici vremena, u stanju je obrađivati samo jedan tok informacija odnosno jedan proces ili nit (engl. Thread), potom se prebaciti na drugi, pa na prvi , i tako dalje - a ovo prebacivanje se zove “Context Switching”. Ovo je zapravo “Multitasking” ili “višezadaćnost” odnosno privid da jedan procesor može obrađivati više zadataka (engl. Tasks).
Kod ovog prebacivanja između procesa, TLB tablica se u većini slučajeva mora isprazniti (engl. TLB Flush), pošto je vrlo vjerojatno da će većina ako ne i gotovo svi unosi u tablici biti nevažeći. Nevažeči zbog toga jer je TLB prilično malog kapaciteta, a svaki proces koristi druge djelove memorije, pa prema tome mapiranja koja su ostala u TLB memoriji pokazuju na translacije (virtualna memorija - fizička memorija )za adrese koje novi proces ne koristi - on je u nekom drugom opsegu memorijskih adresa.
Svako novo prebacivanje između procesa odnosno “Context Switch”, prazni TLB memoriju, te ju ponovno popunjava pretraživanjem “glavne” “Page” tablice. S obzirom kako se svake sekunde dešava ogroman broj ovih prebacivanja, jasno je koliko ovo može utjecati a i utiče na performanse sustava.
Ovo nije jedini problem koji uzrokuje “Context switching”, isto tako se uz pražnjenje TLB-a, briše i večina registara procesora, koji se moraju ponovno popuniti kod svake nove promjene procesa.
KSM (Engl. kernel same-page merging) odnosno spajanje istih (100% identičnih) stranica memorije je funkcionalnost kernela koja omogućuje sustavu dijeljenje identičnih memorijskih stranica između više procesa ili u slučaju virtualizacije – između više virtualnih računala.
Naime u slučajevim upotrebe kod virtualizacije na Linuxu, preko Linux KVM (Engl. Kernel Virtual Machine) komponente, KVM može koristiti KSM između više virtualnih računala.
Kako to radi ?
KSM obavlja dijeljenje memorije s istim sadržajem, skeniranjem cijele memorije i pronalaženjem dupliciranih memorijskih stranica.
Prisjetimo se sustava virtualne memorije u kojemu se sve što se čita ili zapisuje u sustav virtualne memorije, zapisuje u najmanje logičke cjeline koje nazivamo stranice (Engl. Pages). Te stranice su zapravo najmanji „blokovi podataka“ koji se zapisuju u RAM memoriju. U normalnom radu, često se događa da više procesa (programa/aplikacija) u nekom trenutku rada imaju određene blokove podataka koji su identični. Ovakav scenarij postaje još vidljiviji kod virtualizacije.
Zamislimo slučaj kada na jednom poslužitelju pokrećemo 10 virtualnih računala, koja imaju identični operacijski sustav, iste upravljačke programe, te veliki broj identičnih sistemskih programa koje pokreću.
Dakle u RAM memoriju se učitava cijeli niz podataka koji je identičan za svih ovih 10 virtualnih računala. Zašto bi se onda isti sadržaj kopirao deset puta u RAM memoriju.
Zadaća KSM-a je da u određenim vremenskim intervalima skenira cijelu RAM memoriju i pronalazi blokove podataka koji su 100% identični. U našem slučaju naišao bi na cijeli niz blokova (Memory Pages), koji su identični:
KSM bi potom obrisao sve pronašene kopije i ostavio sam jednu od njih, a na pozicijama svih kopija bi stavio samo poveznicu na “original”, koji se dijeli (Engl. Share) između svih njih.
Možemo reći kako se sve “kopije” spajaju (Engl. Merge) u jednu, koja se onda dijeli među njima - radi se nešto poput „Soft Linkova“ na original.
Sve te memorijske stranice koje je KSM „odradio“ na taj način (jer su duplikati), se označavaju kao „copy-on-write“ (COW). Zbog ovih oznaka kernel je u bilo kojem trenutku svjestan kako se radi o KSM stranicama i ako na bilo kojem procesu ili Virtualnom računalu koje koristi te memorijske stranice, dođe do bilo koje promjene, one se počinju zapisivati na druge memorijske adrese.
Podrška za KSM je uvedena od Linux kernela 2.6.32.x koji je objavljen krajem 2009 godine.
Postoje i neke stvari KSM-a za koje se trebamo zapitati, koliko su dobre
Zbog efikasnosti upotrebe ovakvog mehanizma, kernel mora proces pronalaska “duplikata u memoriji” tražiti u određenim vremenskim intervalima ali ne prečesto, da ne bi trošio previše resursa, i to prvenstveno CPU resursa. POšto je ovo prilično zahtjevan process za CPU, potreban je mehanizam koji će paziti na korištenje CPU resursa s jedne strane a s druge strane odraditi ovaj zadatak dovoljno brzo. S obzirom na činjenicu kako se stanje memorije stalno mijenja, I ovaj process se mora pokretati dosta često, ali opet ne prečesto.
Ovdje se radi o balansu između CPU resursa i RAM resursa :
Postoji i bojazan da KSM može predstavljati sigurnosno rizik, prema ovom dokumentu .
Mjerenja
Testiranja od strane tvrtke „RedHat“ rađena su na način da su pokrenuta 52 virtualna računala Windows XP, a svakom od njih je dodjeljeno 1GB RAM memorije. Svih 52 virtualna računala su uspješno pokrenuta na poslužitelju sa samo 16GB RAM, na kojemu je bio uključen KSM.
Moja osobna iskustva su iz područja upotrebe KSM mehanizama za virtualizaciju, gdje su pokazala solidne rezultate, bez vidljivih usporavanja sustava.
Test:
Slika prikazuje statistiku zauzeća RAM memorije i upotrebu KSM memorije:
Iz slike je vidljivo da je:
To znači da bi zauzeće RAM-a bez KSM-a bilo 70.7GB a s njim je samo 39.7GB.
Naredba free daje nam ispis stanja iskorištenosti RAM memorije i SWAP memorije (diska).
Pogledajmo ispis na računalu s 3.5 GB RAM-a:
Naredbu smo pokrenuli s prekidačem -m koji daje prikaz memorije u MB.
free -m
total used free shared buffers cached
Mem: 3479 1521 1958 25 160 1050
-/+ buffers/cache: 309 3169
Swap: 1999 0 1999
Vidljivo je da je ukupno dostupno 3497MB (oko 3.4GB) [Total Mem] , zbog toga jer je razlika od 3.5GB do 3.4GB iskorištena od strane Linux kernela. Od toga je iskorišteno 1521 MB [Used] Slobodno je 1958 MB [Free]
Iskorišteno za posebnu nemjenu je :
Memorija koja je označena kao “Buffers” se koristi kao međumemorija za blok uređaje (engl Block devices) i pokriva “cache” metapodataka datotečnog sustava, kao i praćenje stranica memorije (Memory Page). Pod metapodatke se smatraju podaci o tome što je recimo unutar direktorija, koje ovlasti (engl. permissions) su nad tim datotekama ili podaci o memoriji s koje ili na koju se čita s blok uređaja.
Memorija označena kao “Cache” sadrži sadržaj samih datoteka.
Ako se sjetimo da je na Linux/Unix sustavima “Everything is a file” i činjenice da je RAM memorija tisuće puta brža od diska, te da je Linux optimiziran da sve što može drži u RAM memoriji, a tek kada je stvarno potrebon to i sprema na tvrdi disk, ove “Cache” i “Buffer” memorije počinju sve više imati smisla.
Kao što smo rekli sadržaj /proc/ direktorija je specifičan po tome da su u njemu virtualne datoteke koje pokazuju na parametre, vrijednosti i informacije raznih dijelova susstava odnosno kernela. Čitanjem sadržaja datoteke /proc/meminfo dobivamo podatke o RAM memoriji, koje nam prikuplja kernel.
Pogledajmo kako to izgleda :
cat /proc/meminfo MemTotal: 3562724 kB MemFree: 1952044 kB Buffers: 167456 kB Cached: 1115380 kB SwapCached: 0 kB Active: 614820 kB Inactive: 758876 kB Active(anon): 91284 kB Inactive(anon): 25872 kB Active(file): 523536 kB Inactive(file): 733004 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 2047996 kB SwapFree: 2047996 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 90856 kB Mapped: 38140 kB Shmem: 26300 kB Slab: 174840 kB SReclaimable: 144312 kB SUnreclaim: 30528 kB KernelStack: 3648 kB PageTables: 12188 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 3829356 kB Committed_AS: 395020 kB VmallocTotal: 34359738367 kB VmallocUsed: 297852 kB VmallocChunk: 34359435124 kB HardwareCorrupted: 0 kB AnonHugePages: 22528 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 8832 kB DirectMap2M: 3821568 kB
Dakle ovdje su vidljivi razni podaci o RAM memoriji, slično kao kod naredbe free ali s puno više detalja.
Obasniti ćemo samo neke od njih:
mmap sistemske naredbe.
Ova naredba se najčešće koristi za ipisivanje odnosno izlistanje aktivnih procesa ali moguće je saznati i neke dodatne informacije o procesima, vezanim za memoriju.
Primjeri
1. Izlistajmo sve aktivne procese, uz pripadajuće vrijednosti minor i major “page faults” te naredbu s kojom su pokrenuti.
ps -eo min_flt,maj_flt,cmd
MINFL MAJFL CMD
1182 17 init [2]
0 0 [kthreadd]
0 0 [migration/0]
0 0 [ksoftirqd/0]
0 0 [stopper/0]
0 0 [watchdog/0]
... ... ....
Opis parametara :
2. Pogledajmo pripadajuće vrijednosti minor i major “page faults” te naredbu s kojom je pokrenut , točno određeni proces, prema njegovom PID-u.
Nas zanima naš Apache httpd servis čiji PID je 6441
ps -o min_flt,maj_flt,cmd 6441 MINFL MAJFL CMD 1932 0 /usr/sbin/httpd
Podsjetimo se - major “page faults” treba težiti nuli (0) ili imamo nekih problema koje smo opisali ranije.
Naredba vmstat daje nam informacije o:
Sada ćemo se fokusirati na memoriju.
Naredbu vmstat možemo pokrenuti samu ili s nekim od prekidača.
Mi ćemu ju pokrenuti s prekidačem koji će nam dati tablični ispis , tj. vmstat -s
vmstat -s
3562724 total memory
1854168 used memory
706144 active memory
881404 inactive memory
1708556 free memory
187628 buffer memory
1290908 swap cache
2047996 total swap
0 used swap
2047996 free swap
... ... ... ... ... ... ...
492176813 pages paged in
614859854 pages paged out
27888 pages swapped in
221618 pages swapped out
... ... ... ... ... ... ...
(Izrezan je dio koji nam sada nije zanimljiv).
Možemo vidjeti da je dio statistike za memoriju vrlo sličan kao i iz prethodnih naredbi. Vrijednosti su u kilobajtima (kB).
Dodatno su nam zanimljive statistike u drugom dijelu (izrezanog) ispisa:
Ova naredbe se inače najčešće koristi i za statistike rada diska, ili statistike od pojedine particije diska.
Naredba sar dolazi s paketom sysstat, koji smo do sada već instalirali.
1. sar -r
Ova naredba ima mogučnost praćenje raznih statistika, od kojih nam je sada najzanimljivija statistika sustava virtualne memorije. U ovu svrhu ćemo koristiti prekidač -r.
Snimati ćemo statistiku svake sekunde (1) i to četiri puta za redom (4).
sar -r 1 4 Linux 2.6.32-42-pve (server1) 11/20/2015 _x86_64_ (2 CPU) 10:17:05 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact 10:17:06 PM 345400 131569804 99.74 123800 61290092 94246900 55.98 93872232 34640924 10:17:07 PM 345196 131570008 99.74 123804 61290100 94246900 55.98 93871728 34640924 10:17:08 PM 345336 131569868 99.74 123804 61290100 94246900 55.98 93871728 34640924 10:17:09 PM 345220 131569984 99.74 123804 61290108 94247288 55.98 93871728 34640924 Average: 345288 131569916 99.74 123803 61290100 94246997 55.98 93871854 34640924
Opis :
kbmemfree Ukupna količina slobodne memorije u kBkbmemused Količina memorije u upotrebi (u kB). Ovdje se ne računa memorija koju koristi sam kernel.%memused Postotak memorije koja je u upotrebi. Ovdje moramo biti svjesni činjenice da Linux pokušava iskoristiti svu moguću RAM memoriju za razne cache buffere, koju također, pomoću ugrađenih automatizama može osloboditi za potrebe procesa/programa/aplikacija. (Pogledajte sar -B u poglavlju Praćenje performansi I/O sustava - Primjeri: - Primjer 1.1.)kbbuffers Količina memorije koju sam kernel koristi za kernel buffer, količina je u kB (kilobajtima).kbcached Količin memorije koja se koristi kao cache memorija za spremanje podataka, količina je u kB.kbcommit Količina memorije koja je trenutno potrebna za funkcioniranje sustava (u kB). Ovo mjerenje na osnovu kojeg sustav utvrđuje dali ima dovoljno RAM memorije (uz eventualnu kombinaciju sa SWAP diskom) za normalan rad sustava, koji neće dovesti do stanja Out of memory.%commit Postotak memorije potreban za trenutno opterećenje sustava u odnosu na ukupnu virtualnu memoriju (RAM+SWAP).kbactive Količina aktivne memorije u kB, memorije koja je nedavno još bila u upotrebi i obično nije oslobođena/oduzeta tj. engl. reclaimed osim ako bi to bilo prijeko potrebno. Pod oduzeta se misli na proces oslobađanja memorije od strane sustava (OS-a).kbinact Količina aktivne memorije u kB, memorije koja neko duže vrijeme nije bila u upotrebi i za koju je vjerojatnije da će moći biti oslobođena od starne sustava, za druge potrebe.
Najčešće čemo ovdje pratiti stanja : kbmemfree i kbmemused jer nas kod problema s memorijom zanima da li je sveukupna memorija u nekom trenutku naglo zauzeta ili oslobođena.
2. sar -R
Naredba sar -R daje nam neke dodatne statistike korištenja memorije.
Također ćemo pratiti statistiku svake sekunde (1) i to četiri (4) puta za redom.
sar -R 1 4 Linux 2.6.32-42-pve (server1) 11/20/2015 _x86_64_ (4 CPU) 10:58:52 PM frmpg/s bufpg/s campg/s 10:58:53 PM -58.00 0.00 0.00 10:58:54 PM 43.00 0.00 0.00 10:58:55 PM 7.00 0.00 0.00 10:58:56 PM -83.00 0.00 1.00 Average: -97.75 0.00 0.25
Opis :
frmpg/s - Broj stranica u memoriji (sjetimo se da je svaki memory page veličine 4kB) koje je sustav oslobodio u svakoj sekundi. Negativna vrijednost predstavlja broj stranica alociranih od strane sustava.bufpg/s - Dodatni broj stranica memorije korištenih kao buffer memorija od strane sustava, u svakoj sekundi. Negativna vrijednost predstavlja oduzimanje stranica koje su bile alocirane kao buffer memorija.campg/s - Dodatni broj stranica memorije korištenih kao cache memorija od strane sustava, u svakoj sekundi. Negativna vrijednost predstavlja oduzimanje stranica koje su bile alocirane kao cache memorija.
Ovdje možemo pratiti stanje buffer i cache memorije u odnosu na alocirane ili dealocirane stranice memorije za “normalnu” upotrebu.
Ovisno o opterečenju sustava te vrsti pokrenutih servisa ili programa, ove vrijednosti mogu varirati od primjera. Velike oscilacije su moguće u slučaju korištenja ili oslobađanja veće količine RAM memorije.
Ovu naredbu sno već objasnili, pa sada samo kratko - daje nam podatke o hardveru. Sada nas zanimaju podaci o hardveru i to RAM memoriji i memorijskom kontroleru.
Pogledati ćemo ispis sa poslužitelja koji ima ECC memoriju i memorijski kontroler koji podržava ECC memoriju.
dmidecode -t memory
# dmidecode 2.11
SMBIOS 2.7 present.
Handle 0x1000, DMI type 16, 23 bytes
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: Single-bit ECC
Maximum Capacity: 192 GB
Error Information Handle: Not Provided
Number Of Devices: 9
... .... ... ... ...
Handle 0x1111, DMI type 17, 34 bytes
Memory Device
Array Handle: 0x1001
Error Information Handle: Not Provided
Total Width: 72 bits
Data Width: 64 bits
Size: 8192 MB
Form Factor: DIMM
Set: 18
Locator: PROC 2 DIMM 9
Bank Locator: Not Specified
Type: DDR3
Type Detail: Synchronous
Speed: 1333 MHz
Manufacturer: Not Specified
Serial Number: Not Specified
Asset Tag: Not Specified
Part Number: Not Specified
Rank: 2
Configured Clock Speed: 800 MHz
... ... ... ... ...
(Ispis je skračen samo na najzanimljivije djelove)
Što je ovdje vidljivo :
Error Correction Type: Single-bit ECC : Vidimo da je ovo ECC memorija koja podržava korekciju 1 bitaMaximum Capacity: 192 GB : maksimalan kapacitet RAM memorije koju podržava ovaj poslužitelj je 192 GBTotal Width: 72 bits : prvi memorijski modul je 72. bit-an , što je zbog ECC-aData Width: 64 bits : prvi memorijski modul je 64. bit-an , što je ostatak od 72. bita, što znači a je memorija 64.bitna (više o tome u poglavlju o ECC memoriji).Size: 8192 MB : Veličina je 8GBType: DDR3 : Tip memorije je DDR3Speed: 1333 MHz : Brzina je 1333 MHzLocator: PROC 2 DIMM 9 : Pozicija memorijskog utora na matičnoj ploči : Pripada Uz CPU 2 , utor 9. (ovo je poslužitelj koji ima dva procesora (CPU-a)).
Pogledajmo poslužitelj sa 128 GB RAM, od koje je u upotrebi večina odnosno oko ~127 GB.
Filtrirati ćemo sve iz statistike upotrebe RAM memorije /proc/meminfo što je vezano za pojam “Page”
cat /proc/meminfo | grep Page AnonPages: 47143856 kB PageTables: 109852 kB AnonHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
Prva stvar koja je vidljiva je ta da je Page tablica narasla na 107MB (109852 kB) što znači kako se u tablici nalazi oko 28 049 408 unosa za 4kB stranice.
Ovdje se koristi standardna veličina stranice (page) od 4KB.
Problem je u tome što se kod svakog pristupa RAM memoriji, koja je za naše aplikacije, razlomljena u komadiće od 4KB, potrebno svaki puta pogledati u “Page Table” tablicu , pronači (jednu po jednu) memorijsu lokaciju od 4KB te nakon toga i doći do nje.
Zamislimo da vaša aplikacija treba nešto upisati ili čitati u 40MB RAM memorije koja je zapravo razlomljena u blokove od 4KB, što znači da je potrebno čitanje 10000 unosa u tablici da bi se došlo d osvih memorijskih lokacija s kojih treba čitati ili u koje treba nešto upisati.
U primjeru gore s velikom količinom RAM memorije u upotrebi stvari postaju još gore.
Rješenje je upotreba tkzv “Huge Pages” odnosno prelazak s 4KB blokova na puno veće (za x86 je tu o pravilu 2MB), s ovom metodom , smanjili smo broj unosa u tablicu i samim time broj pregledavanja i dohvaćanja unosa u “Page” tablicu, poprilično, točnije 512 puta.
I naravno uvijek postoji problem - ovo nije moguće napraviti za cijeli sustav već samo za točno određeni dio memorije. I još malo komplikacije, “Huge Pages” neće raditi sam od sebe, već vaša aplikacija tj. programski jezik u kojem ste ju napisali, mora podržavati ovakan način rada.
Dobra strana je to što večina ozbiljnijih apikacija zna koristiti “Huge Pages”, potrebno je “samo” sve znati konfigurirati, što ponekad (zapravo često) nije jednostavno.
Postoji i rješenje koje je negdje između a zove se “Transparent Huge Pages”.
Zbog ideje kako se Huge pages način alociranja memorije napravi što jednostavnijim, te kako bi se izbjegla potreba za posebnom konfiguracijom ali i posebnim razvojem programa koji uopće znaju koristiti Huge pages, razvijen je sustav koji koristi tkzv. Transparent Huge Pages.
Ova metoda koristi kernel proces (kernel thread) koji se zove khugepaged a koji u pozadini (svako malo) pokušava pronaći dijelove RAM memorije (u kontinuitetu) koji bi se mogli koristiti kao Huge Pages, te ih dodjeljivati procesima (programima/aplikacijama) koje bi inače u normalnom radu koristile normalne stranice memorije od 4kB a ne one koje zovemo Huge pages, dakle one od 2MB.
Dakle sa strane samog procesa/programa/aplikacije, nisu potrebne nikakve modifikacije u samom kodu, već je cijeli proces transparentan - odatle i naziv Transparent Huge Pages tj. THP.
THP je moguće koristiti samo za tkzv. Anoymous memory region a u budućim verzijama se najavljuje i upotreba THP za tmpfs i Page Cache.
Dakle upotreba Anoymous memory region je slična kao i upotreba normalnih dijelova memorije, uz neke specifičnosti o kojima nećemo dublje raspravljati.
Zanimljivo za znati je samo to kako postoji nekoliko metoda pomoću kojih je moguće pristupiti memoriji a to su :
File mapping metode, i to:
File mapping metode predstavljaju datoteke na disku koje simboliziraju određenu količinu bajta mapiranih u RAM memoriji. Dakle ove metode podrazumijevaju posebnu datoteku (file descriptor) na koju se može referencirati neki uređaj (device), shared memory object ili neki drugi resurs kojemu pristupamo preko file descriptora.
Proces je :
fstat) pomoću tog File decriptora.mmap), korištenjem File decriptora koji smo dobili u prvom koraku pomoću operacije open.Kada se datoteka mapira kao Private, promijene na njoj se ne “propuštaju” prema dolje (File system Layer), već je sve što se radi, radi u RAM memoriji, na kopiji ove datoteke.
Kada se datoteka mapira kao Shared, tada se sve promijene u njoj (u RAM memoriji) prosljeđuju prema diskovnom I/O sustavu i disku i to automatski od strane kernela.
U cijelom ovom procesu kada pričamo o datotekama (koje su mapirane u RAM) memoriju, govorimo o direktnom radu s RAM memorijom koji indirektno može ili ne mora završiti na disku.
Sjetimo se da je u UNIX ili Linux svijetu sve datoteka, sada će nam postati još bliža ova uzrečica.
Naredba lsof daje nam listu svih otvorenih datoteka na sustavu. Mi ćemo ju sada ograničiti samo na popis svih otvorenih datoteka koje je otvorio proces odnosno servis/daemon sshd on je servis koji je zadužen za udaljeni pristup na naše računalo, preko SSH protokola (TCP port 22).
lsof -c sshd COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1073 root cwd DIR 253,0 4096 2 / sshd 1073 root rtd DIR 253,0 4096 2 / sshd 1073 root txt REG 253,0 569280 12282 /usr/sbin/sshd sshd 1073 root mem REG 253,0 12792 4283 /lib/libutil-2.12.so sshd 1073 root mem REG 253,0 113912 4254 /lib/libnsl-2.12.so ... ... ... sshd 1073 root 2u CHR 1,3 0t0 3960 /dev/null sshd 1073 root 3u IPv4 8651 0t0 TCP *:ssh (LISTEN) sshd 1073 root 4u IPv6 8653 0t0 TCP *:ssh (LISTEN ... ... ... sshd 1221 root cwd DIR 253,0 4096 2 / sshd 1221 root rtd DIR 253,0 4096 2 / sshd 1221 root txt REG 253,0 569280 12282 /usr/sbin/sshd ... ... ... sshd 1221 root 3r IPv4 9751 0t0 TCP 192.168.100.68:ssh->192.168.100.254:2488(ESTABLISHED) sshd 1221 root 4w unix 0xdf8e5040 0t0 9799 socket sshd 1221 root 5u FIFO 0,8 0t0 9802 pipe ... ... ...
Vidimo da su učitane razne bilblioteke - obične datoteke poput (/lib/libnsl-2.12.so).
Nakon toga su otvorene datoteke (TYPE=IPv4 i IPv6), kojima pod NODE stoji TCP, što znači da su otvorene posebne datoteke koje predstavalju otovreni TCP port na lokalnom računalu “*:ssh” što znači TCP port 22 (ssh protokol je TCP port 22 koji je odmah prepoznat pa je prikazan kao “*:ssh” ).
Potom ide niz od datoteka koje predstavljaju nekoliko trenutnih radnih direktorija (TYPE je DIR).
Osim njih učitana je i datoteka čiji je TYPE=IPv4 uz koju vidimo i dvije IP adrese. IP adresa : 192.168.100.68 je naša IP a 192.168.100.254 je IP adresa računala s kojeg smo se spojili preko ssh protokola.
Dakle ova datoteka čiji TYPE je IPv4, a pod NAME vidimo dvije IP adrese (to je TCP/IP veza između te dvije IP adrese) predstavlja tkzv IP Socket odnosno mehanizam koji omogućava komunikaciju između procesa (programa), preko mreže.
Na kraju tu je i datoteka koja predstavlja UNIX Socket odnosno komunikacijski kanal kroz koji programi mogu komunicirati.
Dakle UNIX socket koristi IPC (Inter Process Communication) mehanizam koji omogućava bidirekcionalnu (dvosmjernu) komunikaciju odnosno razmjenu podataka između više procesa.
U zadnjim nizu koji smo prikazali (izlistanje je filtrirano samo na osnovne nama zanimljive dijelove) vidimo datoteke koje predstavljaju mrežne konekcije.
Sada je vjerujem jasno zbog čega stalno govorimo da je u UNIXu ili Linuxu sve (što radimo) zapravo datoteka.
Konkretno ovo su datoteke koje otvara samo SSH daemon ali vidljivo je što se događa u pozadini te postaje jasnija veza prema File Mapping metoda mapiranja memorije koja završava ili ne završava na datotekama (koje ne moraju biti sve na fizičkom disku), Sjetimo se da postoje i posebne vrste datoteka koje se zapravo nalaze u RAM memoriji.
Pod stupcem DEVICE su navedeni uređaji na kojima završavaju (na kojima se nalaze) ove datoteke. Primjerice u našem slučaju “ 253, 0 ” je naš tvrdi disk ( /dev/sda ) a ostali brojevi i oznake označavaju posebne uređaje za koje smo rekli kako se u konačnici niti ne moraju nalaziti na stvarnom tvrdom disku, već negdje u RAM memoriji: direktno ili indirektno.
Pogledajmo sada posebne otvorene datoteke koje predstavljaju otvorene ili ostvarene mrežne konekcije.
Za ovu namjenu koristimo naredbu lsof -i
lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1073 root 3u IPv4 8651 0t0 TCP *:ssh (LISTEN) sshd 1073 root 4u IPv6 8653 0t0 TCP *:ssh (LISTEN) httpd 1095 root 4u IPv6 8715 0t0 TCP *:http (LISTEN) httpd 1098 apache 4u IPv6 8715 0t0 TCP *:http (LISTEN) httpd 1099 apache 4u IPv6 8715 0t0 TCP *:http (LISTEN) sshd 1221 root 3r IPv4 9751 0t0 TCP 192.168.100.68:ssh->192.168.100.254:2488 (ESTABLISHED)
Dakle vidimo otvorene SSH (TCP port 22) i HTTP (TCP port 80) portove te jednu ostvarenu konekciju (zadnja u nizu s vidljivim IP adresama).
I još jedan primjer iz mreža, preko otvorenih posebnih datoteka. Saznajmo tko je otvorio posebne datoteke koje predstavljaju otvorene mrežne konekcije na portu 22 (to je ssh):
lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1073 root 3u IPv4 8651 0t0 TCP *:ssh (LISTEN) sshd 1073 root 4u IPv6 8653 0t0 TCP *:ssh (LISTEN) sshd 1221 root 3r IPv4 9751 0t0 TCP 192.168.100.68:ssh->192.168.100.254:2488 (ESTABLISHED)
Iz ovoga je vidljivo da je proces sshd (COMMAND stupac) taj koji je otvarao TCP port 22.
Vratimo se na mapiranje memorije. Upoznajmo se i sa zadnjom metodom mapiranja memorije:
Anonymous mapping metoda i to:
Anonymous mappings način mapiranja RAM memorije s druge strane nema nikakve veze s datotekama na disku, niti File descriptorima. Dakle ovo je samo druga metoda alociranja RAM memorije preko Virtual Memory managementa.
U RedHat/CentOS Linuxima od verzije 6.x THP je uglavnom automatski u upotrebi.
Da bi provjerili da li je THP aktivan pogledajmo sadržaj datoteke /sys/kernel/mm/transparent_hugepage/enabled.
cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never
Ako je označeno “[always]” ili “[madvise]” tada je THP aktivan.
Naime čim je jedan od gore navedena dva parametra uključen, kernel automatski pokreće proces khugepaged koji kao što smo spomenuli pronalazi memorijske lokacije na kojima bi se mogle koristiti Huge Pages stranice, te ih pokušava propagirati procesima/programima/aplikacijama.
Da bi vidjeli koliko je Anonymous mappings trenutno alocirano, od strane khugepaged pogledajmo (/proc/meminfo):
grep AnonHugePages /proc/meminfo AnonHugePages: 444416 kB
Dakle u upotrebi je 444416kB tj. oko 434 MB RAM-a za Anonymous Huge Pages odnosno kao THP.
Pogledajmo i drugu statistiku (/proc/vmstat):
egrep 'trans|thp' /proc/vmstat nr_anon_transparent_hugepages 216 thp_fault_alloc 248 thp_fault_fallback 0 thp_collapse_alloc 235 thp_collapse_alloc_failed 0 thp_split 61
Vidimo kako se određeni broj stranica koristi kao Anonymous tj. THP.
I još samo jedan pogled na khugepaged daemon koji je zaslužan za ovaj sav rad oko THP.
ps -ef | egrep "UID|khugepaged" | grep -v grep UID PID PPID C STIME TTY TIME CMD root 64 2 0 Nov22 ? 00:00:00 [khugepaged]
Što je ovdje zanimljivo ?.
PPID - Parent PID tj. roditeljski proces koji je pokrenuo khugepaged je 2.
PPID broj 2. je kthreadd process koji je zadužen za pokretanje kernel thread procesa (pogledajte poglavlje o procesima).
Sjetimo se da je PID 1 init proces, koji pokreće sve procese i servise (daemone). S druge strane PID 2 je kthreadd kernel proces koji pokreće “posebne” sistemske thread procese (procesi koji se moraju izvršavati na najnižoj razini sustava, koji se nalaze u tkzv. kernel space adresnom prostoru (rezervirani i izolirani memorijski adresni prostor za kernel) a koji na najbrži mogući način komuniciraju s kernelom).
Sada pogledajmo sve procese na sustavu koji koriste THP memoriju a želimo vidjeti za svaki prces i koliko memorije se koristi kao THP.
grep -e AnonHugePages /proc/*/smaps | awk '{ if($2>4) print $0} ' | awk -F "/" '{print $0; system("ps -fp " $3)} '
... .... ...
UID PID PPID C STIME TTY TIME CMD
root 1193 1 0 Nov22 ? 00:00:00 s3fs moj-cloudbkp ... /proc/1275/smaps:AnonHugePages: 2048 kB
root 1275 1 0 Nov22 ? 00:00:00 automount .../proc/1459/smaps:AnonHugePages: 2048 kB
haproxy 1459 1 0 Nov22 ? 00:00:03 /usr/sbin/haproxy .../proc/1571/smaps:AnonHugePages: 63488 kB
nxuser 1571 1556 2 Nov22 ? 00:12:23 /usr/jdk1.7/bin/ja.../proc/1571/smaps:AnonHugePages: 26624 kB
nxuser 1571 1556 2 Nov22 ? 00:12:23 /usr/jdk1.7/bin/ja.../proc/1571/smaps:AnonHugePages: 65536 kB
... ... ...
(Ispis je skraćen zbog lakšeg razumijevanja)
Dakle upotreba THP je dobra u određenim slučajevima ali je loša za sve programe koji koriste imalo više memorije zbog dinamičke alokacije i stalnog “vršljanja” po RAM memoriji od strane kernel procesa khugepaged.
Stoga u dobrom dijelu slučajeva NE ŽELIMO THP.
Kako isključiti THP i kako umjesto THP koristiti statički “Huge Pages” pogledajmo u daljem tekstu.
S obzirom na činjenicu da ne želimo koristiti THP već Huge Pages krenimo s ručnim radom.
Prvo ćemo trenutno onemogućiti upotrebu THPa.
echo never > /sys/kernel/mm/transparent_hugepage/enabled
Nakon nekoliko trenutaka će sustav u pozadini shvatiti da ne želimo koristiti THP te će kernel thread proces khugepaged biti zaustavljen.
ps -ef | egrep "UID|khugepaged" | grep -v grep UID PID PPID C STIME TTY TIME CMD
Ovdje vidimo da proces khugepaged stvarno više ne postoji.
Ali svi procesi koji su koristili THP i dalje rade i koriste THP jer su već alocirali THP memoriju pomoću procesa khugepaged.
Sada imamo tri opcije:
Opcija 1
Nađimo sve procese koji trenutno koriste THP:
grep -e AnonHugePages /proc/*/smaps | awk '{ if($2>4) print $0} ' | awk -F "/" '{print $0; system("ps -fp " $3)} '
... .... ...
UID PID PPID C STIME TTY TIME CMD
root 1193 1 0 Nov22 ? 00:00:00 s3fs moj .../proc/1275/smaps:AnonHugePages: 2048 kB
root 1275 1 0 Nov22 ? 00:00:00 automount.../proc/1459/smaps:AnonHugePages: 2048 kB
haproxy 1459 1 0 Nov22 ? 00:00:03 /usr/sbin.../proc/1571/smaps:AnonHugePages: 63488 kB
nxuser 1571 1556 2 Nov22 ? 00:12:23 /usr/jdk1.../proc/1571/smaps:AnonHugePages: 26624 kB
nxuser 1571 1556 2 Nov22 ? 00:12:23 /usr/jdk1.../proc/1571/smaps:AnonHugePages: 65536 kB
... ... ...
(Ispis je skraćen zbog lakšeg razumijevanja)
Zapravo su to svi oni procesi koji su i prije koristili THP. Možemo ih restartati jedan po jedan ali moramo znati koji prije kojega i na koji način. Sada nećemo objašnjavati kako, već idemo na opciju 2.
Opcija 2
Napravimo trajnu promjenu (OPREZNO).
Ovaj korak je vrlo kritičan jer krivim promjenama možemo imati problema sa podizanjem operacijskog sustava kod slijedečeg restarta računala.
Za RedHat/Cento 6.x:
Editirajmo datoteku /etc/grub.conf.
Pogledajmo kako izgleda inicijalno: (iz prikaza su izrezani dijelovi koji nam nisu važni)
... ... ...
title CentOS Server (2.6.32-504.12.2.el6.x86_64)
root (hd0,0)
kernel /boot/vmlinuz-2.6.32-504.12.2.el6.x86_64 console=ttyS0 ro root=UUID=87a51409-a8bc-4b16-950d-061a7c281406 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 xen_blkfront.sda_is_xvda=1 console=ttyS0,115200n8 console=tty0 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_LVM rd_NO_DM
initrd /boot/initramfs-2.6.32-504.12.2.el6.x86_64.img
... ... ...
U liniji (redu) koji počinje sa riječi kernel, na sami kraj moramo dodati ove ključne riječi transparent_hugepage=never.
Dakle to će sada izgledati ovako:
... ... ...
title CentOS Server (2.6.32-504.12.2.el6.x86_64)
root (hd0,0)
kernel /boot/vmlinuz-2.6.32-504.12.2.el6.x86_64 console=ttyS0 ro root=UUID=87a51409-a8bc-4b16-950d-061a7c281406 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 xen_blkfront.sda_is_xvda=1 console=ttyS0,115200n8 console=tty0 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_LVM rd_NO_DM transparent_hugepage=never
initrd /boot/initramfs-2.6.32-504.12.2.el6.x86_64.img
... ... ...
Snimimo datoteku i restartajmo cijeli sustav.
Ovime smo rekli kernelu da kod podizanja sustava NE koristi THP.
Pogledajmo sada statistike:
grep AnonHugePages /proc/meminfo AnonHugePages: 0 kB
i druge statistike :
egrep 'trans|thp' /proc/vmstat nr_anon_transparent_hugepages 0 thp_fault_alloc 0 thp_fault_fallback 0 thp_collapse_alloc 0 thp_collapse_alloc_failed 0 thp_split 0
I još provjerimo da li je nekim čudom zaostao neki proces koji ipak koristi THP:
grep -e AnonHugePages /proc/*/smaps | awk '{ if($2>4) print $0} ' | awk -F "/" '{print $0; system("ps -fp " $3)} '
Nema odgovora, odnosno pronađenih procesa, što znači da je sve u redu.
Jasno je vidljivo da THP više nije u upotrebi. Konačno.
Opcija 3
Isključimo THP u skripti, koja se podiže automatski s podizanjem našeg linuxa.
U ovo primjeru koristiti ćemo skriptu /etc/rc.local
Dodajmo ovaj red (liniju), na kraj u datoteku /etc/rc.local :
echo never > /sys/kernel/mm/transparent_hugepage/enabled
Ova skripta se pokreće zadnja, kod podizanja sustava, tako da je velika vjerojatnost kako bi se mnogi servisi koji koriste THP, već podignuli i upotrebljavali THP. Tako da ovo vjerojatno nije najbolje mijesto za ovakve promijene. Stoga ovo promatrajte samo kao primjer.
Sada tek idemo dalje s upotrebom Huge Pagesa.
Provjerimo da li se koriste Huge Pages:
grep -i HugePages_Total /proc/meminfo HugePages_Total: 0
Dakle nije u upotrebi.
Pošto se “Huge Pages” koristi statički, moramo prvo odlučiti koliko Huge Pages stranica (od 2MB) želimo statički alocirati za naše procese/programe/aplikacije koje su pisane/programirane tako da ih uopće znaju koristiti.
Recimo da imamo poslužitelj s 8GB RAM, od kojih želimo 6GB dodijeliti na korištenje preko Huge Pagesa.
Računica :
6GB = 6144 MB / 2MB stranice = 3072 stranica.
To znači da želimo alocirati 3072 stranica za Huge Pages.
Editirajmo datoteku /etc/sysctl.conf.
Dodati ćemo novu liniju (red):
vm.nr_hugepages=3072
Snimimo ovu datoteku te pokrenimo ponovno postavljanje sustava na osnovu naše nove opcije, pomoću naredbe sysctl.
sysctl -p ... ... ...
Sada provjerimo da li je to stvarno učitano:
sysctl vm.nr_hugepages vm.nr_hugepages = 3072
Provjerimo i statistike sustava:
grep -i HugePages_Total /proc/meminfo HugePages_Total: 3072
i provjerimo koliko je “HugePages” u upotrebi odnosno slobodno.
grep -i HugePages /proc/meminfo AnonHugePages: 0 kB HugePages_Total: 3072 HugePages_Free: 3072 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
Dakle sve što smo alocirali (3072) je i dostupno. Vidimo i informaciju da je veličina HugePages stranica 2048kB tj. 2MB.
Pogledajmo trenutnu veličinu Page tablice
grep -i PageTables /proc/meminfo PageTables: 164068 kB
Vidimo da je tablica veličine 160 MB za 4kB stranice (to je negdje za oko 41 000 stranica od 4kB) - dakle nije sva memorija niti alocirana. Ponovno ćemo pogledati ovu tablicu nakon upotrebe Huge Pagesa.
Sada je potrebno optimizirati i druge parametre memorije da bi se HugePages stranice uopće mogle koristiti.
Tko ima pravo koristiti Huge Pages ?.
Standardno samo root korisnička grupa (GID=0) ali pogledajmo:
cat /proc/sys/vm/hugetlb_shm_group 0
Ako imamo potrebu da ih koriste korisnici koji su u nekoj dugoj grupi, to je potrebno i konfigurirati.
Ako recimo imamo grupu čiji Group ID = 1500 , tada moramo dodati novu opciju (novi red) u /etc/sysctl.conf
vm.hugetlb_shm_group=1500
Ponovno učitajmo novu konfiguraciju
sysctl -p
Zamislimo da je korisnik koji je u ovoj grupi GID=1500 imena “hugetable”.
Za tog korisnika je potrebno i definirati koji su mu memorijski limiti tj. koja je maksimalna količina RAM memorije koju mu dozvoljavamo da može koristiti.
Ova ogranićenja se definiraju u datoteci : /etc/security/limits.conf.
Dodajmo sljedeća dva reda:
hugetable hard memlock 6291456 hugetable soft memlock 6291456
6291456 = 6GB RAM
Sada se logirajmo na sustav kao korisnik “hugetable” i provjerimo ograničenja:
ulimit -l 6291456
Dakle ograničenja koja smo postavili su dobra.
Provjerite da li ste dobro konfigurirali ostale parametre memorije iz prijašnjih poglavlja : kernel.shmall i kernel.shmmax
Teži dio
Sada je potrebno konfigurirati (ili napisati) program/aplikaciju koja zna koristiti Huge Pages. U našem slučaju koristili smo bazu podataka, koju je bilo potrebno samo rekonfigurirati i pokrenuti, da bi znala koristiti Huge Pages. Dakle koristimo SQL bazu podataka koja zna raditi sa Huge Pages. Konfiguraciju SQL baze nećemo objašnjavati - malo se potrudite te istražite kako se konfigurira ili kompajlira vaš program, da može koristiti Huge Pages.
Pokrenimo našu bazu podataka. Pričekajmo desetak minuta da naša baza alocira svu potrebnu memoriju.
Sada pogledajmo statistike.
grep -i HugePages /proc/meminfo AnonHugePages: 0 kB HugePages_Total: 3072 HugePages_Free: 2 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
Vidimo da je od iskoristivih 3072 Huge Pages iskorištena večina te su ostala samo dva (2) slobodna. Ovo znači da smo uspješno konfigurirali i sustav i aplikaciju da koriste Huge Pages odnosno da umijesto standardne veličine od 4kB naša željena aplikacija koristi stranice od 2MB. S ovime smo drastično ubrzali operacije koje koriste RAM memoriju jer smo veličinu stranice povečali 512 puta i isto toliko puta smanjili “Page” tablicu.
Pogledajmo i Page tablicu (bila je veličine 160MB za 4kB stranice):
grep -i PageTables /proc/meminfo PageTables: 39924 kB
Sada je Page tablica oko 40MB, što znači kako se tablica poprilično smanjila a alocirana je puno veća količina RAM memorije nego prije. Dio tablice je i dalje za 4kB stranice a drugi dio je za nove 2MB (2048 kB) stranice.
Postigli smo što smo htjeli.
Kako bi posve razumjeli način na koji Linux koristi RAM memoriju, moramo razumjeti i što su Zone RAM memorije i čemu služe.
Naime Linux kernel ne promatra cijelu dostupnu RAM memoriju kao jednu cjelinu. Naprotiv, Linux kernel dijeli RAM memoriju u nekoliko regija, koje se zovu zone RAM memorije. Vrste zona RAM memorije, ovise o tome jeli računalo 32 bitno ili 64 bitno.
Mi ćemo dalje govoriti o 64 bitnom računalo odnosno Linuxu. Zone RAM memorije za 64 bitna računala, podijeljene su u slijedeće zone:
DMA zonu, u kojoj se nalazi prvih 16 MB RAM memorije. Ova zona postoji iz povijesnih razloga, iz vremena kada je hardver koji koristi DMA pristup, mogao pristupati samo do donjih 16 MB RAM memorije.DMA32 zonu, koja se nalazi unutar prvih 4 GB RAM memorije i postoji stoga što određeni hardver može koristiti DMA samo do prvih 4GB RAM memorije.Normal zona, koja koristi RAM memoriju nakon 4GB RAM-a, na više. Dakle 64 bitno Linux računalo koje ima samo primjerice 2 GB RAM, uopće nema dostupnu Normal zonu RAM memorije, dok računalo s 4GB RAM-a, ima samo vrlo malo memorije u ovoj zoni.
U normalnom radu, kada neki proces (recimo neka aplikacija), zatraži pristup RAM memoriji, obično joj se dodjeljuje RAM memorija iz zone Normal jer su druge zone memorije rezervirane za druge namjene (upotrebu DMA). U slučajevima kada se normalno zatraži korištenje Normal zone ali u njoj nema više slobodne memorije, Linux kernel, će aplikaciji dozvoliti korištenje i inače rezerviranije zone DMA32 ili DMA u kojima ima mjesta za upotrebu.
Dodatno, na sustavima koji imaju NUMA arhitekturu, odnosno sustava koji imaju više fizičkih procesora (CPU), zone memorije su dodatno povezane s fizičkim procesorom, odnosno njegovim memorijskim kontrolerom i njegovom pripadajućom RAM memorijom. Ovo je vidljivo kao zone RAM memorije koja pripadaju određenom nodeu, a koji se asocira s fizičkom CPUom. Dakle ovdje se prema osnovnim postavkama sustav brine kako bi pokrenuti program koristio RAM memoriju, što bližu CPU jezgri, fizičkog procesora, na kojemu se nalazi i RAM kontroler, RAM memorije, koju program treba koristiti, kako bi sve radilo uz što manje usporavanja. Pogledajte poglavlje NUMA.
Statistike zona RAM memorije su dostupne na :
/proc/pagetypeinfo - opće statistike upotrebe zona RAM memorije/proc/zoneinfo - brojači koji pokazuju trenutno stanje zauzeća RAM memorije, po zonama/proc/buddyinfo - sumarizirana statistika upotrebe zona RAM memorijePogledajmo kako to izgleda za jedan NUMA poslužitelj sa dva fizička procesora (NUMA CPU node0 i node1) i 128 GB RAM : i to 64 GB RAM na prvom fizičkom CPU (NUMA node0) i 64 GB RAM na drugom fizičkom CPU (NUMA node1):
cat /proc/buddyinfo Node 0, zone DMA 2 2 1 1 2 1 0 0 1 1 3 Node 0, zone DMA32 110974 43884 11989 2026 346 9 0 0 0 1 0 Node 0, zone Normal 344428 384766 78046 695 19 3 0 0 0 0 1 Node 1, zone Normal 487961 330878 108763 12006 1279 4 0 0 0 1 1
Ovdje je vidljivo kako je RAM memorija na NUMA sustavu raspodijeljena u:
Dakle prvi fizički CPU - node 0, prvi alocira RAM memoriju, pa je na njemu alocirana RAM memorija od 0 do 64 GB, a onda se od 64 GB do 128GB alocira preko drugog fizičkog CPUa (node1). To isto znači kako se na node 0 nalaze zone :
DMA iDMA32 te prvi dio odNormal (od 4GB na dalje)
Te se ostatak Normal zone proteže preko drugog fizičkog procesora tj. preko njegovog RAM kontrolera i pripadajuće RAM memorije - od 64 GB RAM do 128GB RAM.
Što znače ovi brojevi (iz /proc/buddyinfo ) ?
Za svaku zonu memorije, svaki stupac označava broj slobodnih stranica memorije (memory pages) u određenim blokovima.
Iako je osnovna jedinica za alociranje u sustavu virtualne memorije, stranica memorije (memory page) od 4kB, svako malo neki program može zatražiti alociranje veće količine RAM memorije u nizu, u većim blokovima, koji se sastoje od više dijelova od 4kB. Tako ti blokovi mogu biti veličine 8kB (čime se koriste dvije stranice od 4kB), 16kB (za korištenje četiri stranice od 4kB), 32kB, 64kB, 128kB, 256kB, 512kB, … . Dakle sve ovisno koliko je stranica memorije potrebno. Zbog toga i Linux kernel vodi statistiku i brine se o ovim blokovima unutar kojih se i dalje sve zapisuje u stranicama od 4kB, kao najmanjem elementu za čitanje ili zapisivanje u RAM memoriju, preko sustava virtualne memorije. Između ostaloga, kernel konstantno vodi brigu i o tome koliko je koja zona iskorištena, i to pomoću nekog od tri pokazivača stanja:
pages_low - ostalo je vrlo malo slobodnog prostora za adresiranje (memory pages)pages_min - ostalo je malo prostora za adresiranje (memory pages)pages_high - ostalo je dovoljno prostora za adresiranje (memory pages)
Ovisno o stanju svake zone, a koje se stalno osvježava, poseban Linux daemon (sistemski servis), zvan kswapd (Kernel Swap Daemon), poduzima određene korake (između njegovih drugih zadaća). Naime ovaj daemon, kada primijeti, kako se određena zona memorije popunjava, i dolazi do stanja pages_min, on pokreće jednu od svojih procedura za pronalaženje blokova memorije koji se više ne koriste, te ih oslobađa. Ako je pak određena zona još više iskorištena, on kreće u agresivnije metoda oslobađanja memorije, te na kraju, kada više nema opcija niti zona memorije koje su slobodne, počinje koristiti swap disk/particiju kao nadogradnju RAM memorije. I naravno, kako se memorija oslobađa, on odrađuje čišćenje tj. oslobađanje slobodne RAM memorije.
U ovom naprednom poglavlju, upoznati ćemo se s još jednim mehanizmom unutar sustava virtualne memorije, koji se naziva slab sustav. On je zadužen za efikasno alociranje predmemorije (cache) za potrebe kernela odnosno kernel programa. Jedan od mehanizama slab sustava, brine se o tome kako uslijed alociranja i dealociranja ove memorije, ne bi došlo do fragmentacije. Ovdje se radi o potrebi da kernel, kada treba alocirati memoriju u kojoj će se pohraniti neki podaci, koje će trebati dohvaćati i drugi programi unutar kernela, to odradi na što efikasniji način. Ova funkcionalnost se naziva i object pool, unutar memorije. Naime kernel programi u object pool zapisuju podatke, razdijeljene u blokovima memorije, a koje nazivamo objektima. Nešto slično poput stranica memorije (pages).
Alokacija ovakve memorije, prvo je osmišljena u UNIX operacijskom sustavu Solaris, 1994 godine, a potom je uvedena u FreeBSD te kasnije i u Linux. Osim što operacijski sustav na najnižoj razini, od kernel funkcionalnosti , koje ćemo nazvati kernel programima i kernel modula (drivera)), koriste slab memoriju, postoji i nekoliko aplikacijskih programa koji ju koriste. Jedan od njih je Memcached, koji je zamišljen kao priručna RAM memorija (cache) za mnoge druge programe, poput Apache i nginx web poslužitelja i drugih programa.
Kod alokacije i dealokacije RAM memorije u rezerviranom prostoru kernela odnosno RAM memorije za spremanje raznih objekata, dolazi do problema u performansama, jer su troškovi resursa/vremena, kod operacija alociranje odnosno dealociranja i ponovnog alociranja memorije prilično veliki. Gledano s više razine, kreiranje i brisanje te popunjavanja raznih objekata u memoriji, na razini kernela, događa se vrlo veliki broj puta u sekundi, a računajući koliko je samo vremena potrebno za kreiranje i brisanje tih objekata, ispostavilo se kako to u postotku oduzima značajan dio vremena i drugih resursa (CPU), odnosno u konačnici dovodi do lošijih performansi. Stoga je uvedena nova funkcionalnost izrade posebne tehnologije zvane slab i njenih međuspremnika (cache), koji se brinu o kreiranju tih logičkih objekata, kao jedinica (blokova) za pohranu podataka, radu s njima i njihovom brisanju ali na znatno efikasniji način.
S ovakvim alociranjem slab cache memorije, memorija se dijeli u posebne cjeline (chunks), čija veličina je najoptimalnija za spremanje i dohvaćanje objekata, točno određene veličine, koja odgovara potrebama konkretnog kernel programa koji ih treba. Ovi kernel programi odnosno funkcionalnosti mogu biti funkcije za pristup diskovnom podsustavu odnosno datotečnom sustavu, mrežnom podsustavu i slično. Slab sustav prati ove slab cjeline, koje se globalno nazivaju i cache, memorije. Pri tome, se on brine kako bi alocirao dovoljno slab cjelina, koje se sastoje od objekata odgovarajuće veličine, odnosno kako bi preraspodijelio one koje može rasporediti drugim kernel programima. Dakle slab sustav se brine kojem kernel programu odnosno funkcionalnosti treba dodijeliti i koliko slab/cache memorije, odnosno koju slab cjelinu, a koja je podijeljena na objekte određene veličine.
U slučaju kada neke cjeline odnosno objekti stvarno više nisu potrebni, ne radi se brisanje slab objekata/cjelina, već se one samo označavaju slobodnim. Potom ih slijedeći kernel program može alocirati, ako su one veličine koja mu odgovara, a o čemu se opet brine slab allocator mehanizam. Na kraju se s ovim mehanizmom dodatno ubrzao proces alociranja slab objekata, a u konačnici i RAM memorije.
Informacije o alociranoj slab memoriji mogu se vidjeti:
/proc/slabinfo /proc/meminfo red Slab: cat /proc/meminfo | grep -i slab - prikazuje ukupno zauzeće slab memorijeslabtop, koja se ponaša poput naredbe topPogledajte i poglavlje o /proc virtualnom datotečnom sustavu.
Vezano za zauzeće RAM memorije Linux sustava, važno je znati kako je određeni dio memorije alociran kao slab memorija za posebne komponente kernela. Ove komponente mogu biti:
Dakle ukupno zauzeće RAM memorije je podijeljeno u dvije logičke cjeline (unutar sustava virtualne memorije):
Pri tome je moguće, gledajući na zauzetu memoriju, primjerice s programima free top atop, uočiti kako imamo veliko zauzeće RAM memorije, ali vrlo malo što se tiče pokrenutih vidljivih procesa. U stvarnosti je zauzeće RAM memorije prilično veliko jer se razlika (slobodna RAM memorija) dinamički koristi za neko cache-iranje te se prema potrebi oslobađa za aplikacije/programe.
Pogledajmo naredbu slabtop i njene prekidače:
-o - ispiši statistiku samo jednom i izađi iz programa-s sortiraj prema:a - broju aktivnih objakatab - broju objekata slab memorijec - veličini cache memorijes - veličini objakatau - iskorištenju cachea
Primjer: Pogledajmo trenutno zauzeće slab (cache) memorije, poredano prema veličini alocirane slab memorije (-s c) (skratili smo ispis):
slabtop -o -s c Active / Total Objects (% used) : 1091395 / 1140789 (95.7%) Active / Total Slabs (% used) : 143800 / 143821 (100.0%) Active / Total Caches (% used) : 140 / 312 (44.9%) Active / Total Size (% used) : 559006.99K / 572778.23K (97.6%) Minimum / Average / Maximum Object : 0.02K / 0.50K / 4096.00K OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 481551 467162 97% 0.55K 68793 7 275172K radix_tree_node 44236 44231 99% 4.00K 44236 1 176944K size-4096 14492 14418 99% 0.85K 3623 4 14492K ext3_inode_cache 11360 11322 99% 1.00K 2840 4 11360K size-1024 13385 13259 99% 0.72K 2677 5 10708K proc_inode_cache 44625 44328 99% 0.22K 2625 17 10500K dentry 156 156 100% 64.00K 156 1 9984K size-65536 111088 110550 99% 0.07K 2096 53 8384K Acpi-Operand 61420 55290 90% 0.10K 1660 37 6640K buffer_head
Opis polja:
OBJS označava broj objekata (blokova memorije) koji se trenutno može koristiti za pojedinu funkciju kernela (NAME)ACTIVE označava broj aktivnih objekata koje trenutno ta funkcija i koristiUSE je odnos između OBJS i ACTIVEOBJ SIZE je veličina pojedinog objekta (ovisi o funkciji koja ih treba)SLABS - broj slab blokovaOBJ/SLAB - broj objekata koji mogu stati u jedan slab blokCACHE SIZE je količina RAM memorija koja je alocirana za pojedinu funkcionalnost kernelaNAME je ime kernel funkcionalnosti koja koristi slab/cache memorijuVidljivo je kako je kernel funkcija/program radix_tree_node zauzeo 275172KB (238 MB) RAM memorije za svoje operacije (za pohranu raznih objekata). Pri tome aktivno koristi 467 162 objekata, veličine 0.55KB (560 bytea). Zanimljiva je i treća kernel funkcionalnost/program ext3_inode_cache koji predstavlja inode unose datotečnog sustava ext3, koji su cacheirani, a konkretno ih je cacheirano 14 492, što zauzima 14 492KB (14 MB) RAM memorije. U slučaju da smo primjerice radili neke intenzivne operacije pristupanja/pretraživanja velikog broja datoteka, njihovi inodeovi bi bili cacheirano odnosno dodani u ovu cache memoriju, koja bi potom znatno narasla (kako brojem objekata tako i samim time zauzećem RAMa ).
Ukupno zauzeće slab i drugih cache memorija je vidljivo i iz programa vmstat. Pogledajmo ga na istom računalu:
vmstat -S M procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 0 352 141 113410 0 0 68 2 1 0 0 0 99 0
Koristili smo prekidač -S M kako bi zauzeće vidjeli u MB.
Ono što se nalazi u stupcu : memory i podstupcu cache je i dio slab memorije, kao i druge cache memorije. U našem slučaju se za razne cache memorije koristi 110GB RAM memorije (113 410 MB).
podstupac buff se odnosi na buffer memoriju u koju se ne spremaju podaci ili datoteke već njihovi pripadajući metapodaci, poput ovlasti (permissions) za datoteke i slično.
Za administraciju Linux sustava, potrebno je biti root korisnik (administrator) :
Drugi korisnici mogu dobiti root ovlasti (ako znaju root lozinku), upotrebom naredbe su (Substitute User)
Pošto je Unix/Linux svijet višekorisnički, posebnu pažnju treba posvetiti korisničkim računima te korisničkim grupama na samom sustavu.
Dakle u svakom trenutku, moguće je da više korisnika koristi sustav u isto vrijeme. U primjerima oko ovlasti (permissions) vidljiva je veza između korisničkih računa i korisničkih grupa. U ovom poglavlju krenuti ćemo s administracijske strane.
Svaki korisnik uz samo korisničko ime na nivou sustav identificira se jedinstvenim korisničkim brojem UID (User ID), isto vrijedi i za svaku korisničku grupu , koja ima jedinstveni grupni identifikacijski broj odnosno GID (Group ID).
U UNIX/Linux svijestu root korisnik ID:0 je ekvivalent Administratoru, on također pripada grupi root , koja isto ima GID:0.
Primjer
Postani root korisnik i preuzmi njegovo okruženje (environment) [ - prekidač ]
su - root
Svaki korisnički račun (account) je upisan u /etc/passwd , njegova kriptirana lozinka je zapisana u /etc/shadow a sve grupe korisnika koje postoje na sustavu, zajedno s pripadnostima korisnik/grupa se nalaze u /etc/groupŠto se nalazi u kojoj od navedenih sistemskih datoteka (malo detaljnije):
/etc/passwd - sadrži ime accounta, osobne podatke (ime, prezime, …) i shell koji će biti pokrenut kod logiranja,…/etc/shadow - sadrži kriptirane lozinke za svaki korisnički račun (account)/etc/group - ovdje su definirane sve korisničke grupe i pripadnosti grupama
/etc/passwd datoteka sadrži bitne informacije, koje su potrebne za logiranje svakog korisnika na sustav.
Kod logiranja na sustav, prvo se provjerava da li određeni korisnik postoji (prvi stupac u datoteci je upravo username [ime korisničkog accounta]). Drugi stupac (x) označava kako se kriptirana lozinka nalazi u datoteci /etc/shadow , koja će biti kasnije objašnjena. Osim toga važno je znati da svaki korisnik može pripadati samo jednoj primarnoj grupi (pogledajte GID [Group ID] stupac na slici dolje) i u više
sekundarnih grupa korisnika koje su opisane u poglavlju o /etc/group datoteci.
Izgled /etc/passwd datoteke je opisan na slici:
/etc/shadow datoteka sadrži kriptiranu lozinku za svaki korisnički račun (account).
Nakon prvog koraka (objašnjenog u poglavlju prije), kod logiranja korisnika na sustav i provjere da li korisnik postoji, ako postoji, sustav će vas zatražiti da upišete lozinku. Lozinka se tada kriptira i uspoređuje se s već kriptiranom u datoteci /etc/shadow , za točno određenog korisnika. Ako se poklapaju omogućen je pristup sustavu.
Izgled /etc/shadow datoteke je opisan na slici:
Napredno
Pogledajmo samo dio kriptirane lozinke “Kriptirani password” dio sa slike, ali uvećan:
Što je opće “password hash” ?
To je matematička metoda/algoritam pomoću koje se na osnovi niza ulaznih znakova (pr. naš password) stvara (kreira) jedinstveni nîz znakova fiksne duljine. Ovo je jednosmjeran put – nije moguće na onovi hash nîza dobiti izvorni password. Dakle “password hash” se praktično pohranjuje u /etc/shadow
Hash/Checksum
Vjerojatno ste nekada kopirali ISO image (CD ili DVD) te ste uz njega primjetili pr. MD5 sum od tog ISO image-a, koji se napravljen stoga da nakon što se skinuli (download) taj ISO file, možete i na svom računalu napraviti MD5 sum i usporediti vrijednost koju ste dobili sami sa onom koji se nalazi na stranici s koje ste kopirali ISO image.
Primjer je lista MD5 checksum-a za CentOS Linux:
83221db52687c7b857e65bfe60787838 CentOS-6.5-x86_64-bin-DVD1.iso 91018b86ca338360bc1212f06ea1719f CentOS-6.5-x86_64-bin-DVD2.iso 8c37390fa5d932d03feb05fba13fe92e CentOS-6.5-x86_64-LiveCD.iso 7b571e13ce6c3f61dc176bd34f8d60bb CentOS-6.5-x86_64-LiveDVD.iso 0d9dc37b5dd4befa1c440d2174e88a87 CentOS-6.5-x86_64-minimal.iso 939fd1d87c11ffe7795324438b85adfb CentOS-6.5-x86_64-netinstall.iso
Kako MD5 checksum [hash]) napraviti na Linux-u, na datoteci : CentOS-6.5-x86_64-bin-DVD1.iso (CentOS instalacijski DVD image) :
md5sum CentOS-6.5-x86_64-bin-DVD1.iso 83221db52687c7b857e65bfe60787838 CentOS-6.5-x86_64-bin-DVD1.iso
Dakle ovdje vidimo da smo dobili identičan MD5 checksum što znači kako se DVD ISO datoteka ispravno kopirala s interneta.
Osim MD5, postoje i drugi hash algoritmi:
| Brojčana oznaka u Linuxu | Hashing algoritam |
| 1 | MD5 |
| 2 | Blowfish |
| 5 | SHA-256 |
| 6 | SHA-512 |
Vratimo se na sliku “Kako izgleda kriptirani password”.
U Linux-u, lozinka (password) se kreira kombiniranjem “salt-a” i željenog “password-a”, pomoću odabranog algoritma.
Primjer
1. Kako provjeriti koji hash-ing algoritam naš Linux sustav koristi, iz komandne linije:
authconfig --test | grep hash
Rezultat našeg upita je :
password hashing algorithm is sha512
U našem slučaju koristi se hashing algoritam 6 : tj SHA-512 , pa ćemo u primjeru koji slijedi, koristiti isti algoritam.
2. Kako ručno kreirati password, korištenjem salt-a i željenog algoritma ?.
Koristiti ćemo programski jezik python , iz komandne linije:
python -c 'import crypt; print crypt.crypt("ovo_je_password","$6$ovo_je_salt")'
python skripta nam je kreirala sljedeću kriptiranu lozinku:
$6$ovo_je_salt$fPiMsDoTHyyQ9R6qx3cIICWKOCqD8dfBzMTrF8rnRMHsETgsU.
Rezultat/ispis je funkcionalan dio passworda, koji smo na dvije slike prije označili kao dio pod nazivom “Kriptirani password”. Ovakav niz karaktera/znakova je potpuno funkcionalan za upotrebu u /etc/shadow datoteci, na pravom mjestu - opisanom i vidljivom na istoj slici,
/etc/group datoteka sadrži korisničke grupe i pripadnosti korisnika tim grupama.
Primjerice grupa bin ima svoj identifikacijski broj 1 i njoj pripadaju korisnici bin i daemon
Izgled /etc/group datoteke je opisan na slici:
Standardne sigurnosne postave nalaze se konfigurirane u datoteci: /etc/login.defs
Unutar Shadow password paketa (shadow-utils), nalaze se osnovni mehanizmi u kojima su definirane opcije i mogućnosti, koje se zapisuju u datoteku /etc/shadow i koriste za cijeli sustav.
Što sve možemo definirati ?
PASS_MAX_DAYS : maksimalan broj dana unutar koji se lozinka smije koristiti. Nakon ovog period se mora promijeniti.PASS_MIN_DAYS : minimalan broj dana između dvije promijene lozinke. Bilo koji pokušaj promijene lozinke, prij vremena definiranog ovdje, biti će odbačen.PASS_WARN_AGE : broj dana, prije nego se lozinka mora promijeniti, kada će biti poslano upozorenje kako se lozinka mora promijeniti. Ako nije ništa upisano, ne šalje se nikakva poruka. Numa znaći kako se poruka šalje isti dan kada se mora mijenjati lozinka.LOGIN_RETRIES : maksimalni broj pkušaja ponovnog upisivanja lozinke (ako smo nekoliko puta upisali krivu)ENCRYPT_METHOD : definicija algoritma s kojim se kriptira lozinka u datoteci : /etc/shadowSHA512 - SHA512 - u /etc/shadow će biti vidljivo kao $6$useradd, groupadd, ili newusers):GID_MIN : kod kreiranja novih korisničkih grupa (koje se zapisuju u /etc/group), od kojeg GID (Group ID) broja se krećeGID_MAX : kod kreiranja novih korisničkih grupa (koje se zapisuju u /etc/group), do kojeg GID (Group ID) broja se mogu kreirati grupeuseradd i newusers):UID_MIN : kod kreiranja novih korisnika, od kojeg UID broja se kreće (standardno je 1000)UID_MAX : kod kreiranja novih korisnika, do kojeg UID broja se ide (standardno je 60000)
Osnovni rad s korisničkim računima, vezanim uz vremenske okvira korisničkih računa, omogućava nam naredba chage. Parametri koji utiču na rad ove naredbe su definirani također u datoteci /etc/login.defs
Pogledajmo par primjera:
Promijenimo vrijeme nakon kojega korisnik pero mora promijeniti lozinku, na 60 dana :
chage -M 60 pero
Natjerajmo korisnika pero, da mora promijeniti lozinku, nakon prvog logiranja:
chage -d 0 pero
Za naprednije funkcionalnosti, potrebna je nadogradnja ovog sustava, koja dolazi s PAM (Pluggable Authentication Modules) mogućnostima, a koje su danas standardno dostupne u Linuxu.
… U IZRADI …
Lista osnovnih naredbi za rad s korisničkim računima i korisničkim grupama:
id ispiši tko je trenutni logirani korisnik, koji je njegov User ID (UID) i Group ID (GID) i kojim grupama pripadagroups ispiši kojim korisničkim grupama pripada trenutni korisnikgroupadd dodaj/kreiraj novu korisničku grupugroupdel obriši korisničku grupugroupmod modifikacije nad korisničkim grupamauseradd dodavanje novog korisnikauserdel brisanje postojećeg korisnikausermod modifikacije nad korisničkim računomU primjerima ćemo vidjeti konkretnu primjenu gore navedenih naredbi
Primjeri
1. Ispiši tko je trenutni korisnik [naredba id].
id uid=0(root) gid=0(root) groups=0(root)
Opis :
uid 0 , znači da je korisnički ID jednak 0 ( 0 je root korisnik [Administrator po Windows terminologiji]), te da je primarna grupa ovog korisnika (ime grupe je root ) , te da još pripada u sekundane grupe ( root ).
2. Ispiši kojim sve grupama pripada trenutni korisnik root (naredba groups)
groups root
3. Kreiraj nove grupe korisnici , korisnici2 i novi za koje želimo da imaju GID (Group ID) [-g] , br : 1001 i 1002 te 1003 (naredba groupadd)
groupadd -g 1001 korisnici
groupadd -g 1002 korisnici2
groupadd -g 1003 novi
4. Želimo promijeniti GID (Group ID) grupe br.: 1003 (grupa: novi) u 2003 . Ovo se radi naredbom groupmod
groupmod -g 2003 novi
5. Odlučili smo grupu novi preimenovati u novikorisnici
groupmod -n novikorisnici novi
6. Ipak želimo obrisati grupu novikorisnici jer nam više ne treba
groupdel novikorisnici
7.Kreiraj korisnika pero , koji će dobiti UID (User ID) 100 ,pripadati će primarnoj grupi koja ima GID (Group ID) 1001 , home direktorij će mu biti /home/pero te će mu startni shell biti bash
U ovom primjeru home direktorij će biti automatski kreiran od strane operativnog sustava.
useradd pero -u 100 -g 1001 -d /home/pero -s /bin/bash
8.Dodajmo istog korisnika ( pero) i u dodatnu grupu (-a) korisnici2 ali ne mijenjati primarnu grupu (- G) :
usermod -a -G korisnici2 pero
9.Promijeni pripadnost primarnoj grupi korisnici2 (-g) za korisnika pero
usermod -g korisnici2 pero
10. Više nam ne treba korisnik pero , obrišimo ga , kao i njegov home direktorij i sve datoteke u njemu (-r), čak iako je već logiran (-f)
userdel -f -r pero
Runlevel-i su modovi ili stanja rada svakog UNIX/Linux operativnog sustava. Kod podizanja operativnog sustava, sustav se podiže u određeni runlevel ovisno o potrebama:
runlevel 3 koji nam omogućava višekorisnički rad s podignutom mrežom i svim mrežnim servisima (daemon-ima) te svim ostalim funkcionalnostima,runlevel 5 , koji ima sve mogućnosti kao runlevel 3 ali ima i grafičko sučelje koje se u UNIX/Linux sustavima zove: X Window System.runlevel 1 : koristi se za održavanja , kada ne želimo da se itko može spojiti na sustav preko mreže, već samo lokalni administrator (root korisnik), - koristi se za potrebe popravljanja većih grešaka ba sustavu , tvrdom disku i sl.runlevel 0 : koristi se za gašenje sustava , ovaj runlevel se brine o tome kako se svi programi i servisi uredno ugaserunlevel 6 : koristi se za restartanje sustava , sistem rada je sličan kao runlevel 0. Popis i malo više detalja o runlevelima pogledajmo u tablici:
Kod svakog startanja operativnog sustava, nakon što se učita Linux kernel, pokreće se prvi proces tj. init program, on čita datoteku /etc/inittab u kojoj su definirani runleveli.
init proces osim toga pokreće i sve ostale procese na sustavu a sam se pokreće kao servis ( daemon ). On na osnovi runlevel broja pokreće skripte koje se nalaze u direktorijima unutar glavnog direktorija /etc/rc.d .
Osnovna struktura direktorija unutar /etc/rc.d je :
drwxr-xr-x 2 root root 4.0K Nov 11 15:05 rc0.d drwxr-xr-x 2 root root 4.0K Nov 11 15:05 rc1.d drwxr-xr-x 2 root root 4.0K Nov 11 15:05 rc2.d drwxr-xr-x 2 root root 4.0K Nov 11 15:05 rc3.d drwxr-xr-x 2 root root 4.0K Nov 11 15:05 rc4.d drwxr-xr-x 2 root root 4.0K Nov 11 15:05 rc5.d drwxr-xr-x 2 root root 4.0K Nov 11 15:05 rc6.d
Pri tome:
rc0.d je init 0
rc1.d je init 1
itd.
Pogledajmo sadržaj direktorija za runlevel 3 ( /etc/rc.d/rc3.d ) :
lrwxrwxrwx 1 root root 22 Nov 11 15:04 K15htcacheclean -> ../init.d/htcacheclean lrwxrwxrwx 1 root root 13 Jul 24 16:06 K35nmb -> ../init.d/nmb lrwxrwxrwx 1 root root 13 Jul 24 16:06 K35smb -> ../init.d/smb lrwxrwxrwx 1 root root 20 Jul 24 16:06 K50netconsole -> ../init.d/netconsole lrwxrwxrwx 1 root root 15 Nov 11 15:05 K50snmpd -> ../init.d/snmpd lrwxrwxrwx 1 root root 19 Nov 11 15:05 K50snmptrapd -> ../init.d/snmptrapd lrwxrwxrwx 1 root root 17 Jul 24 16:06 K73winbind -> ../init.d/winbind lrwxrwxrwx 1 root root 14 Nov 11 15:05 K74nscd -> ../init.d/nscd lrwxrwxrwx 1 root root 15 Nov 11 15:04 K75netfs -> ../init.d/netfs lrwxrwxrwx 1 root root 19 Jul 24 16:06 K75quota_nld -> ../init.d/quota_nld lrwxrwxrwx 1 root root 19 Nov 11 15:04 K75udev-post -> ../init.d/udev-post lrwxrwxrwx 1 root root 15 Nov 11 15:05 K87named -> ../init.d/named lrwxrwxrwx 1 root root 21 Jul 24 16:06 K87restorecond -> ../init.d/restorecond lrwxrwxrwx 1 root root 17 Jul 24 16:06 K87rpcbind -> ../init.d/rpcbind lrwxrwxrwx 1 root root 21 Jul 24 16:06 K89portreserve -> ../init.d/portreserve lrwxrwxrwx 1 root root 15 Nov 11 15:04 K89rdisc -> ../init.d/rdisc lrwxrwxrwx 1 root root 18 Jul 24 16:06 S08iptables -> ../init.d/iptables lrwxrwxrwx 1 root root 21 Jul 24 16:06 S08modules_dep -> ../init.d/modules_dep lrwxrwxrwx 1 root root 17 Nov 11 15:04 S10network -> ../init.d/network lrwxrwxrwx 1 root root 17 Nov 11 15:05 S12rsyslog -> ../init.d/rsyslog lrwxrwxrwx 1 root root 14 Jul 24 16:06 S55sshd -> ../init.d/sshd lrwxrwxrwx 1 root root 16 Jul 24 16:06 S56xinetd -> ../init.d/xinetd lrwxrwxrwx 1 root root 19 Jul 24 16:06 S65saslauthd -> ../init.d/saslauthd lrwxrwxrwx 1 root root 18 Jul 24 16:06 S80sendmail -> ../init.d/sendmail lrwxrwxrwx 1 root root 15 Nov 11 15:04 S85httpd -> ../init.d/httpd lrwxrwxrwx 1 root root 15 Jul 24 16:06 S90crond -> ../init.d/crond lrwxrwxrwx 1 root root 11 Nov 11 15:04 S99local -> ../rc.local
Vidimo da su sve S* i K* datoteke zapravo simbolički linkovi na datoteke koje se nalaze unutar direktorija /etc/rc.d/init.d .
To je tako zbog toga što sve servise (daemone) tj. njihove skripte kreiramo samo na jednom mjestu ( /etc/rc.d/init.d ) a onda u svakom runelevel direktoriju ( /etc/rc.d/rc*.d ) trebamo samo kreirati simbolički link koji ako mu ime počinje s K , će biti pokrenut s opcijom stop , a ako mu ime počinje sa S , biti će pokrenut sa start
Ono što je važno kod izvornih skripti koje se nalaze unutar direktorija /etc/rc.d/init.d je to da moraju imati minimalno implementirane tri opcije ( stop , start , restart ).
Osim toga, u slučaju RedHat baziranik Linux-a [pr. CentOS] ako skripta sadrži ključnu riječ # chkconfig , parametri iza nje će se koristiti za automatsko kreiranje /etc/rc.d/rc*.d simboličkih linkova.
Važno je znati kako je PID (Proces ID) od init procesa, nosi broj 1, pošto je on prvi proces koji pokreće sve ostale procese i brine se o njima.
Standardno se podiže runlevel 3, kod Linuxa koji ne pokreću grafičko sučelje (X Window) a za one koji ga pokreću, se podiže runlevel 5.
Dakle ako je u pitanju standardni (default) runlevel 3, događa se sljedeće:
1. Nakon startanja kernela init ulazi u direktorij /etc/rc.d/rc3.d/
2. Iz tog direktorija pokreću se sve skripte koje u imenu počinju sa K i to prema broju. Dakle prvo s najmanjim brojem pr. K1….. , K2……. , pa K3….. i tako do najvećeg broja i to tako što se svaka od njih poziva s opcijom stop.
Dakle K1… stop.
pr.: K15htcacheclean stop i to tako za sve njih koliko god ih ima.
Dakle prvo se stopiraju svi servisi.
3. Nakon toga se startaju one skripte sa S u imenu (ovdje se zapravo startaju servisi), ponovno s najmanjim brojem pr. S1….. , S2……. , pa S3….. i tako do najvećeg broja i to tako što se svaka od njih poziva sa opcijom start . Dakle S1… start ,
pr.: S10network start i to tako za sve njih koliko god ih ima.
Zbog čega brojevi kod imena S i K skripti ?
Zbog toga da točno možemo kontrolirati koja će se prije ili poslije koje skripte pokrenuti.
Jedina mala razlika su runleveli 0 (halt/shutdown) i 6 (reboot).
Dakle /etc/rc.d/rc0.d/ i /etc/rc.d/rc6.d/ sastoje se 99% od datoteka imena K* , pošto oni, kod gašenja ili restarta računala moraju “uredno” stopirati tj.poubijati (odatle Kill) sve servise. Obično su samo dvije S* datoteke.
Prva je koja nakon što je sve uredno stopirano preko K* poubija sve što je možda zaostalo.
Druga je ona koja u slučaju init 0 gasi računalo a u slučaju init 6 (restart) restarta računalo.
Napomena : U svakom trenutku, moguće je promijeniti runlevel, naredbom init
Primjeri.
1. Želimo li ugasiti računalo to možemo napraviti sa:
init 0
2.Ako ga želimo restartati onda pokrećemo:
init 6
3. Želimo nešto raditi/popraviti na sustavu i ne želimo dozvoliti pristup nikome preko mreže vež samo nama (root), koji smo fizički ispred računala/poslužitelja, tada možemo koristiti:
init 1
Sistemski servisi koji se u Unix/Linux svijetu nazivaju “Daemoni” su programi koji se pokreću u pozadini (background) i koji su zamišljeni da rade bez stalne kontrole i uplitanja korisnika. Dakle oni su zaduženi za pojedine funkcionalnosti sustava. Naime funkcionalnost cijelog Linux sustava je raspodjeljena u cijeli niz daemona, od kojih svaki odrađuje svoj zadatak.Pr. jedna skripta podiže daemone koji startaju mrežne kartice i konfiguriraju ih, druga koja podiže jedan mrežni servis (pr. SSH Server) , treća koji podiže drugi mrežni servis (pr. NFS mrežni datotečni sustav) itd. svaki za svoju namjenu.
U praksi, daemone pozivaju shell skripte koje se inicijalno nalaze u direktoriju /etc/rc.d/init.d/ te koje sustav starta/stopira ili restarta prema pravilima koja smo već objasnili u prijašnjem poglavlju. Kako ih možemo ručno pokretati/stopirati i restartati te što moraju sadržavati, objasniti ćemo kroz primjere.
Slijedi primjer izlistanja početka skripte koja starta SSH Server ( /etc/rc.d/init.d/sshd ) na kojoj ćemo opisati procese inicijalizacije.
#!/bin/bash # # sshd Start up the OpenSSH server daemon # # chkconfig: 2345 55 25 # description: SSH is a protocol for secure remote shell access. \ # This service starts up the OpenSSH server daemon. ... ... ...
Dakle linija # chkconfig: 2345 55 25 znači sljedeće:
2345 u ovom slučaju) znači u kojim runlevel-ima će se pokretati ova skripta55 u ovom primjeru) je prioritet kod startanja ( S* broj)25 u ovom primjeru) je prioritet kod stopiranja ( K* broj)Naime u ovom slučaju sistem će kreirati simboličke linkove naziva S55sshd u runlevel direktorijima 2,3,4 i 5 ( /etc/rc.d/rc*.d )te K25sshd u preostalim runlevelima u kojima sistem mora gasiti ovaj servis, dakle :
0 (shutdown),1 (singleuser , no network) i6 (reboot)Osim gore navedenog svaka skripta koja poziva određene daemone mora imati minimalno implementirane tri opcije:
stop , start , restart
Kako to pojednostavljeno izgleda na primjeru SSH skripte (nastavak na početak /etc/rc.d/init.d/sshd skripte izlistane gore)
... ... ...
# Some functions to make the below more readable
KEYGEN=/usr/bin/ssh-keygen
SSHD=/usr/sbin/sshd
RSA1_KEY=/etc/ssh/ssh_host_key
RSA_KEY=/etc/ssh/ssh_host_rsa_key
DSA_KEY=/etc/ssh/ssh_host_dsa_key
PID_FILE=/var/run/sshd.pid
... ... ...
start()
{
[ -x $SSHD ] || exit 5
[ -f /etc/ssh/sshd_config ] || exit 6
# Create keys if necessary
if [ "x${AUTOCREATE_SERVER_KEYS}" != xNO ]; then
do_rsa1_keygen
do_rsa_keygen
do_dsa_keygen
fi
echo -n $"Starting $prog: "
$SSHD $OPTIONS && success || failure
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $lockfile
echo
return $RETVAL
}
stop()
{
echo -n $"Stopping $prog: "
killproc -p $PID_FILE $SSHD
RETVAL=$?
# if we are in halt or reboot runlevel kill all running sessions
# so the TCP connections are closed cleanly
if [ "x$runlevel" = x0 -o "x$runlevel" = x6 ] ; then
trap '' TERM
killall $prog 2>/dev/null
trap TERM
fi
[ $RETVAL -eq 0 ] && rm -f $lockfile
echo
}
restart() {
stop
start
}
... ... ...
Vidimo da je unutar metoda start/stop/restart niz naredbi koje zapravo u slučaju pozivanja metode start startaju SSH daemon tj /usr/sbin/sshd sa određenim parametrima i argumentima odnosno metoda stop stopira isti daemon odnosno restart, prvo poziva metodu stop pa metodu start .
Nadalje postoji i naredba (za Linuxe bazirane na Redhatu), s kojom možemo vidjeti u kojim runlevelima se koji servis (daemon tj. skripta koja ga starta/stopira) podiže ili ne podiže. Naredba je chkconfig. Možemo ju samo pozvati bez opcija i prekidača ili s njima.
Na novijim verzijama RedHat/CentOS 7.x init proces i servisi vezani uz njega (poput naredbe chkconfig) su zamjenjeni sa systemd servisom i alatima koji dolaze s njim.
Pogledajmo usporednu tablicu funkcionalnosti init + chkconfig (Sysvinit) u odnosu na systemd
| Sysvinit naredbe | Systemd naredba | Opis |
| service IME_SERVISA start | systemctl start IME_SERVISA | Used to start a service (not reboot persistent) |
| service IME_SERVISA stop | systemctl stop IME_SERVISA | Used to stop a service (not reboot persistent) |
| service IME_SERVISA restart | systemctl restart IME_SERVISA | Used to stop and then start a service |
| service IME_SERVISA reload | systemctl reload IME_SERVISA | When supported, reloads the config file without interrupting pending operations. |
| service IME_SERVISA condrestart | systemctl condrestart IME_SERVISA | Restarts if the service is already running. |
| service IME_SERVISA status | systemctl status IME_SERVISA | Tells whether a service is currently running. |
| ls /etc/rc.d/init.d/ | systemctl (or) systemctl list-unit-files –type=service (or) ls /lib/systemd/system/*.service /etc/systemd/system/*.service | Used to list the services that can be started or stopped , Used to list all the services and other units |
| chkconfig IME_SERVISA on | systemctl enable IME_SERVISA | Turn the service on, for start at next boot, or other trigger. |
| chkconfig IME_SERVISA off | systemctl disable IME_SERVISA | Turn the service off for the next reboot, or any other trigger. |
| chkconfig IME_SERVISA | systemctl is-enabled IME_SERVISA | Used to check whether a service is configured to start or not in the current environment. |
| chkconfig –list | systemctl list-unit-files –type=service (or) ls /etc/systemd/system/*.wants/ | Print a table of services that lists which runlevels each is configured on or off |
| chkconfig IME_SERVISA –list | ls /etc/systemd/system/*.wants/IME_SERVISA.service | Used to list what levels this service is configured on or off |
| chkconfig IME_SERVISA –add | systemctl daemon-reload | Used when you create a new service file or modify any configuration |
Vratimo se na RedHat/CentOS 6.x , init i chkconfig
Lista mogućnosti naredbe chkconfig
Mi ćemo probati ispisati sve runlevele za skriptu (daemon) koju smo maloprije gledali (sshd):
chkconfig --list sshd sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Ovdje vidimo ono o čemu smo pričali gore (pogledajte 2,3,4 i 5).
S naredbom chkconfig moguće je i naknadno mijenjati runlevele skripti
(servisa/daemona) koji su već na sustavu ili dodavati nove (ili brisati postojeće).
Primjeri
1.Želimo da se HTTP server (httpd) starta sa sustavom automatski (dakle da bude u runlevelima 2,3 ,4 ,5)
chkconfig httpd on
Provjera:
chkconfig --list httpd httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
2. Želimo ipak da se HTTP server ne starta više automatski:
chkconfig httpd off
Provjera:
chkconfig --list httpd httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
3. Kreirali smo svoju novu skriptu, naziva /etc/rc.d/init.d/moj-servis , koja sadrži start , stop i restart opcije te ju želimo dodati pomoći chkconfig naredbe ,da se starta automatski sa sustavom.
Prvo ju dodajmo u chkconfig90
chkconfig --add moj-servis
Sada joj dodjelimo prava da se starta automatski u runlevelima 2,3,4,5
chkconfig moj-servis on
U radu i primjerima koji slijede, koristiti ćemo Red Hat package management (RPM),
koji koriste i druge distribucije Linux-a, bazirane na Red Hat-u, poput:
Ekstenzija paketa je .rpm .
RPM Package manager nam omogućava:
Ekvivalent Linux paketa u Windows svijetu je instalacija nekog programa – u formatu .msi ili .exe :
Npr. Setup.exe ili Setup.msi
Paketi se uglavnom nalaze na tkzv. javnim repository-jima poput “EPEL” repozitorija
EPEL repozitorij za RedHat bazirane Linux-e , verzije 6.x , i to za 64.bitnu x86 platformu procesora, je dostupan na :
http://mirror.datacenter.by/pub/fedoraproject.org/epel/6/x86_64/
Repozitorij je pripremljeni direktoriji na Web-u, koji sadrži softverske pakete (.rpm) i ostale specifične datoteke, s kojega možete “skinuti ” (download) željene dostupne pakete. Podržani načini skidanja su preko HTTP ili FTP protokola.
Svaki RPM paket može biti i kriptografski verificiran pomoću:
Vratimo se paketima i onome što se nalazi unutar svakog paketa:
U trenutku kada radimo neku operaciju sa paketima, oodređene informacije o svakom paketu se snimaju/čitaju u/iz interne RPM baze podataka (na samom računalu). Interna RPM baza podataka sadrži listu instaliranih paketa na sustavu. Bazu možemo pretraživati po raznim kriterijima te možemo provjeriti verzije instaliranih paketa.
Primjeri
Ispiši verziju paketa imena telnet :
rpm -q telnet
Izlistaj (-q) sve (-a) instalirane pakete:
rpm -qa
Upotreba wildcard-a
ispiši sve instalirane pakete i pronađi samo onaj koji u imenu ima telnet*
rpm -qa "telnet*"
Pronađi koji paket je instalirao točno određenu datoteku (s apsloutnom putanjom) pr. datoteka ssh , koja se nalazi u /usr/bin/ssh:
rpm -qf /usr/bin/ssh openssh-clients-5.3p1-84.1.el6.x86_64
Osnovni prekidači rpm naredbe su:
-i IME : install – instaliraj paket (IME može biti i URL [FTP ili HTTP])
-U IME : Upgrade – nadogradi paket
-e IME : Erase – obriši/uninstaliraj paket
-V IME : Verify – provjeri paket, provjeravaju se :
Dodatni korisni prekidači : -h (hash marks -#) i -v (verbose)
Korisni prekidaći za pretraživanje (malo slovo Q):
-qi IME: ispiši opis paketa (ovdje je i ime grupe kojoj pripada)
-qg IME : ispiši listu paketa koji pripadaju određenoj grupi
Pr.: rpm -qg “System Environment/Daemons”
-ql IME : ispiši listu datoteka unutar paketa
Pr.: rpm -ql openssh-clients
-qc IME : ispiši konfiguracijske datoteke određenog paketa
-qs IME : ispiši stanje datoteka unutar paketa, poruke mogu biti sljedeće:
I na kraju o nedostacima rpm paketa i samog managera paketa:
Jedino što RPM može napraviti po pitanju ovisnosti o nekom drugom paketu je da prije instalacije provjeri da li je taj paket instaliran i upozori vas da vam nedostaju određeni paketi, ali on ih za vas neće moći instalirati. To morate sami (moguće je [i dosta često] da neki paket koji nedostaje ovisi o nekom trećem ili četvrtom i tako dalje)
YUM (Yellow dog Update Modified) je nadogradnja na mogućnosti RPM package managera.
Možemo reći da je on frontend za RPM package manager.
YUM omogućava praćenje ovisnosti (dependencies) o drugim paketima i automatski ih riješava:
On to riješava uvođenjem dodatka na RPM repository (Metadata), koji je zapravo dodatna baza podataka koja sadrži podatke o svakom paketu i svim međuovisnostima (dependency) između svih rpm paketa.
Svaki puta kada pokrenete yum , on se spaja na sve repozitorije na internetu, koji su vam dodani u sustav.
Nakon pokretanja yum povlači sve YUM baze podataka s njih, na vaše računalo. Na taj način u svakom trenutku usporedbom instaliranih paketa i onih koji su u YUM bazi podataka, YUM “zna” da li se pojavila novija verzija nekog programa (uz osnovnu funkcionalnost da su mu poznate međuovisnosti paketa [dependencies]).
Procedura je sljedeća:
1. Dodajete novi repository (ako nije dodan, a baš na njemu se nalazi paket koji trebate), ako već je dodan, onda preskačete ovaj korak,
2. Kod (svakog) pokretanja YUM-a, sinkroniziraju se meta podaci (Metadata) sa Web repozitorija na lokalno računalo,
3. YUM kopira RPM pakete te provjerava ovisnosti (dependencies), ako postoje,prvo se kopiraju i instaliraju svi paketi koji su prethodno potrebni, a tek onda oni koji slijede.
Osnovni prekidači (najčešće korišteni) , su :
yum update : napravi update svih paketa (full system update)
yum install IME : Instaliraj novi paket imena (IME)
yum erase IME : Uninstaliraj paket imena (IME)
yum search IME : pretraži sve pakete u potrazi za ključnom riječi (IME)
yum list installed : Ispiši popis svih instaliranih paketa
yum grouplist : Ispiši popis svih instaliranih grupa paketa
yum groupinstall IME : Instaliraj grupu paketa , npr:
yum groupinstall "Development Tools"
yum groupremove IME : Uninstaliraj grupu paketa , npr
yum groupremove "Development Tools"
Primjeri
Dodavanje novog repozitorija, poluautomatski (pr. EPEL za 64). Dakle otišli smo na EPEL repozitorij:
http://mirror.datacenter.by/pub/fedoraproject.org/epel/6/x86_64 te želimo instalirali automatski taj repozitorij
(tu se nalazi paket epel-.rpm).
Metoda 1.
Korištenjem naredbe wget koja će napraviti download RPM (package) datoteke koju ćemo instalirati, pomoću RPM paket manager programa rpm u drugom koraku (drugi red)
wget http://mirror.datacenter.by/pub/fedoraproject.org/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -ivh epel-release-6-8.noarch.rpm
Metoda 2.
Korištenjem RPM paket managera, koji podržava HTTP i FTP download direktno, uz instaliranje istog paketa u jednom koraku :
rpm -ivh http://mirror.datacenter.by/pub/fedoraproject.org/epel/6/x86_64/epel-release-6-8.noarch.rpm
Provjerimo da li je novi repozitorij dodan (treba se pojaviti epel):
yum repolist
Naš ispis slijedi:
Loaded plugins: downloadonly, fastestmirror Loading mirror speeds from cached hostfile epel/metalink * base: mirrors.paknet.org * epel: ftp.upjs.sk * extras: mirrors.paknet.org * rpmforge: mirror.de.leaseweb.net * updates: mirrors.paknet.org Internet2 base epel epel/primary_db extras rpmforge
Vidimo da je epel izlistan te da je napravljen download s njega, dakle to je u redu.
U slučaju da epel (ili neki drugi) repozitorij nije uredno dodan u listu aktivnih repozitorija , možemo ga ručno uključiti
yum --enablerepo=epel
Instalirajmo Midnight Commander (Norton Commander klon za Linux), ime paketa je mc
yum install mc
Uninstalirajmo Midnight Commander (Norton Commander klon za Linux), ime paketa je mc
yum erase mc
U svakom UNIX/Linux sustavu moguće je automatizirati pokretanje naredbi ili shell skripti u određeno vrijeme.
Nekada je potrebno pokretati određene naredbe ili skripte periodički, a nekada postoji potreba samo jednom (jednokratno) pokrenuti nešto.
Oba scenarija su pokrivena sa dvije naredbe tj. servisa/daemona (i jednim dodatnim):
crontab - za periodičko repetitivno pokretanje : pr. želimo pokretati nek skripte svaki dan u ponoć (antivirus scan, disk check , ntp dohvaćanje točnog vremena i sl.). Za njen rad je zadužen cron servis/daemonanacron - za periodičko repetitivno pokretanja poput cron(tab)-a ali za slučajeve kade se nešto treba pokretati na dnevnoj, tjednoj ili mjesečnoj razini bez obzira na točno vrijeme. Za njen rad je također zadužen cron servis/daemonat - za jednokratno pokretanje: pr. želimo samo danas u 20:00.h. pokrenuti neku skriptu koja će nam pokrenuti neki posao čije izvršavanje će trajati cijelu noć i sl.
Crontab se koristi za automatsko pokretanje programa u točno određeno vrijeme.
Format crontab unosa je opisan na slici:
Dakle svaki red u crontab-u je novi unos, koji mora biti strukturiran kako je opisano na slici.
Na slici je konkretan primjer pokretanja naredbe ntpdate , koja se spaja na ntp server (10.10.11.12) i povlači točno vrijeme , svaki dan u ponoć (00:00).
Opcije naredbe crontab su:
e - editiraj crontab datoteku
l - (malo slovo L) ispiši sadržaj datoteke
r - briše korisnikovu crontab datoteku
Primjer
Kreiraj novi crontab unos (da se pokreće svaki dan u 00:00.h.), koji će pokretati naredbu koja će ispisati zauzeće diskovnih particija: df -h
crontab -e 0 0 * * * df -h
Konfiguracija na razini cijelog operacijskog sustava (ne vezano za korisnika) se nalazi u datoteci : /etc/crontab, koja obično izgleda ovako:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
Vidljivo je kako se osim standardnih polja kao kod običnog crontaba, ovdje nalazi i polje za korisnika (user-name) nakon kojega standardno slijedi naredba ili skripta/program koji se trebaju izvršiti u zadano vrijeme.
Ova globalna konfiguracija definirana u /etc/crontab se vrlo često ne koristi već se obično sve konfigurira na razini svakog pojedinog korisnika. Tako se obično administracijske (sistemske) stvari definiraju pod korisnikom root.
Anacron je za razliku od crontab-a zamišljen za pokretanje na stolnim računalima ili laptopima. Stoga često ne dolazi standardno instaliran sa poslužiteljskim verzijama Linuxa. Naime njegova je namjena pokretanje željenih zadataka (naredbi ili skripti) unutar određenog dana a ne točnog sata i minute u određenom danu. To je stoga jer stolna računala ili laptopi i sl. nisu pokrenuti non-stop poput poslužitelja a često imamo potrebu pokrenuti neki zadatak u danu, kada se računalo uključi. Crontab nam ovdje ne bi bio od koristi jer ako bi propustili točno vrijeme kada se pokreće crontab zadatak, on ne bi bio pokrenut. S anacron-om je točno vrijeme pokretanja nevažno - on će pokrenuti željeni zadatak unutar određenog dana, kad kod je računalo pokrenuto.
Možemo reći da je preciznost pokretanja željene naredbe ili skripte anacron-a jedan dan dok je kod crontaba to jedna minuta.
Sintaksa za anacron je :
DAN KAŠNJENJE IDENTIFIKATOR SKRIPTA , pri tome :
DAN označava dan u mjesecu kada se skripta ili naredba moraju izvršiti (može biti bilo koji broj : 1-31). Vrijednost 1 znači svaki dan, pr. vrijednost 7 znači svakih sedam dana itd.KAŠNJENJE je vremenski odmak od trenutka pokretanja operacijskog sustava, u minutama, kada želimo da se skripta ili program pokrenu. Pr. 15 minuta nakon pokretanja našeg operacijskog sustava Linux .IDENTIFIKATOR je jedinstveni identifikator anacron zadatkaSKRIPTA je naredba ili skripta koju želimo pokrenuti
Globalna konfiguracijska datoteka “anacron”-a je : /etc/anacrontab.
Tek toliko o anacron-u jer ga dalje nećemo koristiti pošto se bavimo poslužiteljskim verzijama Linuxa.
Koristi se za automatsko jednokratno pokretanje programa ili skripti u točno određeno vrijeme.
Ako izlaz naredbe at nije preusmjeren u datoteku generirati će se e-mail koji sadrži stdout (standardnu poruku programa) i stderr (standardnu poruku o grešci - ako je ima).
Primjeri
Kreirajmo datoteku at.datoteka u 10:18.h. (CTRL d je izlaz)
at 10:18 touch at.datoteka CTRL d
Neka at pokrene samo skriptu (-f) at.skripta.sh u 10:19.h. i još pošalje e-mail (-m)
at 10:19 -m -f at.skripta.sh
Osim navođenja točnog vremena, moguće je navoditi i relativno vrijeme, primjerice kada se određeni at zadatak pokreće za nekoliko, minuta, sati ili dana od sada.
Primjer (2 minute od sada, 2 sata od sada ili 2 dana od sada):
at now + 2 min ... at now + 2 hour ... at now + 2 day
Provjerimo koje sve at zadatke imamo aktivne:
atq 3 Tue Jan 7 10:519:00 2014 a root
U prvom stupcu je vidljiv broj posla [job number] (3 u našem primjeru) , potom datum kada se treba izvršiti i pod kojim korisničkim imenom (root u našem slučaju).
Ako zbog nekog slučaja želimo maknuti tj. obrisati određeni at zadatak (job) za to se koristi naredba atrm nakon kojeg je potrebno navesti job number (u primjeru ćemo obrisati naš prethodni at posao br. 3):
atrm 3
Za arhiviranje i čitanje arhiviranih datoteka koristi se naredba tar
Nastala je zbog potrebe za arhiviranjem podataka na tračne medije, za pohranu podataka (backup).
Naziv je došao od Tape ARchive (tračna arhiva).
Za potrebe arhiviranja podataka ili komprimiranje i dekomprimiranje, najčešće se koristi naredba tar. Razlikujmo arhiviranje od komprimiranja (ili dekomprimiranja) jer arhiviranje uključuje i više od toga.
tar osim samih datoteka i/ili direktorija može spremati i sve ovlasti (permissions) datoteka i direktorija.
Ovo je vrlo bitno jer u slučaju da smo arhivirali (napravili backup) podatke i kasnije ih želimo dearhivirati tj. vratiti nazad na izvorno mjesto, želimo da nam budu sačuvane i sve ovlasti (od vlasnika, grupe i ostalih , do rwx modova za svakoga od njih).
Neki od prekidača naredbe tar su :
c – create (kreiraj)v - verbose (detaljniji ispis)t – izlistaj sadržajf – sljedeći argument je naziv datotekez – dodatno komprimiraj (gzip format)j – dodatno komprimiraj (bzip2 format)p – sačuvaj sve ovlasti (preserve permissions – ovo je standardno ako ste root)Primjeri
Kreiraj tar arhivu od trenutnog direktorija ( . ), naziva arhiva.tar
tar cvf arhiva.tar .
Kreiraj tar arhivu od trenutnog direktorija ( . ), direktno na traku (/dev/st0)
tar cvf /dev/st0 .
Kreiraj komprimiranu tar arhivu od trenutnog direktorija ( . ) , naziva arhiva.tgz
tar cvzf arhiva.tgz .
Ispiši samo sadržaj datoteke arhiva.tgz
tar tvf arhiva.tgz
Odkomprimiraj i dearhiviraj arhivu: arhiva.tgz
tar xvzf arhiva.tgz
tar arhiva pohranjuje i ovlasti (permissions) svih datoteka i direktorija.
U slučajevima kada nam je potrebno samo komprimiranje ili dekomprimiranje datoteka (i direktorija), zbog potreba arhiviranja, kopiranja s medija na medij (pr. tvrdi disk → USB stick) ili preko mreže, možemo koristiti neke od često korištenih programa.
gzip i gunzip : komprimiranje (gzip) i dekomprimiranje (gunzip)
zip i unzip : Komprimiranje (zip) i dekomprimiranje (unzip)
bzip2 i bunzip2 :Komprimiranje (bzip2) i dekomprimiranje (bunzip2)
gzip je program odnosno format datoteka (.gz ili .gzip) koji je nastavo kao zamjena za komercijalni UNIX alat/naredbu compress, u sklopu GNU projekta, početkom 1992.g. On je baziran na DEFLATE algoritmu koji je kombinacija LZ77 i Huffman coding algoritama. Zbog činjenice kako su u to vrijeme LZW i drugi algoritmi za komprimiranje bili zaštićeni patentima.
Jednu varijantu LZ77 algoritma za komprimiranje/dekomprimiranje koristi i ALDC (Adaptive Lossless Data Compression) algoritam koji koriste tračni uređaji (Poglavlje : Rad s tračnim uređajima
LZ4 format komprimiranja/dekomprimiranja podataka u radu (on the fly), a koji je baziran na LZ77, koristi i ZFS datotečni sustav (uz gzip, DEFLATE, LZJB i druge), što govori o njegovoj brzini rada.
Svaka gzip datoteka osim samih komprimiranih podataka sadrži i CRC-32 Checksum, tako se integritet podataka može provjeriti u bilo kojem trenutku.
Česti prekidaći naredbe gzip su:
-d : dekomprimiraj (isto kao i pozivanje naredbe gunzip)-c : izlaz je na standard output (stdout) tako da će izvorne datoteke biti sačuvane-l : pogledajmo koliki je omjer komprimiranja postignut da gzip datoteci-r : rekurzivno komprimiranje svih datoteke unutar svih poddirektorija-t : testirajmo komprimiranu arhivu-1 … -9 : faktor/brzina komprimiranja : -1 najbrže (i “najlošije”) , … -9 najsporije (i “najbolje”)Pogledajmo i primjere koji slijede.
Primjeri
Prvo izlistajmo daoteke i direktorije
ls -alh total 164K drwxr-xr-x 3 root root 4.0K Aug 7 11:27 . drwxr-xr-x 3 root root 4.0K Aug 7 11:18 .. drwxr-xr-x 2 root root 4.0K Aug 7 11:27 podaci -rw-r--r-- 1 root root 33K Aug 7 11:22 text1.txt -rw-r--r-- 1 root root 112K Aug 7 11:22 text2.txt -rw-r--r-- 1 root root 2.7K Aug 7 11:20 text.txt
1. Komprimirajmo datoteke : text.txt , text1.txt i text2.txt :
gzip text.txt text1.txt text2.txt
Svaka datoteka će biti komprimirana a izvorne (nekomprimirane neće biti zadržane).
Pogledajmo što smo dobili:
ls -alh total 24K drwxr-xr-x 3 root root 4.0K Aug 7 11:30 . drwxr-xr-x 3 root root 4.0K Aug 7 11:18 .. drwxr-xr-x 2 root root 4.0K Aug 7 11:27 podaci -rw-r--r-- 1 root root 157 Aug 7 11:22 text1.txt.gz -rw-r--r-- 1 root root 391 Aug 7 11:22 text2.txt.gz -rw-r--r-- 1 root root 66 Aug 7 11:20 text.txt.gz
2. Odkomprimirajmo priješnje komprimirane datoteke:
gzip -d text.txt.gz text1.txt.gz text2.txt.gz
Mogli smo koristiti i naredbe:
gunzip text.txt.gz text1.txt.gz text2.txt.gz
ili koristiti regularne izraze s obije naredbe, pr.:
gunzip *.txt.gz
3. Komprimirajmo sada datoteku : text2.txt ali tako da zadržimo (-c) i izvornu nekomprimiranu datoteku.
Pošto će sve ići na standardni izlaz (standard output), moramo to sve i preusmjeriti u izvorišnu .gz ili .gzip datoteku:
gzip -c text2.txt> text2.txt.gz
Pogledajmo sadržaj direktorija:
ls -alh total 168K drwxr-xr-x 3 root root 4.0K Aug 7 11:41 . drwxr-xr-x 3 root root 4.0K Aug 7 11:18 .. drwxr-xr-x 2 root root 4.0K Aug 7 11:27 podaci -rw-r--r-- 1 root root 33K Aug 7 11:22 text1.txt -rw-r--r-- 1 root root 112K Aug 7 11:22 text2.txt -rw-r--r-- 1 root root 391 Aug 7 11:41 text2.txt.gz -rw-r--r-- 1 root root 2.7K Aug 7 11:20 text.txt
Vidljivo je da je i izvorna datoteka ostala netaknuta te da je kreirana nova koju smo komprimirali (text2.txt.gz)
4. Pogledajmo kolika (-l) kompresija je postignuta na našoj datoteci:
gzip -l text2.txt.gz
compressed uncompressed ratio uncompressed_name
391 114048 99.7% text2.txt
Postignuta je vrlo velika kompresija od 99.7% jer se radi o tekstualnoj datoteci koja sadrži samo nizove brojeva koji se ponavljaju, te ih je lako komprimirati.
5. Komprimirajmo sve datoteke u direktoriju podaci :
Prvo pogledajmo sadržaj direktorija podaci:
ls -al podaci/ total 160 drwxr-xr-x 2 root root 4096 Aug 7 12:01 . drwxr-xr-x 3 root root 4096 Aug 7 11:59 .. -rw-r--r-- 1 root root 33408 Aug 7 11:27 text3.txt -rw-r--r-- 1 root root 114048 Aug 7 11:27 text4.txt -rw-r--r-- 1 root root 2688 Aug 7 11:27 text5.txt
Sada sve to komprimirajmo rekurzivno (-r) - dakle sve datoteke unutar svih poddirektorija (ako postoje) unutar vršnog direktorija podaci:
gzip -r podaci
Izlistajmo sada taj direktorij ponovno:
ls -al podaci/ total 20 drwxr-xr-x 2 root root 4096 Aug 7 12:03 . drwxr-xr-x 3 root root 4096 Aug 7 11:59 .. -rw-r--r-- 1 root root 157 Aug 7 11:27 text3.txt.gz -rw-r--r-- 1 root root 391 Aug 7 11:27 text4.txt.gz -rw-r--r-- 1 root root 67 Aug 7 11:27 text5.txt.gz
Vidljivo je da su sve datoteke komprimirane i da izvorne nekomprimirane nisu zadržane !
gzip može komprimirati samo datoteke a ne i direktorije s datotekama ! Za tu namjenu koristimo naredbu tar sa ugrađenom gzip metodom komprimiranja ili druge programe za komprimiranje/dekomprimiranje.
O primjerima koji slijede, vidjeti ćemo i kombinaciju rada programa dd sa gzipom. Naime, kako je program dd (disk dump) svestran, moguće ga je kombinirati s programom za komprimiranje poput gzip.
S disk dunpom smo već radili a sada ćemo vidjeti još neke primjere upotrebe. Prvo se podjstimo njegovih osnovnih prekidača:
if označava ulaznu datoteku ili uređaj (ne zaboravimo kako u Linuxu i disk, predstavlja posebna datoteka )of označava izlaznu datoteku ili uređaj (s istom napomenom od gore)bs označava veličinu blokova podataka koji će se kopiraticount označava koliko blokova podataka treba kopirati (Pr. count=2 kod bs=1M u konačnici znači kopiraj dva (2) puta po jedan MB)U primjerima u kojima ćemo raditi, imati ćemo slijedeće okruženje:
/dev/sda1 je prva particija na SATA sistemskom disku (na koju je instaliran Linux)/dev/sdb1 je prva particija na drugom SATA disku/BACKUP je direktorij koji je mountan prema /dev/sdb1 particijiPrimjeri:
1. Napravimo backup cijelog sistemskog diska, na drugi disk (/dev/sdb1), u datoteku Linux-image-sda1.img
dd if=/dev/sda1 of=/BACKUP/Linux-image-sda1.img
I kada sve završi, dobiti ćemo disk image u datoteci : /BACKUP/Linux-image-sda1.img
2. Napravimo gotovo isto, ali komprimirajmo podatke, prije nego se zapišu u konačnu datoteku, pomoću programa gzip:
dd if=/dev/sda1 | gzip -c > /BACKUP/Linux-image-sda1.img.gz
2.1 U slučaju kada trebamo napraviti obrnuto. Dakle iz komprimirane image datoteke, sve odkomprimirati i potom snimiti na odredišnu particiju.
OPREZ - obrisati ćete sve podatke s trenutne particije /dev/sda1)
gunzip -c /BACKUP/Linux-image-sda1.img.gz | dd of=/dev/sda1
U oba primjera, koristili smo pipe funkcionalnost, kako bi izlaz jednog programa, preuzeo i obradio drugi program.
Naredba zcat poziva funkcionalnosti naredbe gzip a funkcionalno se ponaša kao naredba cat.Dakle zcat u letu odkomprimira sadržaj komprimirane datoteke te se nakon toga ponaša kao cat . To možemo promatrati i kao pozivanje naredbe gzip -c - koji sve šalje na standardni izlaz (stdout) te pozivanje naredbe cat nakon toga.
Primjeri
1.Izlistajmo komprimiranu datoteku text2.txt.gz koja u našem slučaju sadrži niz brojeva
zcat text2.txt.gz 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 222222222222111111111111114444444444444433333333355555555555555 ... ... ...
2. Ponovimo prijašnju naredbu s time da želimo pomoću grep naredbe pronaći samo red koji sadrži : “2211”
zcat text2.txt.gz | grep 2211 222222222222111111111111114444444444444433333333355555555555555
Naredba zless poziva funkcionalnosti naredbe gzip a funkcionalno se ponaša kao naredba less. Dakle zless u letu odkomprimira sadržaj komprimirane datoteke te se nakon toga ponaša kao naredba less. To možemo promatrati i kao pozivanje naredbe gzip -c - koji sve šalje na standardni izlaz (stdout) te pozivanje naredbe less nakon toga.
Primjeri
1.Izlistajmo komprimiranu datoteku text2.txt.gz koja u našem slučaju sadrži niz brojeva
zless text2.txt.gz 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 222222222222111111111111114444444444444433333333355555555555555 ... ... ...
Za razliku od gzip-a, zip arhive mogu komprimirati/dekomprimirati i direktorije i datoteke. ZIP format je analogan kombinaciji naredbe tar i gzip.
ZIP format poput gzip formata koristi DEFLATE algoritam za komprimiranje i dekomprimiranje.
Unutar zip arhive, moguće je pohraniti cijelu strukturu direktorija i datoteka, ali bez njihovih ovlasti.
Česti prekidaći naredbe zip su:
-r : rekurzivno koprimiranje direktorija i svih poddirektorija sa svim datotekama
-T : testiranje ispravnosti arhive
-x : ne ubacuj (Exclude) određene datoteke u arhivu
-1 , … -9 : faktor/brzina komprimiranja : -1 najbrže (i “najlošije”) , … -9 najsporije (i “najbolje”)
Česti prekidaći naredbe unzip su :
-t : testiranje arhive
-o : kod dekomprimiranja, pregazi postojeće datoteke bez pitanja
-p : šalji sadržaj odkomprimirane zip arhive u Linux “Pipe”
Primjeri
1. Komprimirajmo datoteke : text.txt , text1.txt i text2.txt te ih sve ubacimo u ZIP arhivu : arhiva.zip :
zip arhiva.zip text.txt text1.txt text2.txt
2.Komprimirajmo samo datoteku text1.txt u zip arhivu imena arhiva1.zip
zip arhiva1.zip text1.txt adding: text1.txt (deflated 100%)
3.Testirajmo (-T) arhivu : arhiva.zip :
zip -T arhiva.zip test of arhiva.zip OK
4. ISpišimo sadržaj zip arhive arhiva.zip:
unzip -l arhiva.zip
Archive: arhiva.zip
Length Date Time Name
--------- ---------- ----- ----
2688 08-07-2014 11:20 text.txt
33408 08-07-2014 11:22 text1.txt
114112 08-07-2014 16:38 text2.txt
--------- -------
150208 3 files
5. Dekomprimirajmo sve datoteke iz zip arhive arhiva.zip , s time da pregazimo postojeće datoteke (ako ih ima) :
unzip -o arhiva.zip Archive: arhiva.zip inflating: text.txt inflating: text1.txt inflating: text2.txt
6. Dekomprimirajmo zip arhivu : arhiva1.zip (koja sadrži samo jednu tekstualnu datoteku) te ju pošaljimo (“Pipe”) na naredbu more (pomoću prekidaća -p)
unzip -p arhiva1.zip | more 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 ... ... ...
7.Komprimirajmo cijeli direktorij : podaci i sve njegove poddirektorije i datoteke rekurzivno, u datoteku podaci.zip.
zip -r podaci.zip podaci adding: podaci/ (stored 0%) adding: podaci/text4.txt (deflated 100%) adding: podaci/text3.txt (deflated 100%) adding: podaci/text5.txt (deflated 99%)
bzip2 je program za komprimiranje i dekomprimiranje, poput gzip-a. Dakle za rad s datotekama a ne s direktorijima. Izlazna komprimirana datoteka ima ekstenziju .bz2
Za razliku od gzip i zip programa on koristi algoritam za komprimiranje i dekomprimiranje koji postiže puno bolje rezultate ali proces komprimiranja traje nešto dulje.
U biti proces se sastoji od nekoliko algoritama , prvi je : “Burrows–Wheeler transform” algoitam, nakon kojeg se primjenjuje “move-to-front transform” tj. MTF Algoritam i na kraju “Huffman coding” algoritam. Ova metoda se zove i “block-sorting” metoda komprimiranja.
Programe koji mogu komprimirati direktorije i datoteke (potencijalno i uz snimanje ovlasti svih datoteka i direktorija unutar arhive), zovemo “File Archiver”-i
Česti prekidaći naredbe bzip2 :
-d : dekomprimiraj (isto kao i pozivanje naredbe bunzip2)
-c : izlaz je na standard output (stdout) tako da će izvorne datoteke biti sačuvane
-k : sačuvaj izvorne datoteke (inaće će biti obrisane nakon što se kreiraju komprimirane datoteke)
-r : rekurzivno komprimiranje svih datoteke unutar svih poddirektorija
-t : testirajmo komprimiranu arhivu
-1 … -9 : faktor/brzina komprimiranja : -1 najbrže (i “najlošije”) , … -9 najsporije (i “najbolje”)
Primjeri
Pogledajmo naš direktorij:
ls -alh total 164K drwxr-xr-x 3 root root 4.0K Aug 8 14:47 . drwxr-xr-x 4 root root 4.0K Aug 7 11:58 .. drwxr-xr-x 2 root root 4.0K Aug 7 14:10 podaci -rw-r--r-- 1 root root 33K Aug 7 11:22 text1.txt -rw-r--r-- 1 root root 112K Aug 7 16:38 text2.txt -rw-r--r-- 1 root root 2.7K Aug 7 11:20 text.txt
1. Komprimirajmo naše datoteke : text.txt , text1.txt i text2.txt jednu po jednu :
bzip2 text.txt text1.txt text2.txt
Pogledajmo što se dogodilo :
ls -alh total 24K drwxr-xr-x 3 root root 4.0K Aug 8 14:49 . drwxr-xr-x 4 root root 4.0K Aug 7 11:58 .. drwxr-xr-x 2 root root 4.0K Aug 7 14:10 podaci -rw-r--r-- 1 root root 78 Aug 7 11:22 text1.txt.bz2 -rw-r--r-- 1 root root 86 Aug 7 16:38 text2.txt.bz2 -rw-r--r-- 1 root root 69 Aug 7 11:20 text.txt.bz2
Dakle izvorišne datoteke su prebrisane s novima - kao i kod gzip-a. Da bi to izbjegli trebali bi koristiti prekidać -k
2.Odkomprimirajmo ih sada sve zajedno:
bunzip2 *.bz2
3. Probajmo sada komprimirati datoteku text2.txt u datoteku text2.txt.bz2 korištenjem izlaza na standardni izlaz (stdout) (-c) i redirekcije (>) u komprimiranu datoteku:
bzip2 -c text2.txt> text2.txt.bz2
Sve ostale operacije i prekidaći su gotovo identični kombinaciji naredbi: gzip / gunzip..
Naredba bzcat poziva funkcionalnosti naredbe bunzip2a funkcionalno se ponaša kao naredba cat. Dakle bzcat u letu odkomprimira sadržaj komprimirane datoteke te se nakon toga ponaša kao cat . To možemo promatrati i kao pozivanje naredbe bzip2 -c koji sve šalje na standardni izlaz (stdout) te pozivanje naredbe cat nakon toga. Ovo ponašanje je identićno naredbi zcat .
Primjeri
1. Ispišimo sadržaj datoteke komprimirane sa bzip2 : text2.txt.bz2 :
bzcat text2.txt.gz 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 111111111111222222222222223333333333333344444444455555555555555 222222222222111111111111114444444444444433333333355555555555555 ... ... ...
2.Ponovimo prijašnju naredbu s time da želimo pomoću grep naredbe pronaći samo red koji sadrži : “2211”
bzcat text2.txt.bz2 | grep 2211 222222222222111111111111114444444444444433333333355555555555555
Program rsync se koristi za obavljanje operacija sigurnog kopiranja podataka odnosno datoteka i direktorija.
Možemo reći kako se rsync alat koristi za sinkronizaciju datoteka i direktorija s jednog mjesta na drugo, na učinkovit način. Backup tj. odredišna lokacija može biti na lokalnom poslužitelju ili na udaljenom poslužitelju.
Neki od prekidača/opcija naredbe rsync su :
-a arhive mode (= -rlptgoD) - ne uključuje -A , -H i -X-H sačuvaj “hard” linkove - ovo može biti vremenski zahtjevno jer ih se prvo u (pozadini) mora pronaći.-S prepoznaju se “sparse” datoteke i s njima se postupa a ispravan način.-x don't cross filesystem boundaries ( This tells rsync to avoid crossing a filesystem boundary when recursing)-e specificiraj udaljeni shell za upotrebu (pr. ssh)- -delete delete extraneous files from dest dirs ( This tells rsync to delete extraneous files from the receiving side (ones that aren’t on the sending side), but only for the directories that are being synchronized)- -rsync-path=PROGRAM specify the rsync to run on remote machine-h ispisuj sve u ljudima razmljivom formatu (kB, MB, GB)- -progress prikaži napredak tijekom izvršavanja -l kopiraj simboličke linkove kao simboličke linkove -p sačuvaj ovlasti (permissions)-A sačuvaj ACL liste (podrazumjeva -p)-X sačuvaj proširene atribute (extended attributes)-z komprimiraj podatke tijekom transfera - -compress-level=NUM eksplicitno definiraj razinu kompresije- -skip-compress=LIST preskoči datoteke s određenim sufiksom LISTa- -skip-compress=gz/jpg/mp[34]/7z/bz2-r kopiraj direktorije rekurzivno (sve poddirektorije)-u This forces rsync to skip any files which exist on the destination and have a modified time that is newer than the source file. (If an existing destination file has a modification time equal to the source file’s, it will be updated if the sizes are different.)-d Tell the sending side to include any directories that are encountered-v (verbose) ispis s više detalja
Na većini Linuxa ova naredba je već instalirana. U slučaju da nije instalirajmo ju:
yum install rsync
Koje su metode upotrebe rsync naredbe
rsync metode za kopiranje preko mrežeSSH protokola.
Primjeri upotrebe
1. Lokalno kopiranje/sinkronizacija.
1.1 Za potrebe sinkronizacije datoteka i direktorija unutar jednog računala odnosno kopiranje datoteka unutar jednog direktorija, rekurzivno, u neki drugi direktorij, možemo koristiti slijedeći primjer.
Recimo da unutar direktorija /root/test/ imamo neke podatke (datoteke) koje želimo na siguran i ispravan način prekopirati/sinkronizirati u direktorij /root/arhiva-1/
rsync -avh /root/test/ /root/arhiva-1/ sending incremental file list novi/ novi/test.txt sent 173 bytes received 38 bytes 422.00 bytes/sec total size is 22.25K speedup is 105.44
Sada su sve datoteke i direktoriji unutar /root/test/ prekopirani u /root/arhiva-1/ direktorij te su sačuvane sve njihove ovlasti jer smo koristili prekidač -a, koji prepoznaje i :
-p)-r) i sve direktorije (-d)-l) te -o i -g )kojoj pripadaju datoteke i -t)-D)
1.2 Za potrebe sinkronizacije datoteka i direktorija unutar jednog računala odnosno kopiranje datoteka unutar jednog direktorija, rekurzivno , u neki drugi direktorij, s time da želimo zadržati i:
-a te dodatno-X-A -H
Recimo da unutar direktorija /root/test/ imamo neke podatke (datoteke) koje želimo na siguran i ispravan način prekopirati/sinkronizirati u direktorij /root/arhiva-1/
rsync -avhXAH /root/test/ /root/arhiva-1/ sending incremental file list sent 138 bytes received 16 bytes 308.00 bytes/sec total size is 22.25K speedup is 144.47
1.3. Kopiranje/sinkronizacija samo jedne datoteke U slučaju da moramo sinkronizirati samo jednu datoteku u odredišni direktorij i pri tome sačuvati:
Izvorišna datoteka : /root/test/generator.sh odredišni direktorij /root/arhiva-1/
rsync -avh /root/test/generator.sh /root/arhiva-1/ sending incremental file list sent 37 bytes received 12 bytes 98.00 bytes/sec total size is 68 speedup is 1.39
1.4 “Sparse” kopiranje/sinkronizacija datoteka i direktorija unutar jednog računala odnosno kopiranje datoteka unutar jednog direktorija, rekurzivno u neki drugi direktorij, s dodatkom da imamo i posebne ”**sparse**“ datoteke, koje se moraju kopirati na poseban način.
Recimo na unutar direktorija /root/test/ imamo neke datoteke među kojima su u “sparse” datoteke koje želimo na siguran i ispravan način prekopirati/sinkronizirati u direktorij /root/arhiva-1/.
U ovom slučaju imamo jednu “sparse ” datoteku imena : sparse-file.
Zbog potrebe prepoznavanja i rada sa “sparse” datotekama, moramo koristiti prekidač -S (veliko slovo S) ili –sparse.
rsync -avhS /root/test/ /root/arhiva-1/ sparse-file sent 10.74G bytes received 35 bytes 161.48M bytes/sec total size is 10.74G speedup is 1.00
Ovaj proces će trajati kao da se kopira datoteka koja nije “sparse” dakle pune veličine ali će na odredištu završiti kao “sparse”. Naime naredba rsync mora proći kroz cijelu “sparse” datoteku, pošto ne zna koji njeni dijelovi su popunjeni “nulama” odnosno koji dijelovi su prazni a koji sadrže podatke, što traje.
Zbog ovakvog (neoptimiziranog) rada naredbe rsync, sa “sparse” datotekama, preporuča se rsync kombinirati s tar koji bi trebao odraditi sparse dio. Pogledajte primjere upotrebe tar naredbe u slučaju upotrebe sa sparse datotekama.
U svim primjerima do sada obratite pažnju na poruku, koja se pojavljuje nakon pokretanja naredbe rsync :
sending incremental file list. To znači kako se sve što se kopira/sinkronizira, radi inkrementalno, što znači kako se ne kopiraju/sinkroniziraju datoteke koje se nisu mijenjale. Inkrementalni rad prema tome znatno ubrzava proces kopiranja/sinkronizacije.
2. Kopiranje/sinkronizacija lokalnih podataka na udaljeno računalo
2.1 Za potrebe sinkronizacije datoteka i direktorija s jednog računala odnosno kopiranje datoteka s jednog direktorija, rekurzivno, na drugo računalo i to u neki direktorija na njemu, s time da želimo zadržati i:
-a te dodatno-X-A -H
Zbog kopiranja podataka preko mreže, dobro je uključiti i kompresiju podataka pri prijenosu - sa -z prekidačem.
S time da je naša IP adresa : 192.168.100.1 a adresa udaljenog računala - na koji radimo kopiranje/sinkronizaciju : 192.168.100.254.
Odredišni direktorij (na Backup/udaljenom poslužitelju : 192.168.100.254) je /BKP/.
rsync -avhXAHz /root/test/ root@192.168.100.254:/BKP/ root@192.168.100.254's password: sending incremental file list sent 135 bytes received 13 bytes 42.29 bytes/sec total size is 22.25K speedup is 150.32
Nakon što smo pokrenuli naredbu, rsync ona se spaja na udaljeno računalo (192.168.100.254) kao korisnik root.
Potom nas traži lozinku za root korisnika na tom računalu.
Zatim kreće sinkronizacija datoteke i direktorija s našeg računala - iz direktoija /root/test/ na udaljeno računalo u njegov direktorij /BKP/
Vezano za koprimiranje, u slučaju da na našoj izvorišnoj strani (odakle kopiramo), imamo i neke komprimirane datoteke ili datoteke koje nema potrebe/smisla komprimirati, tada ih možemo isključiti iz komprimiranja.
Recimo da ne želimo komprimirati datoteke sa slijedećim ekstenzijama:
.gz - to bi bile već komprimirane datoteke sa GZIP.jpg - slike koje su već komprimirane pa ih nema smisla ponovno komprimirati.mp3 ili .mp4 - audio ili video koji je isto već komprimiran.7z - ovo je 7 ZIP dakle isto ne želimo ponovno komprimirati jer je već komprimrano - nema efekta.bz2 - ovo je BZIP 2 kompresije - isto ne želimo ponovno raditi nepotrebno.To će onda izgledati ovako.
rsync -avhXAHz --skip-compress=gz/jpg/mp[34]/7z/bz2 /root/test/ root@192.168.100.254:/BKP/ root@192.168.100.254's password: sending incremental file list sent 135 bytes received 13 bytes 42.29 bytes/sec total size is 22.25K speedup is 150.32
U gore navedenom primjeru podaci se kopiraju na drugo - uddaljeno računalo nekriptirani. To u nekim slučajevima može biti sigurnosni problem.
2.2 Napravimo sve isto ali kroz kriptirani SSH tunel - prema drugom računalu - na koje kopiramo.
- Za ovo nam je potreban korisnički račun koji može koristiti SSH pristup.
Ponekad je SSH pristup korisniku root zabranjen pa je potrebno rekonfigurirati SSH servis/daemon kako bi se root korisniku omogućio SSH pristup.
Za upotrebu SSH spajanja moramo koristiti još i prekidač -e ssh.
Da pojednostavimo prikaz, izbaciti ćemo dio u kojemu se isključuju već komprimirane datoteke
rsync -avhXAHz -e ssh /root/test/ root@192.168.100.254:/BKP/ root@192.168.100.254's password: sending incremental file list sent 135 bytes received 13 bytes 42.29 bytes/sec total size is 22.25K speedup is 150.32
Procedura je ista - nakon upisane lozinke, kreće prijenos podatka.
Za one koji žele potpuni primjer kao i prethodni uz SSH, to bi bio ovako:
rsync -avhXAHz -e ssh --skip-compress=gz/jpg/mp[34]/7z/bz2 /root/test/ root@192.168.100.254:/BKP/ root@192.168.100.254's password: sending incremental file list sent 135 bytes received 13 bytes 59.20 bytes/sec total size is 22.25K speedup is 150.32
Kopiranje u svim slučajevim iz primjera 2.x je moguće i u drugom smjeru : udaljeno računalo → lokalno računalo.
2.3 Sada idemo u drugom smjeru - s našeg računala preko SSH tunela - prema drugom računalu - na koje kopiramo ali preko drugog TCP porta za SSH (ne standardnog TCP porta 22). Za ovo nam je potreban korisnički račun koji može koristiti SSH pristup i naravno razmijenjeni SSH ključevi između oba računala, jer ne želimo unositi lozinku za pristup ssh servisu na udaljenom poslužitelju, svaki puta kada pokrećemo ovu rsync naredbu.
rsync -avhXAHz --exclude 'data/cache' -e "ssh -p11222" /var/www/html/dokuwiki/ root@192.168.100.254:/BKP/www/dokuwiki/ receiving incremental file list sent 52.51K bytes received 83.75M bytes 1.12M bytes/sec total size is 1.82G speedup is 21.70
U ovom slučaju smo sinkronizirali (kopirali) naš lokalni direktorij /var/www/html/dokuwiki/ u kojemu se nalazi naša cijela wikipedija, na udaljeno računalo (192.168.100.254), preko ssh kanala, i to preko drugog SSH porta, tj. 11222 jer smo tako konfigurirali SSH servis na odredišnom poslužitelju (192.168.100.254), zbog sigurnosnih razloga.
Dodatno smo odlučili kako podirektorij s našeg poslužitelja - puna putanja : /var/www/html/dokuwiki/data/cache/ ne želimo sinkronizirati jer su u njemu privremeni podaci koje ne želimo stalno kopirati/sinkronizirati.
Vidljivo je kako smo ovdje naveli samo relativnu putanju do tog direktorija : data/cache jer rsync kreće od vršne putanje: /var/www/html/dokuwiki/. Za ovu namjenu smo koristili prekidač: –exclude.
Ostale prekidače (-avhXAHz) smo već prije objasnili.
3. Napredne mogućnosti
3.1 brisanje datoteka na odredištu ako su obrisane na izvoru.
Za ovu potrebu možemo koristiti prekidač –delete.
Osim toga dodati ćemo i mogućnosti kako bi se vidio napredak kopiranja - prekidač –progress - koji mora ićí u kombinaciji sa -h
Prije nego što smo pokrenuli sinkronizaciju, na izvoru (naše računalo), obrisali smo datoteku : file.out.txt.
rsync -avhXAHz --delete --progress /root/test/ root@192.168.100.254:/BKP/ root@192.168.100.254's password: sending incremental file list deleting file.out.txt sent 144 bytes received 13 bytes 44.86 bytes/sec total size is 22.25K speedup is 141.71
Vidim poruku da je datoteka: file.out.txt obrisana na odredištu tj. na poslužitelju: 192.168.100.254.
Mogući su još i deseci drugih opcija s kojima se možete poigrati i sami.
Za potrebe izrade sigurnosnih kopija (backup), najviše se koriste tračni uređaji i same trake kao medij za pohranu podataka.
Neke od slabo poznatih činjenica o trakama:
Specifikacija osnovnih karakteristika LTO traka:
| Atribut | LTO 1 | LTO 2 | LTO 3 | LTO 4 | LTO 5 | LTO 6 | LTO 7 | LTO 8 | LTO 9 | LTO 10 |
| Datum prve upotrebe | 2000.g. | 2003.g. | 2005.g. | 2007.g. | 2010.g. | 2012.g. | 2015.g | u pripremi | u pripremi | u pripremi |
| Nazivni Kapacitet (bez kompresije) | 100 GB | 200 GB | 400 GB | 800 GB | 1.5 TB | 2.5 TB | 6 TB | 12.8 TB | 26 TB | 48 TB |
| Brzina zapisivanja na traku [MB/s] | 20 | 40 | 80 | 120 | 140 | 160 | 300 | 472 | 708 | 1100 |
| Hardverska kompresija i omjer kompresije | ALDC 2:1 | ALDC 2:1 | ALDC 2:1 | ALDC 2:1 | ALDC 2:1 | LTO-DC 2.5 : 1 | 2.5 : 1 | Planirano 2.5 : 1 | Planirano 2.5 : 1 | Planirano 2.5 : 1 |
Osim navedenog spomenimo još nekoliko važnih stvari o tračnim uređajima i trakama :
Slika (1) pokazuje kako izgleda jedan (DDS4) tračni uređaj i same trake za pohranu podataka:
Za rad s tračnim uređajima i trakama koristi se naredba mt (magnetic tape controll)
Prekidači naredbe mt :
-f – file device (ime uređaja /dev/…)rewind – premotaj traku na početakretension – premotaj na kraj pa na početak (zbog izjednačavanja napetosti trake)status – ispiši statusreserve – rezerviraj – i nakon završetka snimanjarelease – oslobodi traku za drugi raderase – obriši cijelu trakuoffline – unload tape (izbaci traku)Primjeri
1.Premotaj traku (/dev/st0) na početak:
mt -f /dev/st0 rewind
2. Provjeri na kojem bloku se traka nalazi
mt -f /dev/st0 tell
3. Ispiši sve datoteke na traci
tar -tzf /dev/st0
4.Napravi restore direktorija www [na traci] ali prvo premotaj na početak
cd /root/restoredir/ mt -f /dev/st0 rewind tar -xzf /dev/st0 www
Da bi se upoznali s mrežama, prvo se moramo upoznati s mrežnim protokolima i modelima prema kojim su nastali i osnovnim standardima vezanim uz mreže.
U ovom poglavlju o mrežama, proći ćemo samo uvod u osnove mreža na Linuxu.
Mrežna topologija definira strukturu same mreže odnosno način međusobnog spajanja svih mrežnih komponenti ako pričamo o fizičkoj topologiji. Logička topologija daje nam uvid u logičke veze između svih mrežhih komponenti.
Prema fizičkoj topologiji razlikujemo sljedeće modele:
Sabirnica: (engl. Bus) koristi dijeljenu vezu. Svi su spojeni direktno na dijeljenu vezu. Prsten: (engl. Ring) spajaju se svi jedan na drugi (serijski) te zadnji sa prvimšto kreira zatvoreni prsten. Zvijeza: (engl. Star) svi se spajaju na jednu centralnu točku (ovako se spaja pomoću HUB-ova ili switcheva). Proširena zvijezda: (engl. Extended Star) više zvijezda se spaja u jednu točku (ovako se spaja pomoću HUB-ova ili switcheva). Hijerarhijska topologija (ili “Stablo” ) slična je proširenoj zvijezdi ali mora se sastojati od minimalno tri (3) sloja .Ukrižana Mreža: (engl. Mesh) koristi se da omogući što veću sigurnost od ispada bilo kojeg dijela mreže, ima više puteva do svake točkeSlika prikazuje navedene tipove mrežnih topologija:
Mreže u globalu dijelimo na LAN (Local Area Network) i WAN (Wide Area Network) mreže.
Naravno postoje i neki drugi specifični tipovi mreža (SAN, VPN, …) ali nisu nam za ovaj uvod u mreže bitni.
Važno je znati da LAN mreže u praksi rade na puno većim brzinama od WAN mreža. Iznimke su velike korporacije, banke i telekomi koji si mogu priuštiti i WAN mreže brzina koje su inaće u LAN mrežama.
Razlike u brzinama između prosječnog LAN-a i WAN-a koji se danas koriste, mogu biti: LAN: 100Mbps, 1000Mbps (1Gbps), 10000Mbps (10Gbps), … WAN: 1Mbps, 2Mbps, 4Mbps, 8Mbps, 10Mbps, …
Dakle 100 i više puta su veće prosječne brzine u LAN mrežama nego u WAN mrežama. Naravno u iznimnim slučajevima to se može i izjednačiti ali uz ekstremno visoke troškove.
U lokalnim mrežama za umrežavanje računala, koristimo mrežne kartice. Mrežna kartica, poznata je i pod engleskim nazivima LAN card ili Network interface controller (NIC). Ona se ugrađuje u računalo, kao zasebna kartica, preko PCI ili PCI Express sabirnice ili se već nalazi ugrađena na matičnu ploču računala, a što je u današnje vrijeme standard.
A mrežnih kartica imamo svakakvih :
Od običnih za klasična stolna ili prijenosna računala (poput ove na slici):
Mrežna kartica (slika) je u vlasništvu tvrtke Intel
Do posebnih kategorija mrežnih kartica koje možemo nazvati poslužiteljskim poput ove na slici dolje.
Mrežna kartica (slika) je u vlasništvu tvrtke Intel
Osim toga i poslužiteljske nisu sve iste, kao niti njihovi upravljački programi, pa i neke od njih možda nisu loše ali imaju dosta loše upravljačke programe. Neke odrađuju samo standardne stvari dok neke od snažnijih podržavaju cijeli niz dodatnih funkcionalnosti, kojima rasterećuju centralni procesor (CPU).
Neke od snažnijih poslužiteljskih, danas standardno same odrađuju neke od sljedećih funkcionalnostio ovome detaljnije nešto kasnije:
Dakle moderne mrežne kartice imaju napredne mogućnosti kojima rasterećuju CPU, odrađivanjem sve više zadataka bez njegovog posredovanja.
Ako gledamo na komunikaciju mrežne kartice s ostatkom računala, ona u slučajevima kada je potrebno ili nešto slati na mrežu ili primiti s mreže, može funkcionirati na dva načina (ovisno o mogućnostima same kartice i njenog upravljačkog programa):
Polling mehanizma, kod kojega CPU provjerava status mrežne kartice - kada provjerava da li je nešto zaprimilaInterrupt (IRQ) odnosno signala prekida, kada mrežna kartica za svaku i najmanju aktivnost (pr. svaki primljeni mrežni paket) generira signal prekida, s kojim javlja CPUu da prekine sa svojim aktivnostima i posveti pažnju mrežnoj kartici (ovdje se događa Tzv. context switching)
Pogledajmo ligičku shemu mrežne kartice.
Slika:
Gledano od dna sheme, vidljivo je kako je PHY dio zadužen za pretvaranje svega onoga što je došlo s mreže (električni signali ili svjetlosni impulsi), u mrežne okvire i obrnuto. On radi na OSI sloju 1. PHY funkcionalnost se često naziva i MDI (Media Dependent Interface) jer njegov rad ovisi o vrsti medija za koji je napravljen :
Sljedeća komponenta, u komunkaciji unutar mrežne kartice je MII chip, koji je zadužen za komunikaciju između, PHY i MAC dijela. Dakle MII, mora znati komunicirati s PHY, od kojega mora moći zatražiti postavljanje parametara rada ali i moći ih pročitati odnosno provjeriti trenutni status. Preko MII se odrađuje konfiguracija mrežnog sučelja (pr. brzina i duplex) kao i eventualne postavke auto negotiation protokola i njegovog rada te provjerava status istih parametara.
Iz razine operacijskog sustava, najniže što se spuštamo, kod korištenja i upotrebe mrežne kartice je upravo do razine MII chipa, što je i logično, jer nas niti ne treba zanimati kako će se točno kreirati i slati ili primati signali na mrežu. Tako u Linux operacijskom sustavu postoje programi
mii-tool, kao i ethtool, s kojima je moguće direktno pristupiti MII chipu, u svrhu promjene ili čitanja parametara rada mrežne kartice, poput brzine ili duplex načina rada. Naravno i druge softverske komponente mu mogu pristupiti. U drugim operacijskim sustavima, se to odrađuje i iz softvera na drugoj razini.
Nadalje se MII spaja na MAC chip, koji odrađuje sve što se i prema logici događa na OSI sloju 2, kojemu on i pripada. Dodatno MAC chip, često dodaje i SFD (Start frame delimiter) i IFG (Inter frame Gap) polja, koja po logici pripadaju OSI sloju 1. Dakle ovdje se radi s mrežnim okvirima i njegovim dijelovima: od provjere ispravnosti mrežnih okvira, preračunavanjem provjernog zbroja (FCS), kao i umetanjem preambule (SFD) i IFG polja.
Slijedeća je komponenta Network Layer, koja odrađuje sve što je potrebno na OSI sloju 3 (IP sloj prema TCP/IP protokolu). Sve ostale akcelerirane funkcije, na ovom sloju - ako ih kartica podržava, odrađuju se ovdje. Dalje sve ide na komponentu koja radi na OSI sloju 4, koja je zadužena za TCP ili UDP protokol, te također ako je nešto akcelerirano, odrađuje se ovdje.
Zatim sve ide prema vršnim komponentama, kojih može biti manje, pa se sve prepušta dalje, na softversku obradu ili više ,ako to odrađuju komponente mrežne kartice. Potom se sve šalje na sabirnicu (PCI ili PCI Express) te prema procesoru (CPU), na obradu.
I na kraju sve dolazi do aplikacija koje su krajnje točke u komunikaciji između računala, koja komuniciraju.
Vrlo često su sve gore navedene komponente integrirane u jedan jedini chip, barem na večini mrežnih kartica.
SFP i SFP+ moduli sadrže PHY chip, dok se kod klasičnih mrežnih kartica on nalazi na samoj kartici.
I u konačnici u čemu su sve razlike :
Sada nam postaje jasno kako uopće nije nevažno koju mrežnu karticu treba odabrati ako želimo siguran, pouzdan i brz rad računala ili poslužitelja na mreži. Isto vrijedi i kod odabira proizvođača, koji izrađuju preklopnike. Razlike u praksi znaju biti drastične. Ako govorimo o mrežnim karticama za računala, postoje razlike u cijeni od nekoliko desetaka ili stotina kuna a nekada i tisuća KN, te razlike u stabilnosti odnosno nestabilnosti te do brzine rada. Vrlo se često događa, kako ste kupili sve mrežne komponente, kao i pasivni dio mreže (kablovi, utičnice, patch paneli ), koje prema standardima podržavaju brzinu deklariranu kao 1Gbps ali u praksi vam je brzina nešto malo veća od 100Mbps.
Vratimo se na osnove
Mrežne kartice obično na sebi imaju utičnicu koja se označava kao 8P8C a koju nazivamo i RJ-45 ali osim ovog standardnog konektora, izrađuju se i mrežne kartice s modularnim konektorima, poput SFP i SFP+, poput kartice tvrtke Qlogic, na slici dolje. Naime SFP i SFP+ su utičnice u koje se mogu ubaciti razni moduli (raznih brzina) i tipova vanjskih utičnica.
SFP i SFP+ moduli se nazivaju transceiverima odnosno primopredajnicima jer se u njima nalazi sve potrebno za pretvaranje signala između mrežne kartice i vanjskog utora SFP/SFP+ modula.
Dakle SFP i SFP+ transceiveri odnosno primopredajnici s vanjske strane imaju konektor s kojim ga spajamo na mrežu, a on može biti:
Ali osim samog konektora, pogotovo za konektore za optička vlakna, ovdje je stvar odabira, za kakvu mudulaciju i snagu signala te za koju vrstu optičkog vlakna je namijenjen konkretni primopredajnik.
Dodatno, pitanje odabira SFP/SFP+ primopredajnika je i za vrstu optičkog vlakna:
Single mode optičko vlakno odnosno njegova jezgra, je vrlo tanko, obično 9um, dok je obloga jezgre obično debljine 125 um. Kroz ovaj tip optičkog vlakna mogu prolaziti svjetlosni impulsi jednog modaliteta (usmjerenosti) , pod malim ulaznim kutom, stoga ne dolazi do refleksije ili odstupanja od osi vlakna, te svjetlisni impulsi koji su nosioci signala (podataka), vrlo malo degradiraju. Zbog ovih karakteristika, ovakvo vlakno i pripadajući optički primopredajnici, koriste se za vrlo velike udaljenosti, čak i više stotina kilometara. Problem je vrlo velika cijena optičkog vlakna, opreme za “varenje” spojeva i konektora te primopredajnika.
Multi mode optička vlakna, znatno su deblja, jezgra je obično 50um ili 62.5um, gdje je obloga jezgre također debljine 125 um. Zbog toga se kroz nju istovremeno može slati više optičkih impulsa, s više valnih duljina i različitih modaliteta (usmjerenosti), ali uz puno refleksija i samim time slabljenja signala. Ove karakteristike omugućavaju veće brzine, jer se istovremeno može slati više signala (podataka), ali na manje udaljenosti, i to obično do nekoliko stotina metara ili maksimalno par kilometara.
Vratimo se na SFP/SFP+
SFP moduli su obično za brzine do 1000 Mbps (1Gbps) a SFP+ moduli su za brzine do 10.000 Mbps (10 Gbps) i više.
Pogledajmo i dva SFP i SFP+ modula: Slika prikazuje optički SFP+ modul (sa LC optičkim konektorom) tvrtke HP (model J9150A) :
Donja slika prikazuje Cisco 1000Base-T (1Gbps sa RJ-45):
U svakom slučaju, koristili mrežne kartice s RJ-45 ili SFP/SFP+ modulima, brzine koje su danas u upotrebi su :
Kod brzina mreža potrebno je razlikovati bandwidth od throughput-a.
Bandwidth se definira kao količina informacija koje mogu prolaziti određenim mrežnim medijem. Mrežni mediji mogu biti žičani kabeli (koaksijalni [RG*], parični [F/S/U/TP] ), optički kabeli [single/multi mode] ili eter (zrak, vakuum)…
Za svaki medij postoje ograničenja bandwidth-a. Uvijek postoje razlike između bandwidtha i throughputa, i to zbog raznih gubitaka, što u samom mediju (dolazi do slabljenja ili miješanja signala, … ) a što zbog dodataka na “korisne” podatke, koje dodaju određeni mrežni protokoli.
Jedinica za bandwidth je bps (bits per second) [bitova u sekundi]:
| Jedinica | Oznaka | Vrijednost |
| Bitova u sekundi | bps | 1bps = Osnovna jedinica |
| Kilobita u sekundi | kbps | 1kbps=1 000 bps |
| Megabita u sekundi | Mbps | 1Mbps=1 000 000 bps |
| Gigabita u sekundi | Gbps | 1Gbps=1 000 000 000 |
| Terabita u sekundi | Tbps | 1Tbps=1 000 000 000 000 |
Throughput odnosno propusnost označava uspješno prenesenu količinu informacija u jedinici vremena. Radi se o tome kako u prijenosu podatak kroz mrežu dolazi do gubitaka i usporavanja, uvjetovanih mrežnom opremom ili kvalitetom veza.
Jedinica za propusnost je također bps (bitova u sekundi) ali se češće koristi Bps (bytea u sekundi) - uočite kako je slovo B veliko.
Maksimalnu teoretsku propusnost mreže izraženu u Bps, možemo izračunati: tako da maksimalnu teoretsku propusnost podijelimo s 8, jer bitove u sekundi želimo pretvoriti u byte u sekudi (zbog lakšeg razumjevanja).
Za Ethernet mreže možemo općenito koristiti slijedeću tablicu:
| Bandwidth | Maksimalna teoretska propusnost |
| 1 Mbps | 128 kBps |
| 10 Mbps | 1.28 MBps |
| 100 Mbps | 12.8 MBps |
| 1 000 Mbps (1Gbps) | 128 MBps |
| 10 000 Mbps (10 Gbps) | 1280 MBps |
Postoji i još jedan pojam a to je stvarna odnosno efektivna propusnost mreže, koja varira ovisno o mnogim čimbenicima:
Klasični primjer može biti naša lokalna mreža. Zamislimo lokalnu (LAN) mrežu u kojoj imamo računala s običnim mrežnim karticama, koje imaju propusnost od 1Gbps te mrežni preklopnik koji također na svim portovima ima propusnost od 1Gbps. U teoriji bi komunikacija između dva računala na ovoj mreži, spojena preko preklopnika, imala također propusnost od 1Gbps. Dakle maksimalnu teoretsku brzinu prijenosa podataka od 128 MB/s. Kod običnih preklopnika, koji su deklarirani kao Gbps, to u praksi uopće nije tako. Ako smo odabrali prosječan preklopnik i ako računala koja komuniciraju preko njega uopće mogu podnijeti te brzine, dobiti ćemo prosječnu efektivnu propusnost od 200Mbps do 500Mbps (od 25MB/s do 63 MB/s) ali se nećemo niti približiti punoj propusnosti gigabitne veze.
Često se pojam brzine brka s propusnošću mreže. Tako primjerice 1Gbps ne označava brzinu već propusnost.
Dodatno postoji i još jedan mali detalj, ako sve promatramo s razine aplikacije, recimo našeg programa preko kojega primjerice kopiramo podatke s jednog na drugo računalo, a to je efikasnost mrežnih protokola.
Ako govorimo o TCP/IP protokolu, svaki sloj mrežnog protokola dodaje i svoje podatke, odnosno zaglavlja.
Duplex je uz čistu brzinu mreže (10Mbps/100Mbps/1000Mbps/…) drugi bitan parametar vezan uz samu brzinu (ovo možda zvuči malo čudno). O čemu se radi ?.
U starim mrežama (10 Mbps i 100 Mbps) koje su dijelile jedan medij (iz vremena korištenja HUB-ova), u svakom trenutku je bilo moguće ili primati ili slati podatke preko mreže (sjetimo se da je to jedan djeljeni medij [kabel]). Zbog problema ako je netko u takvoj mreži pokušao slati podatke istovremeno s nekim drugim je i uveden CSMA/CD protokol (pogledajte CSMA/CD poglavlje) koji je to riješio tako da je pojednostavljeno natjerao sve koji su spojeni na mrežu da u jednom djeliću sekunde samo jedan može slati podatke a ostali samo slušati.
Ovakav način komunikacija nazivamo Half Duplex.
Bitno je razumjeti da je Half Duplex način komunikacije u samo jednom smjeru : ili se šalje ili se prima podatke, nikako istovremeno.
Razvojem mreža i prelaskom s HUB-ova na Switcheve više nije bilo potrebe za Half Duplex komunikacijom (iako neki uređaji i danas traže takav način komunikacije). Dakle upotrebom switcheva komunikacija više ne teće kroz jedan dijeljeni medij između svih koji su spojeni na mrežu već je praktično svaka veza između računala (ili nekog drugo uređaja na mreži) i switcha jedini dijeljeni medij pa je prema tome moguće istovremeno i primati i slati podatke. Naime prva komponenta između vas i susjednog računala je upravo switch, prema kojemu svako računalo može imati dvosmjernu komunikaciju i na fizičkom nivou (Layer 1).Pošto switchevi rade na sloju 2 (Layer 2), mrežne paketa obrađuje switch i preklapa ih iz jednog računala, preko sebe do drugog računala i obrnuto, za svaki paket posebno tako da je obostrana komunikacija zadržana. Ovu mogućnost dvostrane komunikacije (i primanje i slanje paketa mrežom u isto vrijeme) nazivamo Full Duplex.
Postoji još jedna zanimljivost Full Duplex načina rada a to je kumulativna brzina mreže.Ako recimo naša brzina mreže iznosi 1 000 Mbps (1 Gbps) to znači da tom brzinom možemo istovremeno i primati i slati podatke što opet znaći da maksimalna brzina onda iznosi 2 000 Mbps (1 Gbps), što neki proizvođaći i iznose u karaktaeristikama mrežnih uređaja ili komponenti :
| “Standardna” Brzina | Full Duplex Brzina |
| 10 Mbps | 20 Mbps |
| 100 Mbps | 200 Mbps |
| 1000 Mbps | 2000 Mbps |
| 10 000 Mbps | 20 000 Mbps |
“Ethernet” standard i njegove podvarijante možete vidjeti na : IEEE 802.3
Kako su Ethernet mreže rasle s brzinom od 10 Mbps prema 100 Mbps i 1000 Mbps (1Gbps) ili dalje sa 10 000 Mbps (10 Gbps) morala je postojati mogućnost korištenja smanjenja brzina odnosno kompatibilnosti unatrag. Dakle kako bi se sa 1 000 Mbps (1 Gbps) mrežnom karticom spojili na mrežu koja radi recimo na 100 Mbps.
Osim fizičke kompatibilnosti unazad te ručnog konfiguriranja brzine i Duplex moda, uveden je mrežni protokol imena : Auto Negotiation, koji omogućava da dvije strane mreže (pr. Računalo ←→ Switch) dogovore :
Half do Full
Svaka strana šalje drugoj strani koje sve modove rada podržava.
Nakon toga, svaka strana za sebe pronalazi najkompatibilniji mod rada i postavlja svoj interface u taj mod (pr. Strana A: 100Mbps Full Duplex). Druga strana također postavlja svoj interface u nakompatibilnij mod rada (pr. Strana B: također 100Mbps Full Duplex ). Dakle i brzina i duplex način rada se uvijek podešavaju od najveće brzine prema najmanjoj brzini i isto tako od Full Duplex do Half Duplex prema parametrima primljenim od druge strane prem principu najvećeg zajedničkog nazivnika.
Problem je u tome što nakon ovog procesa obije strane ne provjeravaju za koji mod se koja strana odlučila.
Naime razni proizvođaći mrežne opreme: od mrežnih kartica, preko switcheva, routera i drugih mrežnih komponenti često se ne drže standarda ili ih ne implementiraju na najbolji način te se događa da se dvije strane koje dogovaraju brzinu i duplex, krivo dogovore te tada počinju problemi i usporavanja u mreži.
Preporuka je kako se Auto Negotiation ne koristi za međusobno spajanje Switcheva, Routera, Poslužitelja ili druge mrežne opreme.
Primjeri
Najčešći vidljivi problem kod krivo dogovorene brzine je veliko gubljenje paketa u oba smijera (Upload/Download) unutar LAN mreže.
Najčešći vidljivi problem krivo dogovorenog duplex moda je velika nesimetrija tj.razlika u brzinama ovisno o smjeru podataka (Upload/Download) unutar LAN mreže.
Zbog čega ponavljam “unutar LAN mreže”, zbog toga jer ovo nije mjerilo kod danas najčešće WAN tahnologije za “Izlaz na internet” tj. ADSL-a, koji je i kako ime kaže (Asymmetric Digital Subscriber Line) - Asimetričan, dakle projektiran da u jednom smjeru ima veliku brzinu (Download) a u drugom vrlo malu (Upload).
CSMA/CD i Kolizijska domena (Carrier Sense Multiple Access With Collision Detection).
Prije vremena switcheva, koristili su se uređaji zvani HUB-ovi.
Računala i druga mrežna oprema se na njih spajala na isti način kao na switcheve (prema topologiji : zvijezda [star]) – sva računala i oprema, svaki na svoj port na HUB-u.
Na HUB-ovima se dijelila zajednička veza jer je on praktično bio samo pojačalo električnog signala.
Veza je prema tome bila Half Duplex (samo primanje ili slanje na mrežu u jednom trenutku).
U praksi se stalno dešavalo da su dva ili više računala u jednom djeliću vremena krenula u slanje podataka. Tu je uskakao CSMA/CD koji je tada detektirao ovaj slučaj koji se zove kolizija dakle “Collision Detection” mehanizam, koji radi tako da tada svaki od pošiljatelja mora sačekati određeni nasumični broj od nekoliko milisekundi te probati slati podatke ponovno i tako iz početka, svaki puta kada se detektira kolizija tj. istovremeno slanje podataka na mrežu od strane 2 ili više računala.
Upotrebom switcheva više nema kolizije ako se koristi Full Duplex mod rada portova (interface-a). Samim time i kolizijska domena više ne postoji odnosno u najgorem slučaju je moguća na nivou jednog porta na switchu i to samo ako je on konfiguriran u Half Duplex modu rada.
Važno je znati da je zbog kompatibilnosti unatrag i dalje ostao Half Duplex mod rada svakog porta na koji treba paziti.Problem se može pojaviti jer se svaki port na switchu i krajnje računalo ili mrežna oprema mogu krivo “dogovoriti” te uspostaviti Half Duplex umjesto Full Duplex moda - u slučaju upotrebe Auto Negotiation protokola.
Full duplex je mod rada u kojemu je moguće istovremeno slanje i primanje podataka i to samo ako je tako konfigurirano na strani switcha i druge strane (računalo, drugi switch, poslužitelj , ….). Dakle obije strane moraju biti jednako konfigurirane !.
Različiti mrežni protokoli koriste različite metode odnosno načine komunikacije.
Najčešće razlikujemo tri osnovne metode komunikacije:
Unicast se koristi za komunikaciju “Host-to-host” tj. s jednog računala direktno na drugo. Koristi se kada dvije krajnje strane u komunikaciji (recimo računalo ← → računalo) trebaju komunicirati samo među sobom bez potrebe da se u komunikacijski kanal između njih uključuje i netko treći.
Pr. MAC adrese mrežnih kartica su unikatne, kao i IP adrese računala te u komunikaciji s protokolima koji komuniciraju između dvije MAC adrese ili između dvije IP adrese, kažemo da je konunikacija unicast tip komunikacije.
Dakle ovo bi bio sljedeći oblik komunikacije:
IP 1 (Računalo 1) ← → IP 2 (Računalo 2)
Pr. Sljedeća komunikacija je unicast komunikacija :
IP : 192.168.100.10 ← → 192.168.100.20
ili
IP : 192.168.100.10 ← → 10.14.5.20
Boradcast način komunikacije koristi se kada se određeni mrežni paket želi poslati na sva računala na mreži. Prema logici rada ovo je suprotnost u odnosu na unicast.
Zamislimo IP komunikaciju u mreži : 192.168.100.0 / 255.255.255.0.
Znamo da je IP adresa 192.168.100.255 Broadcast IP adresa. Ako neko računalo iz postojeće mreže (bilo koja IP adresa od 192.168.100.1 do 192.168.100.254) pošalje neki paket na adresu 192.168.100.255 (Broadcast IP) taj paket će primiti SVI na toj mreži.
Dakle Broadcast je način komunikacije u kojem jedan šalje na sve : Jedan → SVI
Broadcast način komunikacije je potreban za samo neke protokole ali za sve ostale nepotrebno zagušuje cijelu mrežu.
Multicast komunikacija je komunikacija prema principu :
Jedan → Više njih odnosno grupa
ili
Više njih odnosno grupa → Više njih odnosno grupa
Multicast IP adrese su jedinstvene IP adrese koje prosljeđuju paket sa multicast odredišnom adresom na preddefiniranu grupu IP adresa. Tako da svako pojedino računalo koje šalje na multicast adresu može slati niz podataka na višestruke primaoce. Multicast je baziran na konceptu grupa. Svaki korisnik (Host računalo) može odabrati neku Multicast grupu, te će primati sadržaj namijenjen za tu grupu. U D klasi IP adresa (koje se koriste za Multicast ).
Podsjetimo se : Multicast adrese su adrese unutar sljedećeg opsega:
IPv4
| Početna multicast IP adresa | Zadnja multicast IP adresa |
| 224.0.0.0 | 239.255.255.255 |
IPv6
| Početna multicast IP adresa | Zadnja multicast IP adresa |
| FF00:0000:0000:0000:0000:0000:0000:0000 | FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF |
Postoji niz multicast adresa koje su rezervirane za lokalnu upotrebu i koje su rezervirane za točno određenu namjenu. Kraća lista rezerviranih multicast adresa izgleda ovako:
| Multicast adresa | Namjena |
| 224.0.0.0 | Rezervirano |
| 224.0.0.1 | Svi hostovi unutar mrežnog segmenta |
| 224.0.0.2 | Svi Routeri unutar mrežnog segmenta |
| 224.0.0.4 | Svi Routeri koji koriste Distance Vector Multicast Routing Protocol (DVMRP) unutar mrežnog segmenta |
| 224.0.0.5 | OSPF protokol za slanje “HELLO” paketa unutar mrežnog segmenta |
| 224.0.0.9 | RIP v.2 za slanje Routing informacija svim RIP v.2 Routerima |
| 224.0.0.18 | Virtual Router Redundancy Protocol (VRRP) komunikacija |
| *.*.*.* | … |
| 224.0.2.0 | Odavde počinju upotrebljive multicast IP adrese koje nisu rezervirane |
Multicast komunikacija može raditi na dva načina:
U ovom slučaju mrežni uređaji kreiraju multicast grupe (da ne bude zabune to su multicast IP adrese) a svi koji žele biti članovi određene multicast grupe (IP adrese) moraju se prijaviti mrežnom uređaju da ih uključi u tu grupu. Kada netko šalje paket na tu grupu tada mrežni uređaj u pozadini taj isti paket proslijeđuje na sve koji su se pretplatili da budu članovi te grupe.
OSI model (Open Systems Interconnection model) je konceptualni slojeviti model mrežne komunikacije, koji opisuje funkcije i međusobnu komunikaciju između njegovih slojeva.Održava se od strane ISO organizacije (International Organization for Standardization), pod oznakom : ISO/IEC 7498-1.
Na osnovi OSI modela, razvijen je TCP/IP model mrežne komunikacije.
Naziv TCP/IP potjeće od Transmission Control Protocol (TCP) i Internet Protocol (IP) kao prva dva protokola koja su bila razvijena u setu TCP/IP protokola. Današnji TCP/IP set protokola sadrži cijeli niz raznih protokola (zbog toga govorimo o setu ili grupi protokola naziva TCP/IP). Ovaj set protokola često se naziva i DoD model zbog toga što je inicijalno razvijan od strane DARPA agencije (Defense Advanced Research Projects Agency) unutar Ministarstva obrane Sjedinjenih Američkih Država (Department of Defense), krajem 1960. i početkom 1970. godine. Tijekom narednih godina razvijale su se nove verzije : TCP v1, TCP v2, TCP v3 i IP v3, te TCP/IP v4 koji se koristi i danas (uz IP v6.).
TCP/IP je skup protokola nužan za komunikaciju računala. Današnji internet je baziran na TCP/IP setu/grupi protokola. On se sastoji od nekoliko dijelova odnosno slojeva od kojih svaki odrađuje određenu funkcionalnost te predaje na obradu sljedećem sloju.
Na slici je vidljiva usporedba OSI i TCP/IP modela te može poslužiti kao primjer komunikacije TCP/IP protokola.
Prema slici će se najbolje shvatiti što se događa kod komunikacije dva računala TCP/IP-om:
Upoznajmo se (okvirno) s komunikacijom prema OSI odnosno TCP/IP modelu komunikacije.
Kod komunikacije između dva računala: Source [izvor] → Destination [odredište], dolazi do sljedećeg :
1.Aplikacija (pr. Web browser se spaja na Web poslužitelj ) formira podatke koje želi slati na drugo računalo (Layer 4, tj po OSI-ju 7,6 i 5 ). i prosljeđuje ju nižem sloju (Layeru)
2.Transportni sloj (TCP) preuzima podatke od gornjeg sloja i dodaje svoj dio (u ovom slučaju Source i Destination portove, CRC check [provjeru integriteta podataka], … ) i prosljeđuje ju nižem sloju,
3.Internet sloj (IP) preuzima podatke od gornjeg sloja i dodaje svoj dio (Source i Destination IP adrese,..) i prosljeđuje ju nižem sloju
4.Network Access sloj preuzima podatke od gornjeg sloja i dodaje svoj dio (MAC adrese, …) te šalje podatke samoj mrežnoj kartici, koja ih pretvara u električne (ili optičke) signale i šalje ih na medij.
Važno je znati da mrežnim medijem prolaze paketi podataka, dogovorene maksimalne veličine. Ako je na početku procesa enkapsulacije (ugnježđivanja) podataka utvrđeno da treba poslati više podataka nego što je maksimalna veličina paketa (pr.~1500 byte = 1.5kB), dolazi do kreiranja više paketa (fragmentacija),od kojih svaki sadrži serijski broj, da bi se ispravno posložili na drugoj strani te sastavili u izvorni oblik.
S druge strane (na drugom računalu, proces je obrnut):
Mrežna kartica prima električne impulse, pretvara ih u slijed digitalnih podataka (0 i 1) , koje preuzima prvi sloj, obrađuje ih, prosljeđuje drugom sloju,… i tako redom sve do aplikacijskog sloja koji to sve slaže u prvobitni oblik podataka, koji je poslan s prvog računala (Source). Dakle sve se vraća u suprotnmo smjeru (od točke 4. prema točki 1.).
TCP/IP protokol dopušta maksimalno 65535 portova [216] (16 bitni broj). Za svaki TCP/IP protokol je definiran i port preko kojega se koristi. Pomoću portova, svako računalo može (u svakom trenutku) paralelno komunicirati s više protokola, jer svaki od njih koristi drugačiji port. Neki od osnovnih portova odnosno protokola koji ih koriste, nabrojani su u tablici.
| Broj porta | Naziv | Opis |
| … | ||
| 20 | FTP Data | File Transfer Protocol za podatke |
| 21 | FTP | File Transfer Protocol za kontrolu |
| 22 | SSH, SFTP i SCP | Secure Shell : udaljeni pristup shell-u i Secure File Transfer Protocol te Secure Copy Protocol |
| 23 | TELNET | Telnet udaljeni pristup |
| 25 | SMTP | Simple Mail Transport Protocol |
| 53 | DNS | Domain Naime Server protokol |
| 67 | BOOTP/DHCP | BOOTP i DHCP Protokoli |
| 69 | TFTP | Trivial FTP Protokol |
| 80 | HTTP | Hyper Text Transfer Protocol |
| 123 | NTP | Network Time Protocol |
| … | ||
Ako vas zanima malo veći popis poznatijih portova pogledajte na Wikipedia članak
Kao što smo spomenuli u transportnom sloju (TCP/IP model sloj [Layer] 3) se osim drugih stvari dodaju i portovi i to Source port (izvorni) i Destination port (odredišni), koji definiraju (nad)protokol kojim će se odvijati komunikacija. (Ovo će vam biti jasnije nakon sljedećih poglavlja). Osim portova bitno je i kojim točno transportnim protokolom se koristi niži protokol. Od transportnih protokola unutar TCP/IP seta nalaze se TCP i UDP protokoli. Oni su zaduženi za prijenos paketa preko mreže.
Transportni protokoli, zaduženi su za prijenos podataka preko mreže, prema TCP/IP protokolu. Postoje ih dvije vrste :
TCP je tkzv. connection-oriented transportni protokol, protokol koji se brine za stanje veze, kao i za integritet podataka. To znači kako se kod komunikacije dva računala, otvara konekcija pomoću tkzv. metode Three-way handshake i TCP protokol se brine da je svaki segment podataka koji je poslan sa računala A na računalo B primljen u ispravnom (nepromijenjenom) obliku te pravilnim redosljedom. Za svaki paket koji je s druge strane zaprimljen neispravan, zatraži se retransmisija i paket se šalje ponovno, sve dok nije potpuno ispravan. Kako bi se uopće mogla provjeriti ispravnost (integritet) podataka (RFC 793), unutar svakog paketa, u TCP zaglavlju postoji polje za koje se izračunava i upisuje provjerni broj. Dakle ako unutar TCP zaglavlja dođe do grešaka u prijenosu, to će biti detektirano.
Kod zatvaranja veze koristi se metoda dogovaranja oko zatvaranja, slična kao i kod otvaranja konekcije.
U prijenosu podataka kroz medij (kabel, optičko vlakno, zrak/vakuum) može doći i dolazi, do gubitka djela podataka.
Kako se uspostavlja TCP veza:
TCP veza se uspostavlja putem tkzv “Three-way handshake” tj. uspostave veze u tri koraka.
1. Računalo (A) koje uspostavlja vezu šalje SYN poruku (on je klijent) na drugo računalo (drugo računalo je server) (B). Također klijent postavlja sequence number na slučajnu vrijednost, koja se koristi dalje.
Pr.(HEX):
SEQ= F5 72 B7 12
⇒ sequence number je redni broj svakog paketa koji se šalje, da bi se kasnije na drugoj strani koja ih prima mogli poredati po redosljedu kojim su poslani te obraditi (opisano u poglavlju “Enkapsulacija”).
2.Računalo (B) (server strana) šalje SYN-ACK poruku te postavlja acknowledgment number za jedan broj veći od sequence number broja iz prvog koraka. Računalo B (server strana) postavlja za sequence number ovog paketa isto slučajan broj.
Pr.:
SEQ= D8 7F C4 A3
ACK= F5 72 B7 13
3.Računalo (A) (klijent strana), šalje ACK poruku nazad na računalo B (server strana). Računalo A postavlja sequence number kao primljeni acknowledgement number a acknowledgement number povećava za 1 u odnosu na primljeni sequence number . Inaće se u daljoj komunikaciji uvijek sa acknowledgement number potvrđuje sequence number i uvećava za 1.
Pr.:
SEQ= F5 72 B7 13
ACK= D8 7F C4 A4
Napomena: Ako gledamo mrežni promet korištenjem programa “Wireshark”, TCP ACK i SEQ brojevi koji se standardno prikazuju su tkzv. Relativni tj. Wireshark ih prikazuje na nama razumljiviji način (počevši od '0'). Stvarni ACK i SEQ brojevi su 32-bitni brojevi, vidljivi u heksadecimalnom dijelu (dolje).
Nakon ovog procesa TCP veza između računala A i B je uspostavljena.
Nakon uspostavljene TCP veze, kreće promet preko nje. Prvi paket nastavlja s označavanjem SEQ i ACK brojeva, s time kako se oni više ne povećavaju za 1, već za veličinu tkzv. Payloada tj. veličinu koliko se podataka prenosi. Dakle ACK na drugoj strani standardno potvrđuje primljeni SEQ broj te kreira novi, koji je uvećan za taj Payload odnosno veličinu prenesenih podataka.
Kako se zatvara TCP veza:
TCP veza se zatvara putem tkzv “four-way handshake” tj. uspostave veze u četiri koraka,ali moguće su varijante i u tri koraka ili dva koraka.
Objasniti ćemo standardno zatvaranje u četiri koraka:
1. Kada jedna strana želi zatvoriti (svoju stranu) veze (Računalo A) ona prvo šalje FIN poruku (nećemo ulaziti ponovno u detalje oko sequence number i acknowledgment number jer je sistem isti kao kod otvaranja veze i kao kod bilo koje druge TCP komunikacije).
2. Druga strana (Računalo B) odgovara slanjem poruke ACK. Nakon toga Računalo A čeka da TCP Timeout istekne te zatvara svoju stranu veze. S ovom porukom je zatvoren jedan dio veze : Računalo A → Računalo B.
Od trenutka kada je primljena poruka ACK za zatvaranje veze , TCP port koji je otvoren za tu vezu, još je otvoren, sve dok ne istekne TCP timeout, kada se sve zatvara
3. Sada druga strana (Računalo B) također šalje FIN paket prema drugoj strani (na Računalo A)
4. Druga strana (Računalo A) potvrđuje prekid veze slanjem poruke ACK , koju kada Računalo B primi također čeka na TCP timeout te potom zatvara vezu (isto kao točka 2.). Ovim korakom je zatvorena i strana veze : Računalo B → Računalo A i samim time cijela TCP veza.
Metoda zatvaranja veze u 3 koraka (Three-way handshake)
Ovo je najčešća metoda zatvaranja TCP veze.
1. Računalo A šalje poruku FIN
2. Računalo B odgovara sa porukom FIN ACK
3. Računalo A odgovara sa porukom ACK
Nakon ovog koraka obije strane čekaju da TCP tiemeout istekne te zatvaraju cijelu TCP vezu.
Metoda zatvaranja veze u 2 koraka (Two-way handshake)
Ako oba računala istovremeno pošalju poruku FIN i također nakon toga potvrde drugoj strani istovremeno sa zatvaranjem - porukom ACK.
TCP konekcija može biti i napola otvorena !
Moramo biti svjesni činjenice da je uspostavljena TCP veza uspostavljena zapravo s dvije strane, što se može promatrati kao dvije jednosmjerne veze:
Stoga, moguće je da TCP veza ostane napola otvorena tj. “half-open”,što se dešava kada jedna strana regularno zatvori vezu a druga ne. Tada, strana koja je zatvorila vezu ne može slati podatke na drugu stranu ali druga strana može slati prema njoj, sva dok druga strana ne zatvori svoju stranu veze.
UDP (User Datagram Protocol) transportni protokol koristi jednostavan ali vrlo brzi sustav za prijenos podataka bez provjere o uspješnom primanju ili integritetu podataka poslanih unutar mrežnih paketa. S druge strane on (UDP) prepušta sve provjere na stranu same aplikacije koja šalje ili prima podatke. Dakle UDP je nepouzdan ali vrlo brz. Želite li pouzdanost a morate ili želite koristiti UDP, sve zaštitne mehanizme morate ugraditi u vašu aplikaciju. Ako ipak želite smo brzinu onda je UDP pravi izbor.
UDP se često koristi kada imamo komunikaciju koja je vremenski osjetljiva a nije nam previše bitno da li će se koji paket usput izgubiti u prijenosu. Primjer ovakve upotrebe je Audio ili Video komunikacija, gdje nam nije bitno ako se izgubi koji dio slike na trenutak ili djelić glasa ali nam je bitno da nema vremenskog kašnjenja. Osim ove primjene, koristi se i kod drugih tipova komunikacije kao što su razni protokoli za logiranje određenih poruka (spremanje sistemskih poruka sa raznih uređaja na centralnu lokaciju), kada nam nije najbitnije ako se jedna mala poruka izgubi i sl. Još jedan primjer su DNS (Domain Name Service) protokol ili NTP (Network Time Protocol) protokol, koji ako ne dobiju odgovor u nekom vremenu, poruku će poslati ponovno. Koriste ih i DHCP (Dynamic Host Configuration Protocol), TFTP (Trivial FTP) i mnogi drugi protokoli.
Pogledajmo detaljnije što se dešava kod TCP/IP komunikacije.
Slika prikazuje enkapsulaciju (ugnježđivanje) prema TCP/IP, sa odredišnog (Source) računala. Ovdje će vam biti malo jasniji tok podataka i veza između TCP/IP slojeva.
Zamislimo sljedeći (pojednostavljen) primjer: Naš program (aplikacija), pr. naš Web preglednik se želi spojiti na neku stranicu na koju upisujemo neke podatke (pr. korisničko ime i lozinku).
Sada naš TCP/IP prokol uskače u pomoć.
Aplikacijski sloj uzima podatke iz same aplikacije (u našem slučaju naše korisničko ime i lozinku) te ih razdvaja na manje dijelove (ako je potrebno), koji stanu u mrežni paket, u formatu koji je razumljiv višem sloju tj. aplikaciji. Ti naši podaci (ovdje su naše korisničko ime i lozinka koje smo upisali) su na slici prikazani kao [DATA] .
Transportni sloj - transportni sloj (3) preuzima paket podataka od aplikacijskog sloja te dodaje svoj dio [Transport Header] – ovdje se dodaju i Source i Destination portovi i paketi označavaju rednim brojevima te se dodaju i ostale stvari : ovisno da li se za transport koriste TCP ili UDP. Ako je pr. TCP protokol odabran za transport, izračunava se checksum podata i dodaje se i on ,… Na kraju se sve zajedno sa svime iz prethodnog sloja (Aplikacijskog) i novododanih stvari, proslijeđuje sljedećem sloju.Prema OSI modelu ovo je Layer 4
Source port se nasumično odabire (1024 + Random [slučajni broj]) a Destination port označava protokol za komunikaciju (pogledajte tablicu s portovima).
Internet/Net sloj preuzima paket od transportnog sloja i dodaje svoj dio, koji sadrži i Source IP adresu (pošiljatelja) i destination IP adresu (primatelja) te se dalje sve (što sadrži sve što su dodali prethodni slojevii ovaj sloj), prosljeđuje sljedećem sloju.Prema OSI modelu ovo je Layer 3
Network Access/Link sloj preuzima paket od Internet sloja te dodaje i Source i Destination MAC adrese (dakle MAC adrese mrežne kartice ovog računala i računala na koje se šalje paket [ovisno da li je na istoj mreži - o ovome kasnije]).Tada se kreira novi paket koji sadrži sve preuzeto od prijašnjeg sloja iono što je ovaj sloj dodao i šalje se na mrežnu karticu. Prema OSI modelu ovo je Layer 2
Nadalje se sve pretvara u signale za slanje na mrežni medij (pr. “bakar” ili “optika” tj. električne signale ili svjetlosne impulse), od strane mrežne kartice.
Ovaj proces se na računalu koje prima podatke, odvija u suprotnom smjeru.Odnosno Web poslužitelj na koji smo se spajali, prima s mrežnog medija signale koji se pretvaraju u podatke koje preuzima Network Access/Link sloj koji provjerava svoj dio i skida ga te prosljeđuje Internet sloju koji provjerava svoj dio i skida ga i prosljeđuje Transportnom sloju koji provjerava svoj dio: ako je za transport bio korišten TCP, provjerava se integritet (točnost/ispravnost) i ako je sve ok, skida se dio koji je od ovog sloja i proslijeđuje Aplikacijskom sloju uz naznaku broja porta (jer on naznačava aplikacijski protokol i na kraju krajeva aplikaciju). Aplikacijski sloj izvlači podatke i prosljeđuje ih našoj aplikaciji (u ovom slučaju Web poslužitelju).
Na osnovu MAC adrese možemo raspoznati proizvođača same kartice (Intel, 3Com,Broadcom,…) Pr. Izgled MAC adrese: 00-30-00-3A-FD-6C
U današnjim mrežama za međusobno umrežavanja/spajanje računala, poslužitelja i ostale mrežne opreme koriste se switchevi odnosno preklopnici, koji standardno rade na OSI sloju 2 (Layer 2), dakle barataju sa MAC adresama.
Spajanjem bilo kojeg računala ili uređaja na neko mrežno sučelje (port) na preklopniku, sam preklopnik prvo mora saznati njegovu MAC adresu te ju spremiti u svoju internu tablicu koja sadrži par :
Source MAC adresa <–-> port/interface/mrežno sučelje na preklopniku
Zamislimo konfiguraciju kada računalo A (PC-A) želi komunicirati s računalom B (PC-B) a oba računala su tek uključena. Računalo PC-A je spojeno na preklopnikovo mrežno sučelje 1 a računalo PC-B na mrežno sučelje 2.
1.Računalo A (PC-A) se pokreće te šalje prvi mrežni paket prema preklopniku.
2.Preklopnik preuzima taj paket i gleda Source MAC adresu unutar paketa (to je MAC od Računala A) i pošto tu MAC adresu nema u tablici, zapamti ju, na mrežnom sučelju (port) na koji je spojen PC-A (port 1). Preklopnik sada gradi tablicu :
Port 1 - MAC od PC-A
Zatim preklopnik gleda dio paketa u kojem je odredišna MAC adresa (to je MAC od PC-B) i traži da li negdje ima tu MAC adresu.
3.Pošto je računalo B (PC-B) upravo poslalo prvi paket on na osnovu njegove Source MAC adrese dodaje novi unos u tablicu:
Port 2 - MAC od PC-B
U slučaju da nema MAC adresu od računala B (PC-B), preklopnik bi paket od računala A (PC-A) prvo poslao na sve portove i čekao odgovor od računala B (PC-B). Čim bi primio prvi odgovor (paket) od njega, na osnovi source/ MAC adrese bi saznao njegovu MAC adresu te bi dodao ovaj novi unos u Forwarding/CAM tablicu.
4. Sada je preklopnik u mogućnosti za svaki novi mrežni paket koji treba ići od PC-A do PC-B i u obrnutom smjeru, preklapati pakete s porta 1 na port 2 i obratno.
Ovo se ponavlja za svaki paket na mreži, koji prolazi kroz preklopnik.
MAC : port tablica na switchevima se naziva CAM tablica (Content Addressable Memory) tablica ili forwarding tablica.
Prisjetimo se TCP/IP komunikacije :
Svaki paket mora imati (uz ostale podatke) :
Pošto govorimo o standardnom preklopniku, koji je Layer 2 uređaj (OSI sloj 2), on gleda svaki paket i to samo dio sa Source MAC adresom i destination MAC adresom i na osnovu njih odrađuje preklapanje odnosno slanje mrežnih paketa sa jednog svog porta na drugi.
ARP protokol u komunikaciji koristi dva scenarija:
Standardni scenarij
1. Šalje se ARP Request (Odnosno ARP upit - tko ima IP adresu x.y.z.w) [Opcode 1 - Request] [Broadcast poruka]
2. Šalje se ARP Reply (Odnosno ARP odgovor - za IP adresu x.y.z.w koristi se MAC adresa AA:BB:CC:DD:EE:FF) [Opcode 2 - Reply] [Unicast poruka]
Važno je znati da svaki uređaj na mreži može poslati ARP request (zahtjev) koji se šalje na Broadcast MAC adresu 'FF:FF:FF:FF:FF:FF' i koju primaju sva računala unutar određene LAN mreže (odnosno unutar Broadcast domene). Isto tako bilo tko može odgovoriti na ovaj zahtjev odnosno upit i poslati ARP Response (odgovor), koji je “Unicast” poruka, odnosno odgovor ide na MAC adresu pošiljatelja ARP Request-a.
Scenarij za osvježavanje ARP tablice (tkzv “Gratuitous ARP”)
U ovom slučaju nema potrebe za dva koraka kao u prethodnom slučaju, već bilo koji uređaj može slati ARP Reply [Opcode 2 - Reply]. Razlika u odnosu na “normalan” ARP Reply je u tome što se ovaj “Reply” šalje na Broadcast MAC adresu tj. 'FF:FF:FF:FF:FF:FF'.
Primjer je vidljv na slici:
Ethernet II, Src: 02:02:02:02:02:02, Dst: ff:ff:ff:ff:ff:ff
Destination: ff:ff:ff:ff:ff:ff (Broadcast)
Source: 02:02:02:02:02:02 (02:02:02:02:02:02)
Type: ARP (0x0806)
Trailer: 000000000000000000000000000000000000
Address Resolution Protocol (request/gratuitous ARP)
Hardware type: Ethernet (0x0001)
Protocol type: IP (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: request (0x0001)
Sender MAC address: 02:02:02:02:02:02 (02:02:02:02:02:02)
Sender IP address: 192.168.1.1 (192.168.1.1)
Target MAC address: ff:ff:ff:ff:ff:ff (Broadcast)
Target IP address: 192.168.1.1 (192.168.1.1)
0000 ff ff ff ff ff ff 02 02 02 02 02 02 08 06 00 01 ................
0010 08 00 06 04 00 01 02 02 02 02 02 02 c0 a8 01 01 ................
0020 ff ff ff ff ff ff c0 a8 01 01 00 00 00 00 00 00 ................
0030 00 00 00 00 00 00 00 00 00 00 00 00 ............
Ovdje vidimo da uređaj sa MAC adresom '02:02:02:02:02:02' šalje Broadcast poruku svima ('FF:FF:FF:FF:FF:FF') da od sada IP adresa ('192.168.1.1') pripada MAC adresi ('02:02:02:02:02:02'). Na ovaj način je sam sebe proglasio nadležnim za IP adresu ('192.168.1.1').
Ovo rade mnogi uređaji koji koriste razne Virtualne IP adrese koje se dijele s drugoim uređajima (pr. za HSRP, VRRP GLBP i slične protokole te za protokole unutar raznih clustera), da bi se najavila promjena uređaja koji je postao aktivan vlasnik virtualne IP adrese.
Za detalje pogledajte način funkcioniranja protokola HSRP ili VRRP.
Ponovimo :
1.Switch pogleda Source MAC (to je MAC od Računala A) i vidi da ga već ima u tablici (ako nema zapamti ga sada, na portu na koji je spojen) te pogleda i destination MAC adresu (to je MAC od Računala B)
2.Switch provjerava svoju tablicu i gleda da li ima MAC adresu od računala B, ako ima gleda na kojem je portu (interface-u) i paket šalje na taj port (interface)
U slučaju da nema MAC adresu od računala B, pokuša ju saznati slanjem ARP poruke te ju zapamti i izgradi si novu tablicu (tj. osvježi ju).
Ova MAC tablica na switch-u se zove i CAM tablica (Content Addressable Memory) tablica.
Sada kada switch ima u CAM tablici i Source i Destination MAC adrese od ovog (i svakog) paketa od Računala A on paket (jedan po jedan) prebaci/preklopi na interface na kojem se nalazi spojeno računalo B. Ovo se ponavlja za svaki paket i za sve komunikacije.
Osim Standardnih Layer 2 switcheva, postoje i tkzv. Multilayer switchevi, odnosno switchevi koji rade na:
Dakle većinu operacija sa mrežnim paketima Multilayer switch odrađuje oko 1.000 puta brže od klasičnih Routera (usmjerivača).
Možemo reći da je Multilayer switch spoj “klasičnog” Layer 2 switcha i Routera koji radi na “Wire Speed”-u unutar jedne hardverske platforme.
Sve operacije koje on obavlja, obavlja i klasični Layer 2 Switch i standardni Router (usmjerivač) ali sve na hardverskoj brzini unutar milisekundi. Njegovom upotrebom možemo povećati performanse cijele mreže,ali uz pravilan dizajn mreže i pravilno dimenzioniranje.
Što se dešava na kojem sloju i kojom brzinom (za switcheve koji imaju “ASIC”):
O čemu se radi (ASIC) ?
ASIC (Application Specific Integrated Circuit) je IC (“chip”) koji se ovisno o izvedbi i modelu switcha praktično nalazi na svakom portu (interface-u) uređaja koji ga imaju.
ASIC je u mogućnosti unutar granica mikrosekundi:
ASIC imaju i Layer2 switchevi proizvođača poput : Cisco, Juniper i drugih te neki modeli proizvođača poput: Brocade, Allied Telesin, HP i drugih.
S druge strane “entry level” ili “manji” proizvođaći poput : D-Link, TP Link, Netgear, Mikrotik i sl. nemaju ASIC
Naime i mnoge funkcionalnosti koje pripadaju u Layer2 ili su na granici između Layer 2 i Layer 3 poput :
Odrađuju se unutar ASIC-a (ako postoji) - dakle unutar granica 1.000 puta brže od uređaja koji ih nemaju. Ovo za sobom nosi i dobar dio razlike u cijeni.
Veliko ubrzanje u radu ASIC-a, uz upotrebu vrlo brze SRAM memorije, donosi i upotreba sljedećih komponenti integriranih u sam ASIC (za Cisco Switcheve 3750 ili jače):
Zbog gore navedenih karakteristika, standardno ASIC (Cisco 3750 ili jači modeli) omogućava obradu sljedećih funkcija, hardverskom brzinom :
Slika prikazuje logičku shemu Cisco 3750 Multilayer (Layer: 2,3 i 4) switcha:
Razni protokoli za svoj rad tj. u komunikaciji koriste Broadcast način komunikacije koji radi tako što se poruke šalju na specijalnu Broadcast adresu koju primaju svi uređaji (računala, poslužitelji i dr.) unutar određene mreže. Problem je u tome što ovakav način komunikacije zagušuje mrežu.
Hub-ovi i switchevi propuštaju broadcast domenu a Routeri standardno Ne propuštaju. Dakle ako imamo potrebu ograničiti Broadcast domenu, mreža mora biti razdvojena na segmente koji su spojeni preko Routera ili drugih Layer 3 uređaja (pr. Multilayer switcheva).
Nakon što smo nešto naučili o osnovama mreža, upoznajmo se s njima malo detaljnije. U daljnjem tekstu, pričati ćemo samo o IPv4 protokolu.
Kako izgledaj jedna IP (IPv4) adresa u dekadskom i binarnom sustavu:
Uzeti ćemo za primjer IP adresu : 172.17.100.18 , koja binarno izgleda ovako : 10101100.00010001.01100100.00010010
Pogledajmo to u tablici, da bude malo jasnije:
| Dekadski | 172 | 17 | 100 | 18 |
| Binarno | 10101100 | 00010001 | 01100100 | 00010010 |
| Binarno broj bitova | 8 | 8 | 8 | 8 |
Vidljivo je da je IP adresa podjeljena u 4 segmenta od 8 bitova, odvojenih s točkom (.)
Kada se IP adresa dodjeljuje računalu, neki od bitova s lijeve strane prezentiraju mrežu.
Broj bitova koji će prezentirati mrežu ovisi o klasi mreže.
Dakle IP adrese su podjeljene u točno definirane klase, od kojih svaka ima svoju (preporučenu) namjenu:
| Klasa IP adresa | Opseg (prvi oktet) | Namjena |
| Klasa A | 0.0.0.0. …do… 127.255.255.255 | Za ekstremno velike mreže |
| 127. | Rezervirano za loopback (lokalno računalo i sl.) | |
| Klasa B | 128.0.0.0 …do… 191.255.255.255 | Za srednje do velikih mreža |
| Klasa C | 192.0.0.0 …do… 223.255.255.255 | Manje mreže |
| Klasa D | 224.0.0.0 …do… 239.255.255.255 | Multicast adrese |
| Klasa E | 240.0.0.0 …do… 255.255.255.255 | Rezervirana od IETF za istraživanje |
Primjerice sve IP adrese koje počinju od 128.0.0.0 pa sve sve do 191.255.255.255 su adrese koje su unutar klase B.
Osim navedenih klasa, u novije vrijeme zatraženo je da se unutar klasa A,B i C rezerviraju određeni dijelovi mreža za privatne mreže (engl. Private Networks). prema RFC1918 :
| Klasa adresa | Opseg | Netmask | Max broj IP adresa |
| A | 10.0.0.0 …do… 10.255.255.255 | 255.0.0.0 | 16.777.216 |
| B | 172.16.0.0 …do… 172.31.255.255 | 255.240.0.0 | 1.048.576 |
| C | 192.168.0.0 …do… 192.168.255.255 | 255.255.0.0 | 65.536 |
IP adrese unutar ovih okvira se smatraju privatnim IP adresama i standardno, za usmjerivače telekoma tj. ISPova (Engl. Internet service provider) nisu rutabilne odnosno javno dostupne. To znači kako primjerice, na kućnom usmjerivaču, kako bi izašli na “internet” morate koristiti neku od tehnika skrivanja odnosno preslikavanja, unutarnjih privatnih adresa, ma vanjsku(e) javnu IP adresu. Pogledajte poglavlje NAT
Korištenjem kombinacije IP adrese i Netmask adrese definiran je svaki mrežni element (Računalo,poslužitelj ,….)
Tako i svaka mreža ima svoju:
To ćemo objasniti na primjeru.
Uzmimo jednu mrežu B klase:
Unutar velike mreže B klase odabrati ćemo ćemo dvije mreže:
Mreža A: 198.150.11.*, koja se označava sa 198.150.11.0 Mreža B: 198.150.12.*, koja se označava sa 198.150.12.0
Pogledajmo što te mreže sadrže:
| Adresa mreže (Network Address) | Opseg adresa za upotrebu | Broadcast adresa za (ovu) mrežu |
| 198.150.11.0 | 198.150.11.1 …do… 198.150.11.254 | 198.150.11.255 |
| 198.150.12.0 | 198.150.12.1 …do… 198.150.12.254 | 198.150.12.255 |
Dakle mreža A , ima IP adresu 198.150.11.0.
Unutar te mreže svim računalima,poslužiteljima i ostalim uređajima kojima ćemo dodjeliti neku IP adresu, IP adresu možemo dodjeliti iz opsega IP adresa od: 198.150.11.1 sve do 198.150.11.254. a na kraju našeg opsega IP adresa se nalazi broadcast IP adresa (koja je rezervirana i nju ne možemo koristiti) , u ovom slučaju to je adresa : 198.150.11.255.
Isto pravilo vrijedi i za mrežu B (i druge mreže).
Zamisliti ćemo naše dvije mreže s računalima , spojene na sljedeći način:
Mreža A je na jednoj strani a mreža B na drugoj te su spojene preko Routera, preko kojeg obije mreže imaju izlaz na internet.
U slučaju da komunikacija teće samo između računala u mreži A isto kao i u slučavima kada komunikacija teće samo između računala u mreži B, računala normalno komuniciraju preko TCP/IP seta protokola i to direktno :
Ali kada je potrebno da računala iz mreže A komuniciraju s računalima iz mreže B , neke osnovne stvari moraju biti zadovoljene:
Što se dalje dešava, vidjeti ćemo kada naučimo još nekoliko pojmova !.
orištenjem kombinacije IP adrese i Netmask adrese definiran je svaki mrežni element (računalo, poslužitelj, usmjerivač, preklopnik,…). Dakle svaka IP adresa, dolazi u paru s Tzv. netmask adresom koja se naziva maskom mreže.
Dodatno, svaka mreža ima svoj:
Netmask odnosno maska mreže je 32 bitni broj (232) koji uz pripadajuću IP adresu identificira svaki uređaj na mreži ali i samu mrežu. Maska mreže i njena pripadajuća IP adresa, govore nam na koji način će IP adresa biti interpretirana odnosno kojoj mreži svaka IP adresa pripada. Zbog potrebe podjela mreža na podmreže (engl. Subnet) i nadmreže (engl. Supernets) te samih klasa mreža, uz IP adresu se mora koristiti i maska mreže.
Pogledajmo standardne maske mreža, za različite klase mreža.
| Klasa mreže | Maska mreže |
| Klasa A | 255.0.0.0 |
| Klasa B | 255.255.0.0 |
| Klasa C | 255.255.255.0 |
Na dolje slici je vidljiva podjela na 4 okteta od kojih svaki ima 8 bitova (slično kao IP adrese). Bitovi s lijeve strane (plavo) označavaju mrežu (Network) a s desne strane identificiraju računalo (Host) na mreži.
Maska mreže se logički sastoji od dva dijela:
U normalnoj upotrebi, maska mreže se često određuje tako da prvo moramo saznati kojoj klasi pripada naša IP adresa. U slučaju korištenja podmreža i nadmreža, potrebno je izračunati, koliko podmreža želimo dobiti od jedne mreže, te koliko velike podmreže uopće želimo. Dalje u tekstu, govoriti ćemo o “standardnim” mrežama koje nisu podjeljene u podmreže, odnosno imati će standardnu masku mreže, prema njihovoj klasi mreže iz koje dolaze.
Mrežni dio maske mreže
Ovaj dio ( prvi dio maske mreže, s lijeve strane ), opisuje mrežu.
Popunimo sve jedinice s lijeve strane, dok ne dođemo do naše mreže. Primjerice. maska mreže za klasu C je 255.255.255.0 tj. prva tri okteta su sve jedinice
- ukupno 24 bita za ovaj primjer.
Kod drugog čestog načina označavanja maske mreže se prebrojavaju bitovi (1) od lijevo na desno, pa se gore navedena maska označava i kao /24.
Pr. za našu IP adresa 198.150.11.1 možemo reći slijedeće :
host dio u 4-tom oktetu čine nule - gledano s desna na lijevo.
Naime popunili smo sve jedinice binarno od lijeva na desno, prva tri okteta (8 bitova):
11111111.11111111.11111111.00000000 i dobili dekadski :
255.255.255.0.
Mrežni dio maske mreže se popunjava jedinicama od lijevo prema desno i to:
Pogledajmo to ovako - mrežni dio maske mreže se kreće:
1 od lijevo prema desno, pa bi slijedeće podmreža bila : 11111111.11000000.00000000.00000000 i tako dalje sve dok ne dođemo do slijedeće klase.
Host dio maske mreže
Nule na kraju, odnosno prebrojavanjem 0 od desno na lijevo (dok ne dođemo do jedinica) daje nam naš Host dio, unutar kojega možemo koristiti IP adrese. Dakle koliko bitova nula imamo u masci mreže, od desno na lijevo, toliko bitova za upotrebu, imamo na istoj poziciji, gledajući na našu IP adresu mreže.
S navedenom maskom mreže, za naš slučaj vidimo kako je cijeli zadnji oktet (8 puta po 0 tj. 28=256) slobodan za računala, što je 256 adresa (0 do 255 uključujući nulu).
Dakle : 11111111.11111111.11111111.00000000 (sada gledamo nule za host dio)
Ne zaboravimo kako u svakoj mreži postoje i dvije dodatne IP adrese :
Nama zbog navedenog, u svakoj mreži ostaje ukupan broj IP adresa umanjen za ove dvije IP adrese.
U našem slučaju to su: 256 - 2 = 254 upotrebljive adrese.
Kako se računa adresa mreže odnosno kako usmjerivači i uređaji koji rade na OSI sloju 3 znaju kojoj mreži pripada koja IP adresa?
Na samom početku, kada naše računalo dobije IP adresu i pripadajuću mu masku mreže, ono radi izračune, navedene dolje, kako bi izračunalo kojoj mreži pripada (prema IP adresi mreže) te koja je broadcast adresa te mreže. Ovo je važno u normalnoj komunikaciji i unutar same LAN mreže, bez izlaska mrežnih paketa van, preko usmjerivača. Naime svaki element u mrežni (računalo, poslužitelj, usmjerivač, preklopnik, mrežni štampač i sl.) prihvaća samo one mrežne pakete koji su namijenjeni njegovoj mreži. Ovo je dodatno važno i stoga što neki mrežni protokoli u komunikaciji na IP sloju, koriste broadcast metodu komunikacije. U ovakvoj komunikaciji odredišna je IP adresa na koju se šalje paket, upravo broadcast IP adresa mreže, a koju moraju primiti sva računala unutar određene IP mreže, a koja znaju da je to njihova broadcast IP adresa.
Kada mrežni paket dođe do usmjerivača, on za svaki paket, koji mu dolazi na mrežno sučelje, provjerava, kojoj IP adresi mreže pripada. Kako usmjerivač ima svoju tablicu usmjeravanja, u kojoj se nalaze i parovi IP adresa mreže i njen par - maska mreže, te mrežno sučelje kojemu pripadaju, on na osnovi IP adrese paketa koji mu je došao, jasno zna gdje će svaki taj paket i usmjeriti.
Kako se izračunava IP adresa mreže ?
Podsjetimo se AND logičke operacije :
| Ulaz A | Ulaz B | Rezultat |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Uzmimo IP adresu: 198.150.11.1 i njenu masku mreže 255.255.255.0 11000110
| Dekadski | 198 | 150 | 11 | 1 |
| Binarno | 11000110 | 10010110 | 00001011 | 00000001 |
i njenu pripadajući Netmask adresu:
| Dekadski | 255 | 255 | 255 | 0 |
| Binarno | 11111111 | 11111111 | 11111111 | 00000000 |
Sada se radi logička I operacija (AND), sa IP adresom i pripadajućom maskom mreže:
| IP adresa | 11000110 | 10010110 | 00001011 | 00000001 |
| Netmask | 11111111 | 11111111 | 11111111 | 00000000 |
| Rezultat AND operacije - binarno | 11000110 | 10010110 | 00001011 | 00000000 |
| Rezultat AND operacije - dekadski | 198 | 150 | 11 | 0 |
Dobili smo kao rezultat : 198.150.11.0 , dakle ovo je IP adresa mreže, koja nije subnetirana.
Rekli smo kako je IP adresa mreže, nulta (odnosno prva IP adresa koju ne smijemo i ne možemo koristiti), te kako, nakon nje slijedi niz upotrebljivih IP adresa, te je zadnja IP adresa unutar te mreže, broadcast IP adresa, koju isto ne smijemo koristiti.
Broadcast adresa mreže se izračunava, pomoću inverzne maske mreže, naše maske mreže te IP drese mreže, ali o tome malo kasnije.
Pogledajmo primjer.
Uzmimo jednu mrežu C klase, kao primjer:
Unutar velike mreže C klase, odabrati ćemo dvije manje mreže, s time da obije imaju standardni netmask 255.255.255.0, za mrežu klase C:
Mreža 1: 198.150.11.*, koja se označava sa 198.150.11.0 Mreža 2: 198.150.12.*, koja se označava sa 198.150.12.0
Pogledajmo što te mreže sadrže:
| Adresa mreže (Network Address) | Opseg adresa za upotrebu | Broadcast adresa za (ovu) mrežu |
| 198.150.11.0 | 198.150.11.1 …do… 198.150.11.254 | 198.150.11.255 |
| 198.150.12.0 | 198.150.12.1 …do… 198.150.12.254 | 198.150.12.255 |
Dakle mreža 1, ima IP adresu 198.150.11.0 (ova IP adresa označava cijelu ovu mrežu).
Unutar te mreže svim računalima, poslužiteljima i ostalim uređajima kojima ćemo dodijeliti neku IP adresu, IP adresu možemo dodijeliti iz opsega IP adresa od: 198.150.11.1 sve do 198.150.11.254. a na kraju našeg opsega IP adresa se nalazi broadcast IP adresa (koja je rezervirana i nju ne možemo koristiti), u ovom slučaju to je adresa : 198.150.11.255 ( prethodno smo ju izračunali).
Isto pravilo vrijedi i za mrežu 2 ali i druge mreže s istom mrežnom maskom.
Provjerimo u tablici dolje za netmask 255.255.255.0
CIDR notacija koristi se za skraćeno označavanje Netmaska, a označava se tako da prebrojimo jedinice s lijeve strane.
Dakle Netmask 255.255.255.0 ima 24 jedinice s lijeve strane pa je CIDR oznaka /24
Podmreže (engl. Subnets) se koriste za segmentiranje IP adresa (unutar klasa A,B i C), na nivou pojedine mreže na manje
dijelove.
Subnetiranjem razbijamo određenu mrežu na podmreže, koje se u potpunosti ponašaju kao obične mreže, dakle imaju:
Subnetirati mrežu na podmreže je moguće uz pomoć subnet maske tj Netmask-a.
Subnetirana IP adresa se sastoji od mrežnog dijela te subnet i host dijela IP adrese.
Pošto se kod svake TCP/IP konekcije uz IP adresu provjerava i Netmask, svako
računalo (mrežna oprema) na osnovu Netmaska prepoznaje da li je riječ o subnetiranju
ili nije odnosno kojoj mreži pripada određeni par IP adresa+Netmask.
Kako prepoznati da li je mreža subnetirana :
U slučajevima kada se držimo Netmask-a definiranog prema klasama mreža, za određenu IP adresu, tada mreža nije subnetirana.
Podsjetimo se koje su standardne vrijednosti Netmaska, prema klasama mreža, za mreže koje nisu subnetirane:
| Klasa mreže | Netmask |
| A | 255.0.0.0 |
| B | 255.255.0.0 |
| C | 255.255.255.0 |
Kako mrežni uređaji znaju kojoj mreži pripada određena IP adresa (i dali je ta mreža subnetirana) ?
Za svaki par IP adresa i Netmask se prvo radi logička AND (hrv. logička operacija I) operacija te se dobija IP adresa mreže kojoj pripada ta IP adresa. Na osnovi IP adrese mreže jasno je gdje će se svaki mrežni paket koji ima tu IP/Netmask kombinaciju i proslijediti od strane Layer 3 uređaja (Router ili Multilayer switch).
Podsjetimo se AND logičke operacije :
| Ulaz A | Ulaz B | Rezultat |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Uzmimo sljedeću IP adresu :
| Dekadski | 172 | 17 | 100 | 18 |
| Binarno | 10101100 | 00010001 | 01100100 | 00010010 |
i njenu pripadajući Netmask adresu:
| Dekadski | 255 | 255 | 255 | 0 |
| Binarno | 11111111 | 11111111 | 11111111 | 00000000 |
Na osnovi IP adrese se radi logička AND operacija sa Netmaskom:
| IP adresa | 10101100 | 00010001 | 01100100 | 00010010 |
| Netmask | 11111111 | 11111111 | 11111111 | 00000000 |
| Rezultat AND operacije - binarno | 10101100 | 00010001 | 01100100 | 00000000 |
| Rezultat AND operacije - dekadski | 172 | 17 | 100 | 0 |
Dobiil smo kao rezultat : 172.17.100.0 , dakle ovo je IP adresa mreže (koja nije subnetirana jer pripada klasi C sa standardnim Netmaskom).
Podsjetimo se da je ova IP adresa ujedno i nulta IP adresa unutar ove mreže (kao i za druge mreže). Rekli smo da je IP adresa mreže nulta (odnosno prva IP adresa koju ne smijemo i ne možemo koristiti), te da nakon nje slijedi niz upotrebljivih IP adresa.
Važno za znati je kako se kod prolaska mrežnih paketa mrežom, za svaki par IP/Netmask unutar svakog paketa na mreži, u pozadini prvo odradi AND-ing jer se jedino na osnovi rezultata logičke AND operacije utvrđuje gdje određeni mrežni paket treba ići.
Ovaj posao odrađuju Layer 3 uređaji (Routeri ili Multilayer switchevi). Dakle oni poznaju mrežnu topologiju te znaju gdje im je spojena koja mreža te kada saznaju na koju mrežu (prema izračunatoj IP adresi mreže) poslati paket, u tom smijeru ga i proslijeđuju.
Sada znamo IP adresu mreže te nam još nedostaje i zadnja IP adresa unutar ove mreže (ili subneta).
Ovo se radi u dva koraka:
1.Izračun inverzne maske
Radi se logička operacija XOR sa netmaskom koja ima sve 1-ice (255.255.255.255) i sa našim Netmaskom (u našem slučaju : 255.255.255.0)
Podsjetimo se XOR logičke operacije :
| Ulaz A | Ulaz B | Rezultat |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
| Netmask sa svim 1-icama | 11111111 | 11111111 | 11111111 | 11111111 |
| Naš Netmask | 11111111 | 11111111 | 11111111 | 00000000 |
| Rezultat XOR operacije | 00000000 | 00000000 | 00000000 | 11111111 |
Rezultat je dekadski : 0.0.0.255
2.Konačni rezultat
Da bi dobili zadnju IP adresu unutar naše mreže a to je Broadcast IP adresa, radimo logičku operaciuju OR (hrv. ILI) od našeg rezultata XOR operacije (0.0.0.255) i naše IP adrese mreže koju smo tako]er iyra;unali (172.17.100.0):
Podsjetimo se OR logičke operacije :
| Ulaz A | Ulaz B | Rezultat |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
| Rezultat XOR operacije | 00000000 | 00000000 | 00000000 | 11111111 |
| IP adresa naše mreže - binarno | 10101100 | 00010001 | 01100100 | 00000000 |
| Rezultat OR operacije - Broadcast IP adresa | 10101100 | 00010001 | 01100100 | 11111111 |
Dekadski rezultat je 172.17.100.255 - ovo je Broadcast IP adresa naše mreže (tj. zadnja IP adresa u toj mreži).
Sada imamo sve podatke za mrežu, koji su nam potrebni :
IP adresa: 172.17.100.10 sa pripadajućim Netmaskom : 255.255.255.0 , nalazi se u mreži: 172.17.100.0 .
Broadcast IP adresa (i samim time zadnja IP adresa u mreži) te mreže je : 172.17.100.255
Upotrebljive IP adrese su od : 172.17.100.1 …do… 172.17.100.254
Da bi odlučili kako subnetirati mrežu, od strane Administratora potrebno je procijeniti :
Potom se izračunava subnet koji nam odgovara.
Kada smo odredili subnet, potrebno je za svaki subnet zapisati :
Kako se radi subnetiranje ?
Kada smo pričali o masci mreže odnosno Netmasku rekli smo da postoji dio koji je rezerviran za mrežu i dio za Hostove. Kod upotrebe standardnih netmaska tu je kraj priće ali kod subnetiranja mi od Host dijela moramo posuditi lijevi dio za proširenje postojećeg netmaska tako da dobivamo lsijedeće (slika):
Mi zapravo od host dijela posuđujemo bitove s lijeve strane i popunjavamo ih isto s lijeva na desno kao što popunjavamo kod Netmaska s time kako se dodani bitovi nadodaju na postojeći netmask.
Pr. Netmask : 255.255.255.0
| Netmask dekadski | Netmask binarno | |||
| 255.255.255.0 | 11111111 | 11111111 | 11111111 | 00000000 |
Uvom primjeru onaj desni oktet koji ima sve jedinice je Host dio.
Taj dio moramo podjeliti tako da dodavanjem svakog bita s lijevo na desno praktično dijelimo mrežu na dva (2) dijela a ostatak prema desno je upotrebljiv za upotrebu (opseg IP adresa unutar subneta)
Ako želimo podjeliit ovu mrežu na dva dijela dodati ćemo jedan bit s lijeve strane, pa ćemo dobiti sljedeći Netmask: (Pogledajte taj bit koji smo dodali u zadnji oktet i ostale nule koje su slobodne za upotrebu)
| Netmask dekadski | Netmask binarno | |||
| 255.255.255.128 | 11111111 | 11111111 | 11111111 | 10000000 |
Pogledajmo tablicu za podmreže za klasu A mreža:
| Netmask | CIDR notacija | Broj mogućih podmreža (subneta) | Broj iskoristivih IP adresa (Hostova) unutar subneta | Ukupan (z)broj svih upotrebljivih IP adresa |
| 255.0.0.0 | /8 | 1 | 16777214 | 16777214 |
| 255.128.0.0 | /9 | 2 | 8388606 | 16777212 |
| 255.192.0.0 | /10 | 4 | 4194302 | 16777208 |
| 255.224.0.0 | /11 | 8 | 2097150 | 16777200 |
| 255.240.0.0 | /12 | 16 | 1048574 | 16777184 |
| 255.248.0.0 | /13 | 32 | 524286 | 16777152 |
| 255.252.0.0 | /14 | 64 | 262142 | 16777088 |
| 255.254.0.0 | /15 | 128 | 131070 | 16776960 |
Pogledajmo i tablicu za podmreže za klasu B mreža :
| Netmask | CIDR notacija | Broj mogućih podmreža (subneta) | Broj iskoristivih IP adresa (Hostova) unutar subneta | Ukupan (z)broj svih upotrebljivih IP adresa |
| 255.255.0.0 | /16 | 1 | 65534 | 65534 |
| 255.255.128.0 | /17 | 2 | 32766 | 65532 |
| 255.255.192.0 | /18 | 4 | 16382 | 65528 |
| 255.255.224.0 | /19 | 8 | 8190 | 65520 |
| 255.255.240.0 | /20 | 16 | 4094 | 65504 |
| 255.255.248.0 | /21 | 32 | 2046 | 65472 |
| 255.255.252.0 | /22 | 64 | 1022 | 65408 |
| 255.255.254.0 | /23 | 128 | 510 | 65280 |
I na kraju slijedi tablica za podmreže za klasu C mreža:
| Netmask | CIDR notacija | Broj mogućih podmreža (subneta) | Broj iskoristivih IP adresa (Hostova) unutar subneta | Ukupan (z)broj svih upotrebljivih IP adresa |
| 255.255.255.0 | /24 | 1 | 254 | 254 |
| 255.255.255.128 | /25 | 2 | 126 | 252 |
| 255.255.255.192 | /26 | 4 | 62 | 248 |
| 255.255.255.224 | /27 | 8 | 30 | 240 |
| 255.255.255.240 | /28 | 16 | 14 | 224 |
| 255.255.255.248 | /29 | 32 | 6 | 192 |
| 255.255.255.252 | /30 | 64 | 2 | 128 |
| 255.255.255.254 | /31 | 128 | 2 samo za point-to-point mreže | 256 samo za point-to-point mreže |
Na osnovi naših potreba te korištenjem ovih tablica možemo odabrati pravilnu masku mreže.
Uzmimo sljedeći primjer : imamo mrežu 172.17.100.0 sa netmaskom : 255.255.255.0.
Tu mrežu želimo podjeliti na dvije (2) mreže unutar kojih nam treba biti maksimalno 126 korisnih IP adresa.
Pogledajmo našu mrežu:
| Dekadski | 172 | 17 | 100 | 0 |
| Binarno | 10101100 | 00010001 | 01100100 | 00000000 |
i njenu pripadajući Netmask adresu:
| Dekadski | 255 | 255 | 255 | 0 |
| Binarno | 11111111 | 11111111 | 11111111 | 00000000 |
Korištenjem tablice zaključili smo da ako želimo 2 subneta od kojih svaki može imati do 126 korisnih adresa, Netmask mora biti : 255.255.255.128 tj. prema CIDR notaciji /25 što znaći da imamo 25 jedinica u subnetu. To izgleda ovako:
| Dekadski | 255 | 255 | 255 | 128 |
| Binarno | 11111111 | 11111111 | 11111111 | 10000000 |
Dakle posudili smo jedan bit iz host dijela da bi ga iskoristili za subnetiranje.
Ovo je najbrža metoda kalkulacije subneta:
S jednim posuđenim bitom imamo dvije moguće mreže (prva mreža ako je bit u 0-li i druga kada je taj bit u 1-ici):
Bit ima vrijednost 0
| Dekadski | 172 | 17 | 100 | 0 |
| Binarno | 10101100 | 00010001 | 01100100 | 00000000 |
Bit ima vrijednost 1
| Binarno | 10101100 | 00010001 | 01100100 | 10000000 |
| Dekadski | 172 | 17 | 100 | 128 |
Ovdje smo dobili dvije mreže (kako smo i odabrali/planirali) :
(1 mreža): 172.17.100.0
i
(2 mreža): 172.17.100.128
Što to znači :
Za prvu mrežu
IP adresa mreže je : 172.17.100.0
Mreža se proteže sve do 172.17.100.127 (za jedan broj manje od druge mreže)
Prema tome Broadcast IP je : 172.17.100.127
Upotrebljive IP adrese su od : 172.17.100.1 do 172.17.100.126
Za drugu mrežu
IP adresa mreže je : 172.17.100.128
Mreža se proteže sve do 172.17.100.255 (za jedan broj manje od druge mreže)
Prema tome Broadcast IP je : 172.17.100.255
Upotrebljive IP adrese su od : 172.17.100.129 do 172.17.100.254
Nadmreža (Supernetting) je po logici suprotnost subnettingu. U slučajevima kada od više malih mreža želimo napraviti jednu veliku mrežu koristimo supernetting. Supernetting je opisan u dva RFC-a : RFC1338 i RFC1519.
Određivanje nadmreža radi se u suprotnom smijeru od podmreža (subnets).Pogledamo li način na koji smo pomicali tj. posuđivali bitove u masci mreže (netmask) kod podmreža smo to radili od lijeva na desno, u slučaju nadmreža se zapravo vraćamo unazad tj. od desno na lijevo.
Ova metoda se često koristi kod sumarizacija route-a često zvana i agregacija route-a.
O čemu se radi.
Za svaku mrežu koju imamo, naš Layer 3 uređaj (često Router) mora imati Route-u do nje. Svaka nova route-a zauzima memoriju i oduzima određeno vrijeme za procesiranje (CPU load).
Pr. Ako imamo sljedeće route (iz mreža koje smo subnetirali prije):
172.17.100.0 / 255.255.255.128
172.17.100.128 / 255.255.255.128
Koje za izlaz na internet i sa interneta dolaze sa drugog interface-a na routeru :
10.14.5.1 / 255.255.255.252.
i želimo smanjiti broj route-a, napraviti ćemo nadmrežu koja uključuje sve postojeće podmreže.
Naš netmask izgleda ovako:
| Dekadski | 255 | 255 | 255 | 128 |
| Binarno | 11111111 | 11111111 | 11111111 | 10000000 |
Pogledajmo sliku:
Ovo je mali broj mreža ali ako imamo sustave sa jako velikim brojem mreža pojaviti će se potreba da ubrzamo stvari sumarizacijom route-a, pa ćemo napraviti nadmreže.
U našem slučaju možemo napraviti sljedeće:
Za mrežu : 172.17.100.0 / 255.255.255.0 Izlazna IP će biti : 10.14.5.1 / 255.255.255.252
Dakle sada koristimo sljedeći netmask :
| Dekadski | 255 | 255 | 255 | 0 |
| Binarno | 11111111 | 11111111 | 11111111 | 00000000 |
S ovime smo smanjili Routing tablicu na pola.
Što smo napravili ?
Promijenili smo Netmask koji sada govori da cijela nadmreža : 172.17.100.0 / 24 : što znači IP adrese 172.17.100.0 do 172.17.100.255 , ima jednu route-u za ulaz/izlaz na internet i obratno da sve mreže koje dolaze s interneta znaju da ovaj router iza sebe ima jednu veću mrežu 172.17.100.0 /24, bez potrebe da znaju da smo ju mi iznutra razbili na dvije mreže. Na taj način smo i sebi i susjednim routerima smanjili routing tablice.
Usmjeravanje (engl. Routing) je proces odabira, najboljeg puta za prolaz mrežnih paketa prema odredištu.
Uređaji koji odrađuju usmjeravanje se zovu usmjerivači (engl. Routers).
Za potrebe usmjeravanja možemo koristiti :
Statičke rute se dodaju, kao što i ime kaže, statički odnosno ručno, za svaku novu mrežu, što postaje malo nezgodno kada imamo više mreža ili kada se mreže mijenjaju. U slučajevima kada imamo veliki broj mreža statičke rute postaju problematične tj. vrlo teško ih je održavati ručnim i stalnim dodavanjem i brisanjem, stoga se za sve imalo veće mreže koriste protokoli za usmjeravanje, koji dinamički, automatski dodaju i brišu odnosno mijenjaju rute. Većina usmjerivača na internetu, koristi neki od protokola za usmjeravanje.
Statički odnosno ručno se dodavaje i Tzv. Default route, koja je osnovna ruta, koja prolazi preko primarnog usmjerivača, koji se zove i Default gateway. U manjim mrežama, to je jedini usmjerivač na mreži. Drugi slučaj upotrebe statičkih ruta je ako imamo prilično statične (nepromjenjive) ili male mreže, u kojima nam je praktično, ručno dodavati, mijenjati ili brisati rute.
Default ruta s Default gateway usmjerivačem obično ima oblik :
| IP Adresa | Netmask | Default Gateway IP |
| 0.0.0.0 | 0.0.0.0 | 192.168.1.1 |
Default ruta koju vidite znači: za sve IP adrese odnosno sve mreže, za koje ne postoji izričito definirana ruta. Dakle u slučaju kada usmjerivač ili računalo na mreži, ne zna gdje poslati neki paket tj. kada nema definiranu rutu ( putanju ) za njega, paket se šalje na IP adresu Default Gateway usmjerivača.
Što su uopće tablice usmjeravanja odnosno route ?
Route nam pokazuju tko je od usmjerivača odgovoran za koju mrežu, tako da znamo gdje poslati koji mrežni paket koji izlazi iz naše mreže, prema drugoj mreži.
Možemo promatrati rutu kao putokaz za mrežne pakete, poput autoceste: dali skrenuti lijevom ili desnom cestom, prema odredištu.
Primjer tablice usmjeravanja, na usmjerivaču (R1), može opisno izgledati ovako :
Za mrežu 192.168.100.0 / 255.255.255.0 (/24) koristi mrežno sučelje eth0
Za mrežu 10.14.15.0 / 255.255.255.0 (/24) koristi usmjerivač - IP : 172.17.100.254
Default route:
Za mrežu 0.0.0.0 / 0.0.0.0 koristi IP : 172.17.100.254
U konkretnom primjeru to znači kako će komunikacija unutar mreže 192.168.100.0, biti bez posredovanja usmjerivača R1 jer mu je to lokalna mreža, dostupna preko njegovog mrežnog sučelja eth0, dok će svi paketi koji trebaju završiti na mreži : 10.14.15.0, biti usmjereni na usmjerivač : 172.17.100.254. I na kraju default ruta kaže, kako za sve ostale udaljene mreže, treba slati pakete na Default gateway usmjerivač, s IP adresom : 172.17.100.254
Pogledajte kako ovakva mreža izgleda, topološki, ako se navedene rute nalaze na usmjerivaču R1:
Protokoli za usmjeravanje, prema logici rada mogu koristiti dvije vrste algoritama. Prema tome, protokole za usmjeravanje dijelimo prema vrsti algoritma koji koristi, a to su :
Malo detaljnije o osnovnom usmjeravanju
U slučaju usmjeravanja ( Engl. Routing) koji se događa na OSI sloju 3 (IP adrese, prema TCP/IP modelu), uređaji odluku za usmjeravanje paketa donose na osnovu IP adresa.
Tablica na osnovu koje se odrađuje usmjeravanje se zove Routing tablica odnosno tablica usmjeravanja. Dakle slična priča kao za preklopnike, ali na drugom OSI sloju, i još malo kompleksnija zbog routing protokola i mogućnosti dinamičkih promjena tablica usmjeravanja, pomoću protokola za usmjeravanje (pr. RIP, OSPF, BGP, …).
Uređaji koji se bave usmjeravanjem, zovemo usmjerivači (Routeri) ali postoje i preklopnici (switchevi) koji mogu odrađivati i taj dio posla. Ovakve preklopnike zovemo Multilayer switchevi odnosno preklopnici koji rade na više OSI slojeva (2,3 i 4). Ovakvi preklopnici vrlo su važni u današnjim mrežama, jer nam daju mogućnost da uredno segmentiramo lokalnu mrežu a da to ne unese usporavanja, koja bi uveli klasični usmjerivači.
Kako smo rekli, kod usmjeravanja, usmjerivač ili Multilayer preklopnik, zaprimaju svaki, pojedini mrežni paket te gledaju samo OSI sloj 3, odnosno sloj na kojemu je prema TCP/IP modelu, IP protokol. IP protokol na svom sloju između ostalih polja ima i polja u kojima se nalaze:
Usmjerivač za svaki primljeni mrežni paket, pristigao na bilo kojem njegovom portu (mrežnom sučelju), prvo provjerava IP zaglavlje i to dio s izvorišnom i odredišnom IP adresom. On potom uspoređuje odredišnu IP adresu sa svojom tablicom usmjeravanja. Na osnovi ove tablice, usmjerivač
usmjerava paket preko onog mrežnog sučelja, preko kojega će paket moći doći do svog odredišta: ili preko drugih usmjerivača ili direktno, sve ovisno o topologiji mreže.
“Distance vector” routing protokoli su jednostavni za konfiguriranje i održavanje. “Distance vector” routing protokoli troše manje resursa. Princip njihovog rada je u tome da svaki router korištenjem “Distance vector” routing protokola obavještava susjedne routere o promjenama, periodički.
“Link-State” routing protokoli s druge strane moraju obavještavati sve routere unutar topologije, o promijenama u mrežama.
“Distance-vector” protokoli su bazirani na kalkuliranju smjera (engl.Direction) i udaljenosti (engl. Distance) do odredišne mreže. Pod smjerom se smatra IP adresa sljedećeg routera (engl. Next Hop) na koji se šalje paket (uz podatak o tome koji je izlazni interface našeg routera). Pod udaljenosti se smatra “cijena” (engl. Cost) do odredišta. Kako se određuje “cijena” ovisi o samom protokolu tj. metrici.
Pr. RIP protokol koristi tkzv. “hop count” do odredišta tj. prebrojavanje routera kroz koje mora paket proći da dođe do odredišta.S druge strane IGRP koristi kašnjenje (engl. Delay) i dostupni Bandwidth do tog odredišta.
Na osnovu svih navedenih parametara Router gradi tkzv. vektore minimalnih udaljenosti do svake mreže u tablicu koja se zove Routing tablica. Proces kada routeri razmjenjuju route i osvježavaju svoje routing tablice se zove konvergencija. Konvergencija “Distance-vector” protokola je veća u odnosu na “Link state” routing protokole (dakle sporiji su).
Primjeri “Distance vector” routing protokola su :
“Link-state” routing protokoli rade tako da svaki router kreira kartu veza svih mreža u kojoj je vidljivo kako su routeri međusobno spojeni odnosno kreira si topologiju mreže.
Tada si svaki router kalkulira najbolje logičke puteve za sva mrežna odredišta, prema kojima se, korištenjem određenih algoritama, kreira routing tablica.
Ovaj proces je prilično zahtjevniji (CPU i RAM) od “Distance vector” routing protokola ali je puno praktičniji za veće mreže te smanjuje konvergenciju uslijed promijena u mrežama.
Routing protokoli ove skupine načelno rade na sljedeći način:
1. Pronalaze se susjedni routeri,
2. Između susjeda se razmjenjuju informacije, periodički ali i u slučajevima kada dolazi do nekih promijena u mreži,
3. Kreira se topologija mreže,
4. Na osnovu topologije mreže se kreira (preračunava) routing tablica
Ono što dodatno čini ove protokole boljima za veće mreže je:
Neki od protokola koji spadaju u ovu kategoriju su :
Zamislimo sljedeću topologiju mreže:
Računalo PC - A želi poslati mrežni paket na računalo PC - B.
Pogledajmo samo dio paketa koji sadrži:
Za sve IP adrese pretpostavljamo Netmask : 255.255.255.0 , pa ga nećemo spominjati.
Što će se dogoditi s paketom, prolaskom kroz Routere na mreži, pogledajmo na slici:
Opis
1. Računalo PC - A želi poslati paket na IP adresu : 172.17.200.1 , pošto to nije IP adresa iz njegove mreže, ono prvo gleda svoju routing tablicu i traži da li ima neku route-u do te mreže, pošto je nema (pretpostavimo da je tako u ovom slučaju), zna da paket mora poslati na Default Gateway : IP : 172.17.100.254 , za koji prvo mora saznati MAC adresu (ovo je destination MAC):
172.17.100.254 te formira paket i šalje ga.
Dakle ovaj paket sadrži IP adresu ovog računala koje ga šalje (Source IP), i također MAC adresu ovog računala (Source MAC) te odredišnu krajnju IP adresu: 172.17.200.1 te kao odredišnu MAC adresu MAC adresu Default Gateway-a.
2. Sada je Default Gateway (Router R1) preuzeo paket, on gleda svoju routing tablicu i na osnovu nje (ili ako nema route-u, ide na svoju default route-u [0.0.0.0 0.0.0.0]), koja u našem slučaju pokazuje na Router R2 priprema paket tako da zadržava Source i Destination IP adrese ali kao Source MAC stavlja svoju MAC adresu a kao Destination MAC , MAC adresu od Routera R2 tj. od njegove mrežne kartice s kojom ima direktnu vezu. Te šalje takav paket na njega.
3. Sada Router R2 preuzima paket, on gleda svoju routing tablicu i na osnovu nje (ili ako nema route-u, ide na svoju default route-u [0.0.0.0 0.0.0.0]), koja u našem slučaju pokazuje na krajnje (odredišno) računalo PC - B. Jer je to računalo direktno na njegovoj mreži. Potom priprema paket tako da zadržava Source i Destination IP adrese ali kao Source MAC stavlja svoju MAC adresu a kao Destination MAC , MAC adresu od krajnjeg računala PC - B tj. od njegove mrežne kartice čiju MAC adresu poznaje - ako ju ne poznaje traži ju pomoću ARP zahtjeva. Kada su sve MAC adrese poznate šalje se paket na odredište : PC - B.
Važno za napomenuti je da svaki paket sadrži i neke konkretne podatke i viši protokol ali to smo u ovom primjeru zanemarili zbog fokusa na IP i MAC adrese i onoga što se s njima dešava u prijenosu kroz mrežu.
Zbog potrebe za razumjevanjem rada mreža, potrebno je okvirno shvatiti način rada osnovnih mrežnih servisa odnosno protokola.
TFTP (Trivial File Transfer Protocol) i FTP (File Transfer Protocol) naizgled izgledaju isti ili barem vrlo slični. Zapravo se radi o dva prilično različita protokola kojima je jedino zajedničko to što se koriste za prijenos datoteka preko mreže. Ovdje prestaju sve sličnosti. Pogledajmo o čemu se radi.
Trivial File Transfer Protocol (TFTP) je vrlo jednostavan protokol za razmjenu datoteka preko mreže. Točnije rečeno omogućava klijentskoj strani da uzme (engl. Get) ili pošalje (engl. Put) datoteku sa ili na TFTP poslužitelj.
Dakle logika rada je Klijent ← → Poslužitelj.
Najčešća dva primjera upotrebe ovog protokola su:
1.Korištenje za instaliranje (kopiranje) operativnog sustava, koji se u pravilu nalazi na jednoj datoteci, na neki uređaj (ili tkzv. “Flash”-iranje).
2.Za pokretanje ili instaliranje operativnog sustava perko mereže (o ovoj metodi kasnije).
Zbog čega upravo TFTP ?
Zbog toga što je TFTP vrlo jednostavan za implementaciju te sama implementacija zahtjeva vrlo malo prostora za pohranu Dakle stane i u vrlo male Flash memorije, čak na flash memoriju same mrežne kartice. TFTP protokol koristi UDP protokol za transport, što ga čini nezahtjevnim i brzim ali neotpornim na greške. Zbog navedene namjene sigurnost u prijenosu nije bitna jer preko njega se u praksi šalje tek nekoliko datoteka a postoji i dodatni mehanizam zaštite.
TFTP koristi UDP port 69
Kako radi prijenos podataka - malo detaljnije:
Prijenos podatak pokreće klijentska strana, tražeći čitanje (engl. Read) ili zapisivanje (engl. Write) određene datoteke na TFTP poslužitelju. Ako je poslužitelj odobrio zahtjev datoteka se razlama u blokove od 512 byte-a (standardno), iako je moguće da se dvije strane dogovore za drugu veličinu, te se šalje u jednom UDP paketu (kako ne bi bilo potrebe raditi dodatnu fragmentaciju paketa). Svaki poslani paket se potvrđuje slanjem potvrdnog paketa (engl. Acjnowledge). U slučaju da neki paket nij epotvrđen, on se ponovno šalje. Ako se ipak paket izgubi u mreži tj. nikada ne dođe na odredište, čeka se da istekne vremenski okvir za slanje (engl. Timeout) te pošiljatelj (TFTP poslužitelj) ponovno šalje paket. Na kraju kada su svi paketi poslani, šalje se paket koji je obično veličine manje od 512 byte-a tj. manje od onolike veličine koja je dogovorena za slanje. Taj paket završava prijenos.
File Transfer Protocol (FTP) je mrežni protokol za prijenos datoteka preko mreže. On za razliku od TFTP protokola koristi TCP protokol za prijenos te se samim time i oslanja na provjeru integriteta podataka od strane TCP protokola. Najčešće se koristi za prijenos jedne ili veće količine datoteka u lokalnim mrežama (LAN) ili preko interneta (WAN mreže).
FTP također radi po principu : Klijent ← → Poslužitelj.
Kod njega je specifično i to da koristi dva kanala u komunikaciji: Jedan za kontrolni promet i samu vezu Drugi za prijenos podataka.
Kod spajanja na FTP poslužitelj može se raditi i autentikacija korisnika po principu slanja : korisničko ime i lozinka ali nekriptirano. Dakle moguće je praćenjem paketa na mreži vidjeti korisničko ime i lozinku u čistom tekstualnom obliku. Osim toga moguća je i upotreba tkzv. “Anonimous” korisnika, ako je tako konfigurirano na poslužiteljskoj strani.
Za osiguranje sigurnosti prijenosa podataka često se koristila okmunikacija kroz neki SSL ili TLS kanal koij je kriptirao promet. U današnje vrijeme, često je zamijenjen sa SSH File Transfer Protokolom (SFTP) ako je potrebna sigurna razmjena podataka.
FTP koristi TCP port 20 za podatke (engl. Data)
FTP koristi i TCP port 21 za kontrolu (engl. Command)
Kako radi prijenos podataka korištenjem FTP protokola?
FTP može raditi u Aktivnom (engl. Active) ili pasivnom modu rada (engl. Passive), o kojima ovisi kako će se konekcija ostvariti.
O oba slučaja klijentska strana kreira TCP kontrolnu vezu (TCP destination port 21), s time da je TCP Source port odabran standardnom metodom : 1024+slučajan broj=source port (nazovimo ga X).
U aktivnom modu rada klijent čeka dolazeću “Data” konekciju na portu X+1 sa poslužitelja i šalje FTP poruku poslužitelju da očekuje poruku na portu br. : X+1 , tada se ostvaruje nova konekcija (TCP Three Way Handshake).
Ako je klijent iza nekog Firewall uređaja, ovakav način rada nije moguć te se mora koristiti “Passive” mod rada.
U pasivnom modu rada klijent koristi kontolnu konakciju za slanje “PASV” naredbe poslužitelju (zahtjeva prebacivanje u pasive mod rada) i dobiva od njega TCP port koji će koristiti kao destination port (pruka koju prima je “Passive Port : Y”) tj. Y je broj porta koji mu poslužitelj dodjeljuje, uz njegovu IP adresu (poslužitelja).Konkretno dobiva nazad poruku “Passive IP Address=a.b.c.d” tj. konkretnu IP adresu poslužitelja.
Sada klijent otvara konekciju na poslužitelj s IP adresom koju mu je on dao (a.b.c.d) na destination port koji mu je također poslao (Y) a kao source port postavlja X+1 i TCP konekcija se uspostavlja (TCP Three Way Handshake)
Slika: Pasivni mod rada:
Konekcije se zatvaraju standardno za TCP protokol.
Bootstrap Protocol (BOOTP) se koristi za dodjeljivanje IP addrese mrežnom uređaju (računalu, poslužitelju. itd.) sa Bootp poslužitelja. BOOTP je izvorno opisan u RFC 951. Ova osnovna funkcionalnost se sada koristi preko DHCP (Dynamic Host Configuration Protocol) protokola koji podržava i BOOTP mogućnosti.
BOOTP koristi UDP protokol za transport, port 67
Kako to radi ?
Metoda 1
S obzirom na činjenicu da je danas u skoro svaku mrežnu karticu ugrađen BOOTP klijent te TFTP klijent u BIOS mrežnih kartica, moguće je podizanje odnosno instalacija operativnog sustava pomoću BOOTP i TFTP protokola već sa mrežne kartice. Ova metoda korištenja mrežne kartice za pokretanje i/ili instalaciju operativnog sustva preko mreže se zove i Preboot eXecution Environment (PXE).
Dakle kod upotrebe BOOTP protokola za pokretanje ili instalaciju operativnog sustava preko mreže:
1.Računalo se uključuje i podiže se PXE Boot dio sa mrežne kartice
2. BOOTP ili u današnje vrijeme DHCP klijent ugrađen u BIOS mrežne kartice traži IP adresu od BOOTP/DHCP poslužitelja
3. BOOTP mu daje IP adresu, te lokaciju Boot managera i IP adresu sa URL-om gdje se nalazi
4. Računalo/mrežna kartica podiže TFTP klijent koji preko TFTP protokola kopira Boot Manager, koji se tada učitava u memorijui preko TFTP-a dohvaća konfiguracijsku datoteku u kojoj su popisani parametri potrebni za sljedeći korak.
5. Boot manager se učitao u memoriju računala (RAM) te podiže najosnovnije mogućnosti rada da pročita konfiguracijsku datoteku u kojoj je upisana lokacija kernela operativnog sustava (koji mora sadržavati i upravljački program [engl. Driver]) za neki brži i pouzdaniji protokol za prijenos datoteka perko mreže (Pr. FTP / SAMBA/CIFS / NFS / …)
6. Pomoću TFTP-a se dohvaća kernel operativnog sustava te se učitava u memoriju , on si otvara konekciju na poslužitelj preko nekog od pouzdanijih protokola za prijenos datoteka (Pr. FTP / SAMBA/CIFS / NFS / …) te ovisno o operativnom sustavu koji je pohranjen na poslužitelju nastavlja sa učitavanjem operativnog sustava kao da se nalazi na nekom instalacijskom mediju (pr. DVD-ROM ili sl.)
Dalje se sve odvija kao da je instalacija ili korištenje Novog operativnog sustava lokalno sa DVD-ROM-a ili lokalnog tvrdog diska.
Ova metoda se koristi i za tkzv “Diskless” klijente dakle računala koja nemaju svoj tvrdi disk već sve učitavaju preko mreža sa poslužitelja.
Metoda 2 (manje se koristi)
Kada se računalo starta i podigne operativni sustav, sustav šalje BOOTP poruku (Broadcast ti poruke) na mrežu i traži da mu se dodjeli IP adresa. BOOTP poslužitelj pogleda u svoju tablicu slobodnih (neiskorištenih) IP adresa i dodjeljuje ovom računalu IP adresu.
Dynamic Host Configuration Protocol (DHCP) je protokol sličan BOOTP protokolu ali sa naprednijim mogućnostima. Dakle DHCP protokol podržava punu funkcionalnost BOOTP protokola uz dodatne funkcionalnosti koje nudi. Koristi se za automatsku konfiguraciju mrežnih IP parametara na strani klijenta, poput IP adrese i Netmaska, Default Gateway-a, DNS poslužitelja i mnogih drugih parametara.
Protokol funkcionira po principu : Klijent ← → Poslužitelj
DHCP (kao i BOOTP) koristi UDP protokol za transport, port 67
DHCP se koristi u svim modernim mrežama, počevši od kućnih mreža, mreža u malim i većim tvrtkama sve do najvećih mreža u najvećim korporacijama i internet providerima (ISP).
Kako radi DHCP ?
Kada se računalo pokrene i učita se operativni sustav, DHCP klijent na računalu šalje na mrežu DHCP upit (engl. DHCP Query), koji je po tipu Broadcast poruka (svi ju primaju).
DHCP poslužitelj na mreži zaprima zahtjev, pregledava svoju tablicu sa listom IP adresa (engl. Pool) i nalazi prvu slobodnu (neiskorištenu) IP adresu + Netmask te čita ostale konfiguracijske parametre koji su aktivirani, pr.:
DHCP poslužitelj može biti konfiguriran da određeni parovi IP adresa + MAC adresa budu rezervirani. Na taj način će DHCP klijenti koji imaju rezervaciju svaki puta dobiti istu IP adresu.
DHCP poslužitelj ima definirano i i maksimalno vrijeme koje vrijedi za svaku IP adresu koju je dodjelio (engl Lease Time). Kada to vrijeme istekne klijent ponovno traži obnavljanje te iste IP adrese te mu poslužitelj odgovara po istom principu. “Lease time” je isto jedna od opcija (standardna) za DHCP.
Nakon toga DHCP poslužitelj šalje DHCP klijentu direktno (unicast) poruku, sa svim parametrima koji su bili aktivirani. Potom DHCP klijent konfigurira mrežu na osnovu parametara koje je primio od strane DHCP poslužitelja.
Kako detaljno izgleda proces komunikacije DHCP klijent ← → DHCP poslužitelj možete vidjeti na slici:
U svim TCP/IP mrežama, a to su gotovo sve današnje računalne mreže, za komunikaciju između računala u mreži koriste se IP adrese, kao jedinstveni identifikatori svakog računala ili uređaja na mreži. U starijim i manjim mrežama, u kojima nam je bila poznata svaka IP adresa, svakog računala u mreži, ponekad je bilo jednostavnije pristupati im pomoću njihove IP adrese. S obzirom kako su IP adrese, poput 192.168.100.234, nama ljudima, ne baš previše pamtljive, uvelo se posredovanje u pristupu mrežnim uređajima i računalima, pomoću imena računala, a koje nam je znatno pamtljivije, poput : server1, marko, ivan i slično. I dalje je na nižoj razini mrežne komunikacije sve ostalo na IP adresama, ali smo na višoj razini, odnosno u aplikacijama, mogli koristiti imena računala (Engl Hostname), jer nam je to pamtljivije. Kako mrežna komunikacija i dalje koristi IP adrese, potrebno je nekako povezati ime računala s njegovom IP adresom. Prvi i najjednostavniji način mapiranja između IP adrese i imena računala, je ubacivanjem svakog pojedinog imena računala i njegove pripadajuće IP adrese u posebnu tablicu, odnosno datoteku, koja se zove host datoteka.
U Windows operacijskim sustavima ova datoteka se nalazi na : C:\Windows\System32\drivers\etc\hosts, dok se na Unix/Linux operacijskim sustavima nalazi u: /etc/hosts. Naime u svaki novi red ove datoteke morali bi upisati svako pojedino računalo na mreži, kako bi mu mogli pristupati pomoću imena a ne samo pomoću IP adrese.
Unosi u ovoj datoteci izgledaju ovako:
192.168.100.50 marko 192.168.100.51 ivan ... 192.168.100.234 server1 ...
Samo računalo, svaki puta, kada bi pristupalo drugom računalu na mreži, pomoću imena tog računala, tražilo bi prvo u ovoj datoteci njegovu IP adresu, kojoj bi na kraju i pristupilo.
Razvojem i širenjem mreža, a pogotovo razvojem interneta i pristupanjem računalima na internetu, ovakav način, upisivanjem svakog pojedinog računala i njegove IP adrese je očito postao nemoguć. Stoga se uveo poseban servis odnosno mrežni protokol, koji bi svako računalo moralo kontaktirati, kako bi saznalo IP adresu računala, kojem želimo pristupiti. Ovaj protokol se zove DNS (Engl. Domain Name System). Dakle DNS servis se kontaktira svaki puta kada želimo saznati IP adresu nekog računala na mreži, kojemu želimo pristupiti, koristeći njegovo ime računala (hostname).
Domain Name System (DNS) protokol je hijerarhijski, distribuirani imenični sustav koji barata s imenima odnosno nazivima (engl. Naming) a koristi se za imena računala, servisa ili drugih resursa na mreži. DNS povezuje ime računala s njegovom pripadajućom IP adresom, koja je osnovni element u mrežnoj komunikaciji. Dakle DNS kontaktiramo kada želimo saznati IP adresu na osnovi imena računala (FQDN - Fully qualified domain name) u mreži. Dodatno, kako bi bilo lakše pamtiti imena računala, prema njihovoj državi, namjeni, upotrebi, tvrtki, instituciji i drugim parametrima, uvedene su takozvane domene.
Domena je hijerarhijska struktura naziva koja počinje od vršne domene . hijerarhijski prema dolje.
Drugim riječima ime domene predstavlja poziciju unutar DNS hijerarhije. Domena se sastoji od liste svih domena, počevši od vršne domene sve do najdonje u hijerarhiji, odvojenih točkom . .
Kod ovakvog hijerarhijskog DNS sustava, raspoređuju se odgovornosti za svaku pojedinu domenu, na takozvani autoritativni DNS poslužitelj koji je odgovoran za svaku određenu domenu. Dakle svaka domena mora imati svoj autoritativni DNS poslužitelj (ili više njih).
Autoritativnim imeničkim serverima je pripisana odgovornost za svoju točno određenu domenu i po redu se mogu pripisati drugi imenički serveri za njihove poddomene. Ovaj mehanizam je izgradio DNS kao raspoređen i tolerantan na greške i pomogao je u izbjegavanju potrebe za jednim jedinstvenim registrom koji bi se trebao neprestance konzultirati i ažurirati. Dodatno, odgovornost za održavanje i ažuriranje glavnog zapisa (master record) za domene je raširena među mnogim registrima domenskih imena, koji se nadmeću za obavljanje posla krajnjeg korisnika (vlasnika domene). Domene se mogu pomicati iz registra u registar u bilo koje vrijeme.
DNS imenički poslužitelj je poslužitelj koji sprema DNS zapise za domenska imena, kao što su adresni (A ili AAA) zapisi, imenički serverski (NS) zapisi te zapis poslužitelja elektroničke pošte (MX). DNS imenički server odgovara na upit iz svoje baze podataka. (Izvor: https://hr.wikipedia.org/wiki/Domenski_sustav_imena)
Osnovna funkcionalnost DNS sustava je prevođenje lako pamtljivih domenskih imena u numeričke IP adrese.
DNS koristi u većini slučajeva UDP protokol za transport, port 53
Komunikacija je tipa : klijent ← → poslužitelj.
U nekim slučajevima se koristi TCP protokol za transport :
Kako izgleda domenska hijerarhija:
1. Postoji korijenska domena na vrhu .
2. Postoje takozvane ”Top level“ odnosno vršne domene, koje su točno definirane i ne mogu se mijenjati:
| Domena | Tko ju koristi |
| .com | Komercijalne organizacije |
| .org | Neprofitne organizacije |
| .edu | Edukacijske organizacije |
| .gov | Državne agencije |
| .mil | Vojne organizacije |
| .net | Organizacije koje se bave mrežama |
| … | … |
Osim ovih vršnih domena, prema namjeni, postoje i vršne domene, koje predstavljaju države svijeta, poput:
| Domena | Država |
| .us | Sjedinjene Američke države (SAD) |
| .hr | Hrvatska |
| .de | Njemačka |
| .uk | Velika Britanija |
| … | … |
3. Ispod njih postoje pod domene, kao i njihove pod domene, pod pod domene i tako dalje.
Svaki puta kada primjerice preko našeg web preglednika otvaramo stranicu na adresi : www.redhat.com događa se slijedeće:
1. Naš web preglednik kontaktira prvi DNS poslužitelj koji mu je konfiguriran i pita ga tko zna IP adresu od : www.redhat.com
⇒ Zapravo svaka adresa izgleda ovako (završava s točkom) www.redhat.com.
2. Nama prvi DNS poslužitelj, provjerava u svojoj bazi da li on može odgovoriti, ako ne, on kontaktira prvi vršni DNS u hijerarhiji, koji je odgovoran za vršnu domenu .com. Ako ovaj, nama prvi DNS, ne zna IP adresu DNS poslužitelja za vršnu domenu .com, on potom mora kontaktirati, neki od vršnih korijenskih odnosno “root” poslužitelja za ., domenu, a koji moraju imati IP adrese svih vršnih poslužitelja:
Naš DNS poslužitelj potom postavlja upit DNS poslužitelju za .com domenu, a on gleda u svoju bazu i daje nam IP adresu od DNS poslužitelja odgovornog za pod domenu, koju smo tražili - točnije za .redhat domenu.
3. Naš DNS poslužitelj potom šalje upit na DNS poslužitelj od tražene pod domene .redhat, kojeg se potom pita koja je IP adresa poslužitelja, imena www.redhat.com. On našem web pregledniku potom daje IP adresu (pr. to je IP : 209.132.183.105 ).
4. Sada kada naš web preglednik zna kako je adresi računala www.redhat.com pripadajuća IP adresa: 209.132.183.105, na koju se potom i spaja.
Važno za znati je kako DNS poslužitelji, svaki puta kada saznaju za nove domene i vršne DNS poslužitelje odgovorne za njih, taj podatak čuvaju u svojoj privremenoj memoriji (cache) sve dok ne istekne vremenski period koji je definiran za svaku domenu na svakom poslužitelju. U praksi se radi o vremenima od minimalno nekoliko sati. Stoga ako dođe do neke promijene u nekoj domeni, potrebno je prilično dugo vremena (nekada i 24.h.) da toga budu svijesni svi DNS poslužitelji. Ovo osvježavanje odnosno njegovo namjerno kašnjenje se zove propagacija.
U slučaju kada tražimo podatak o računalu u našoj mreži: pr. server1.nasadomena, naš DNS poslužitelj (ako ga imamo na lokalnoj mreži) koji je odgovoran za tu domenu će nam vratiti IP adresu : pr.: 192.168.100.100, koja će se u pozadini koristiti za komunikaciju.
Sintaksa domenskih imena
Domensko ime se sastoji od jednog ili više dijelova, koje se tehnički zovu oznake, koje su dogovoreno ulančani odvojeni točkama kao: www.redhat.com, pri tome:
.com) prenosi vršnu domenuredhat poddomena, domene .comwww je poddomena, domene redhat
Postoje i određena ograničenja i pravila DNS standarda:
www.redhat.com i redhat.com su također imena računala, ali com domena nije.
Telnet, kao i noviji SSH protokol omogućavaju nam pristup na komandno linijsko sučelje (shell) udaljenog računala (poslužitelja). Većina operativnih sustava ima svoju implementaciju Telnet protokola za udaljeni pristup ali zbog njegovih poznatih sigurnosnih problema, u današnje vrijeme, većinom se prešlo na upotrebu SSH protokola.
Prvo ćemo se ukratko upoznati s telnet protokolom.
Kao što sam rekao telnet omogućava pristup komandno linijskom sučelju udaljenih računala odnosno pristupom na viirtualni terminal udaljenog telnet poslužiteljskog mrežnog servisa.
Telnet također radi na principu : klijent ← → poslužitelj.
Telnet kao transportni protokol koristi TCP, na portu 23
Telnet se kao protokol razvijao od 1968 godine. U to vrijeme najviše se koristio u akademskoj zajednici ali najveću primjenu doživio je početkom 1990. godina, sve većim korištenjem interneta. S obizorom da su se ljudi sve više spajali na udaljena računala ili poslužitelje pomoću telnet-a, sve više je bilo i pokušaja zloupotrebe. Stoga se sve više pažnje počelo posvećivati sigurnosti. Zbog sigurnosnih problema i to najviše činjenice što se sav promet preko telnet protokola prima i šalje u čistom tekstualnom nekriptiranom formatu (uključujući i ime korisničkog računa i lozinke). telnet se počeo zamjenjivati sa puno sigurnijim SSH protokolom.
Pošto telnet radi po pricipu klijent ← → poslužitelj, na strani poslužitelja, potrebno je pokrenuti telnet poslužitelj a na strani klijenta, neki od telnet klijenata, poput PuTTY i drugih programa.
SSH se koristi za udaljeni pristup na komandnolinijsko sučelje (engl. shell) Secure Shell odnosno (SSH) je mrežni protokol, koji koristi kriptiranje podataka koji se primaju i šalju, za razliku od telnet protokola koji kao što smo rekli , nije siguran za komunikaciju, pogotovo preko interneta.
SSH tako]er radi na principu: klijent ← → poslužitelj.
SSH kao transportni protokol koristi TCP, na portu 22.
Postoje verzije 1 i 2 (poznate kao: SSH-1 i SSH-2) od kojih se verzija 2 najviše koristi.
SSH je zamišljen kao zamjena za telnet.
SSH koristi (pouzdane) kriptografske algoritme za kriptiranje podataka koji prolaze između klijenta i poslužitelja.
SSH koristi tkzv. sustav javnog ključa (engl. Public Key), koji se često naziva i asimetričnom kriptografijom.
Princip rada kriptiranja sustavom javni + privatni ključ je takav da :
1. Obije strane u komunikaciji kreiraju svoj par : javni + privatni ključ. Privatni ključ se čuva i ne daje nikome.
2. Jedna strana kriptira podatke s javnim ključem od druge strane, koji mu druga strana nudi.
3. Druga strana može dekriptirati sadržaj samo sa svojim privatnim ključem.
Kod SSH osnovni sistem rada je prema tome kreiranje para: javni + privatni ključ, tada se ti ključevi koriste za kriptiranje veze, uz potrebu kako bi se korisnik identificirao sa kombinacijom: korisničko ime i lozinka. Pri tome su korisničko ime i lozinka od sustava a ne posebno kreirani od strane SSH servisa. Ovo je najčešća metoda rada.
Druga metoda rada je kreiranje para ključeva : javni i privatni na obije strane (klijent i poslužitelj).Javni ključ (engl. Public key) se ručno mora kopirati s klijenta na poslužitelj i poslužiteljev javni ključ na klijentsku stranu.
Privatni ključevi se nikada ne razmjenjuju !.
Autentikacija se tada određuje upotrebom privatnih ključeva. Privatni ključevi se nikada niti na koji način ne kopiraju preko mreže u procesu autentikacije niti u bilo kojem drugom procesu rada. Kod prve konekcije se lokalno pohranjuje javni ključ koji se veže za IP / Hostname udaljene strane i koji služi za provjeru identiteta druge strane. Naime u slučaju kada se promijeni javni ključ koji se veže za IP/Hostname znači da je došlo do nekih potencijalno sigurnosno problematičnih stvari te se ta konekcija neće ostvariti.
Ova metoda omogućava spajanje na drugi sustav bez potrebe za unošenjem kombinacije : korisničko ime i lozinka, već se veza automatski kriptira (šifrira) u pozadini.
SSH verzija 2 se danas najviše koristi jer je donjela:
Svi primjeri i objašnjenja koja slijede, vrijede za Red Hat bazirane Linux distribucije. Mi ćemo koristiti CentOS Linux distribuciju.
Na drugim distribucijama linuxa koje su bazirane na Debian ili Slackware Linuxu, konfiguracija se malo razlikuje ali je koncept isti.
Konfiguracija osnovnih mrežnih parametara koja je zajednička za sve (ili barem) većinu distribucija linuxa je konfiguracija dostupnih DNS poslužitelja i parametara vezanih uz njih (/etc/resolv.conf) te konfiguracija mapiranja tj. razriješavanja (engl. Resolving) imena računala (engl. Hostame) u IP adrese (/etc/hosts).
/etc/hosts
Unutar ove datoteke nalaze se mapiranja iz IP adrese u hostname , za svako računalo za koje nije moguće na neki drugi način razriješiti IP adresu iz naziva računala (hostname). Jedino što mora postojati unutar ove datoteke je unos za loopback interface (127.0.0.1), sljedećeg oblika
127.0.0.1 localhost.localdomain
Pogledajte A klasu mreža (vezano za loopback IP adresu)
Ako želimo dodati unos za neko računalo zbog bilo kojeg razloga (pr. nema unos na DNS poslužitelju ili uopće nemamo DNS u svojoj mreži), sintaksa je :
IP Adresa Hostname
Pr. Računalo imena : server1 i IP adrese : 192.168.1.10 želimo dodati kao novi unos, u novi red ćemo dodati sljedeće:
192.168.1.10 server1
/etc/resolv.conf
Unutar ove datoteke nalazi se popis DNS poslužitelja na koje se naš sustav može/mora spojiti te popis domena koje se pretražuju. Dakle ovdje se nalaze upute za “default” pretraživanje za određenu domenu ili domene. Naime kada se pretražuje ime računala bez navedenog imena domene (tkzv. FQDN : fully qualified domain name) u ovoj datoteci je definirano koje ime domene će sustav automatski nadodati na hostname.
Što je FQDN ime ?
Ako želimo pristupiti računalu čije ime (hostname) je server1 i želimo da nam se hostname poveže sa IP adresom (jer za komunikaciju nam je potrebna IP adresa) a nismo napravili unos u /etc/hosts već želimo da to razriješi DNS poslužitelj u kojemu je napravljen unos za naš poslužitelj server1, potrebno nam je i puno ime s domenom (uz IP adresu DNS poslužitelja koju ćemo ubrzo dodati).
Ako je naša domena lab.os onda ili moramo koristiti puno ime (FQDN) : server1.lab.os ili ovu domenu moramo dodati kako bi se automatski nadodala na hostnameove koji su bez imena domene.
I to ovako - slijedi jedan red/linija u /etc/resolv.conf:
search lab.os
Osim ovoga moramo navesti i IP adrese našeg DNS poslužitelja u kojem su unosi za naša računala i za sva ostala računala na mreži. Ako je naš DNS server na IP adresi : 192.168.1.200 tada će sljedeći red izgledati ovako:
nameserver 192.168.1.200
Pošto je ovo mjesto gdje moramo definirati i sve ostale DNS poslužitelje koje koristimo na/za internetu, moramo dodati i njih (dodati ćemo dva DNS poslužitelja od našeg ISP providera):
nameserver 195.29.166.116 nameserver 195.29.166.117
Na ovaj način DNS “resolving” će nam raditi i prema internetu.
Kod svake (TCP/IP) mrežne komunikacije između dva krajnja računala, u pozadini sustav uvijek mora saznati iz imena krajnjih računala (hostname) njihove IP adrese !.
/etc/sysconfig/network
U ovoj datoteci se definiraju informacije za cijelo računalo, koje se tiću Routinga i samog računala, što važi za sve mrežne interface-a tj. za sve mrežne kartice u računalu.
Najčešće se koriste sljedeći parametri:
NETWORKING=VRIJEDNOST
VRIJEDNOST može biti :
yes — Mreža će biti konfigurirana.no — Mreža neće biti konfigurirana.
HOSTNAME=VRIJEDNOST
VRIJEDNOST može biti :ime računala (hostname) ali se preporuča ime računala s domenom (Fully Qualified Domain Name)
GATEWAY=VRIJEDNOST
VRIJEDNOST je IP adresa Default Gaetway-a za ovo računalo.
NOZEROCONF=VRIJEDNOST
VRIJEDNOST može biti :. * ''yes'' — "zeroconf" se neće koristiti --> ovo je standardno. * ''no'' — "zeroconf" će se koristiti.
“ZEROCONF” je mogućnost kako bi se kod podizanja sustava koristila IP adresa iz određenog opsega adresa (169.254.0.0) bez potrebe za konfiguracijom mrežne kartica.
!! Ovo se ne koristi za 99.99999% slučajeva!!
Primjer kako bi izgledala ova konfiguracijska datoteka da je konfiguracija našeg računala sljedeća:
Hostname : desktop1
Default Gateway IP : 192.168.1.254
NETWORKING=yes HOSTNAME=desktop1 GATEWAY=192.168.1.254 NOZEROCONF=yes
Datoteka /etc/sysconfig/network je mjesto za definiranje imena računala i IP adrese Default Gateway-a te aktiviranje/deaktiviranje mreže globalno na računalu.
/etc/sysconfig/network-scripts/ifcfg-<IME-MREŽNE-KARTICE>
Konfiguracija svake mrežne kartice nalazi se u datoteci poput ove :
/etc/sysconfig/network-scripts/ifcfg-<IME-MREŽNE-KARTICE>
Prije nego krenemo s detaljnom konfiguracijom mreže u linuxu, bilo bi dobro razumjeti mrežni model.
Mrežni model u Linuxu se sastoji od nekoliko komponenti, kao što je vidljivo na dijagramu:
Komunikacija između aplikacije i svake druge komponente odvia se u slojevima.
Netlink sloj je specifičan po tome što se koristi za prijenos informacija između kernel i user-space procesa. Dakle on je interface između user space procesa i internih funkcija kernela prema kernel modulima (upravljačkim programima za mrežne kartice) i drugim dijelovima kernela zaduženim za mrežu.
Specifičnost cijelog mrežnog sustava u odnosu na ostale sustave poput diskovnog je i u tome što se mrežni uređaji NE nalaze u /dev/ direktoriju gdje se inaće nalaze svi uređaji.
Listu svih mrežnih uređaja možemo vidjeti unutar direktorija /proc/net/dev a njihovu konfiguraciju i sve statistike unutar /sys/class/net/ direktorija.
Vratimo se na specifičnosti mrežnog podsustava u odnosu na druge podsustave.
Mrežna komunikacija je puno složenija od primjerice diskovne, koja se svodi na operacije čitanja (engl read) ili zapisivanje (engl. write) na disk a dodatno se ne čitaju ili ne zapisuju byte-i podataka fiksne veličine, već paketi, jasno je da je cijeli mrežni model puno kompleksniji odnosno zahtjeva kompleksnije mehanizme za rad.
Dakle prema mrežnom interface-u bi se slali cijeli paketi a isto tako bi se trebali i čitati paketi podataka kroz određeni međuspremnik (engl. buffer) koji bi u određenim trenucim mogao biti premali te bi se paketi koji ne bi stali u spremnik tada izgubili. Stoga se za mrežnu komunikaciju uopće ne koristi ovakav način komunikacije, već komunikacij preko ioctl (input/output control) funkcija odnosno mehanizama.
Naredbe iz paketa net-tools, poput naredbe ifconfig ne komuniciraju s Linux kernelom preko netfilter-a, stoga imaju razna ograničenja. Jedno od njih je nemogućnost naredbe ifconfig da dodjeli više od jedne IP adrese na jedan mrežni interface (pr. eth0), već samo na podinterface [pr.: eth0:0] (engl. Subinterface). Istovremeno novija generacija alata iz paketa iproute2, poput naredbe ip nema takvih problema, te uredno može dodjeliti ili ispisati sve IP adrese na svakom mrežnom interface-u.
Standardno, mrežne kartice u Linuxu se nazivaju na sljedeći način:
| Ime mrežne kartice | Opis |
| eth0 | Prva mrežna kartica |
| eth1 | Druga mrežna kartica |
| eth2 | Treća mrežna kartica |
| eth3 | Četvrta mrežna kartica |
| … | … |
Osim standarnih mrežnih kartica, moguće je koristiti i podkartice (subinterface), koje se vežu na postojeću fizičku mrežnu karticu i ponašaju se kao zasebne mrežne kartice, za koje je potrebno definirati sve parametre mreže.
| Ime mrežne kartice | Opis |
| eth0:0 | Prva podkartica na prvoj mrežnoj kartici |
| eth0:1 | Druga podkartica na prvoj mrežnoj kartici |
| … | … |
| eth1:0 | Prva podkartica na drugoj mrežnoj kartici |
| eth1:1 | Druga podkartica na drugoj mrežnoj kartici |
| … | … |
Podkartice (engl. Subinterfaces) uočljive su po tome što u nazivu imaju dodatak na fizičku mrežnu karticu :Broj.
Primjerice na eth0 prva podkartica je 0 tj. eth0:0
Moguća je i upotreba VLAN mrežnih kartica. One moraju pripadati fizičkoj mrežnoj kartici, podkartici (ili nekom drugom vršnom tipu kartice).
VLAN mrežne kartice označavaju se s točkom ., na postojeću mrežnu karticu. Pr, VLAN 14 na eth0 bi izgledao ovako:
eth0.14. One se ponašaju kao i fizičke mrežne kartice i za njih je potrebno konfigurirati sve parametre mreže.
Primjer VLAN kartica koje se vežu na fizičku mrežnu karticu, za VLAN 44
| Ime mrežne kartice | Opis |
| eth0.44 | VLAN br. 44 na prvoj mrežnoj kartici eth0 |
| eth1.44 | VLAN br. 44 na drugoj mrežnoj kartici eth1 |
| … | … |
Primjer VLAN kartica koje se vežu na podkarticu (subinterface) fizičke mrežne kartice, za VLAN 44
| Ime mrežne kartice | Opis |
| eth0:0.44 | VLAN br. 44 na prvoj mrežnoj kartici eth0, i to na njenoj prvoj podkartici |
| eth0:1.44 | VLAN br. 44 na prvoj mrežnoj kartici eth1 i to na njenoj drugoj podkartici |
| … | … |
Osim navedenih tipova postoje i drugi tipovi logičkih mrežnih kartica poput:
eth0 , eth1, ethN) u jednu logičku mrežnu karticu (Cisco terminologija je Ether Channel).
Nazivi za “Bonding” kartice su : bond0 , bond1 , … bondN.
Na “bonding” mrežne kartice moguće je kreirati podkartice (subinterface) i također VLAN kartice. Za svaku od tih svih logičkih mrežnih kartica moraju se konfigurirati svi mrežni parametri (IP adresa, Netmask, …).
Nazivi “Bridge” mrežnih karticu su: br0 , br1 , … brN.
Na “bridge” mrežne kartice moguće je kreirati podkartice (subinterface) i također koristiti VLAN-ove unutar bridge-a. Za svaku od tih svih logičkih mrežnih kartica moraju se konfigurirati svi mrežni parametri (IP adresa, Netmask, …).
U novije vrijeme, pojavio se i novi način označavanja, zbog sustava s većim brojem mrežnih kartica te potrebe da se iz naziva može vidjeti gdje je ta kartica spojena:
Nazivi ovih mrežnih kartica su (čisto informativno):
| Ime mrežne kartice | Opis |
| em1, em2 , em3 , … emN | “on-board” - na matičnoj ploči |
| p1p1 , p1p2 , … pxpy | Za pr. PCI : p(broj PCI sabirnice)p(broj PCI porta) |
| … | … |
Ovaj novi način označavanja (koji se i ne koristi previše), nećemo koristiti u daljem radu (primjerima).
Konfiguraciju mrežnih parametara svake mrežne kartice možemo odraditi statički (ručno) ili dinamički preko DHCP poslužitelja. Pod mrežnim parametria podrazumjevamo konfiguraciju:
Ručno se konfiguracija odrađuje preko naredbe ífconfig ili novije naredbe ip.
Mi ćemo se bazirati na ručnoj konfiguraciji pomoću naredbe ífconfig.
Statička konfiguracija može biti privremena (do sljedećeg restarta) ili trajna (permanentna).
Privremena konfiguracija s naredbama ifconfig ili ip
Pomoću naredbe ifconfig (engl. Interface Configuration) možemo napraviti privremenu konfiguraciju mrežne kartice odnosno parametara mreže, mrežne kartice.
Istoimenu naredbu koristimo i kada želimo samo vidjeti (ispisati) trenutnu konfiguraciju mrežnih kartica.
Razvojem mrežnog modela linux kernela i novih funkcionalnosti, konfiguracija mreže s naredbom ifconfig se sve manje koristi jer nosi za sobom mnoga nasljeđa prošlosti koja je gotovo nemoguće popraviti.
Zbog toga, razvoj svih alata iz grupe net-tools u koju naredba ifconfig spada, danas se samo održava i ne razvijaju se nove mogućnosti.
Naredbe iz grupe net-tools su :
Stoga se sve više prelazi na novu grupu iproute2 alata.
Usporedna lista neke od zamjenskih naredbi iz nove grupe je vidljiva u tablici
| net-tools | iproute2 |
| Stara naredba | Nova naredba |
| ifconfig | ip addr ili ip link |
| ifconfig (interface status) | ip -s link |
| route | ip route |
| arp | ip neigh |
| netstat | ss |
| netstat -g | ip maddr |
| netstat -r | ip route |
| iptunnel | ip tunnel |
| ipmaddr | ip maddr |
| tunctl | ip tuntap |
| brtcl | bridge |
Pozivanje naredbe ifconfig :
| Naredba | Opis |
| ifconfig | Ispiši konf. svih mrežnih interface-a koji su aktivni |
| ifconfig -a | Ispiši konf. svih mrežnih interface-a - i aktivnih i neaktivnih |
| ifconfig ethx | Ispiši konfiguraciju za točno određeni interface (pr. za eth0 : ifconfig eth0) |
Pozivanje naredbe ip :
| Naredba | Opis |
| ip addr show | Ispiši konfiguraciju svih mrežnih kartica koje su aktivne |
| ip addr show ethx | Ispiši konfiguraciju mrežne kartice ethx (pr. eth0) |
| ip link show | Ispiši konfiguraciju svih mrežnih kartica koje su aktivne, s prikazom detalja o link sloju |
Svaki mrežni interface može biti aktivan ili neaktivan ali i dalje postojeći na sustavu.
Aktivacija i deaktivacija interface-a.
Svaki interface koji postoji na sustavu inicijalno je potrebno aktivirati. U slučajevima da nam više ne treba možemo ga deaktivirati, on će pritom i dalje postojati na nivou operativnog sustava ali neće biti “uključen” - slično kao da smo ga ugasili.
Interface aktiviramo/deaktiviramo na sljedeći način:
Pomoću naredbe ifconfig
| Naredba | Opis |
| ifconfig ethx up | ethx je ime inetrface-a (za eth0 to je : ifconfig eth0 up) |
| ifconfig ethx down | ethx je ime inetrface-a (za eth0 to je : ifconfig eth0 down) |
Pomoću naredbe ip link
| Naredba | Opis |
| ip link set ethx up | ethx je ime inetrface-a (za eth0 to je : ip link set eth0 up) |
| ip link set ethx down | ethx je ime inetrface-a (za eth0 to je : ip link set eth0 down) |
Primjer
1.Aktivirajmo mrežnu karticu eth0 :
ifconfig eth0 up
ili
ip link set eth0 up
2.Dektivirajmo mrežnu karticu eth0 :
ifconfig eth0 down
ili
ip link set eth0 down
Konfiguriranje IP parametara
U primjerima ćemo koristiti mrežku karticu eth0.
Definirajmo sljedeće IP parametre koje ćemo konfigurirati:
Konfiguracija IP adrese i netmaska mrežnog interface-a
Sintaksa je :
ifconfig <mrežni interface> <IP adresa>
ili
ip addr add <IP adresa> dev <mrežni interface>
Primjer
ifconfig eth0 172.17.100.1 netmask 255.255.255.0
ili
ip addr add 172.17.100.1/24 dev eth0
Opis : /24 je netmask od 24 bita = 255.255.255.0
Konfiguracija broadcast adrese mrežnog interface-a
Napomena : ako je par IP adresa + Netmask pravilno konfiguriran i broadcast IP adresa će biti ispravno automatski konfigurirana.
Sintaksa je :
ifconfig <mrežni interface> broadcast <broadcast adresa>
ili
ip addr add <IP adresa> broadcast <Broadcast adresa> dev <mrežni interface>
Primjer
ifconfig eth0 broadcast 172.17.100.255
ili
ip addr add 172.17.100.1/24 broadcast 172.17.100.255 dev eth0
Na kraju potrebno je i podići interface
ifconfig eth0 up
ili
ip link set eth0 up
Sve gore navedeno moguće je konfigurirati u jednom redu. Pogledajmo kako.
Sintaksa je :
ifconfig <mrežni interface> <IP adresa> netmask <netmask adresa> broadcast <broadcast adresa>
ili
ip addr add <IP/CIDR Netmask> broadcast <broadcast IP> dev mrežna kartica
Primjer
ifconfig eth0 172.17.100.1 netmask 255.255.255.0 broadcast 172.17.100.255
ili
ip addr add 172.17.100.1/24 broadcast 172.17.100.255 dev eth0
U slučaju da istovremeno konfiguriramo i IP adresu i netmask, Broadcast IP adresa će biti automatski izračunata i dodana:
Primjer
ifconfig eth0 172.17.100.1 netmask 255.255.255.0
Ako želimo obrisati konfiguraciju mreže, mrežne kartice, dovoljno je da ju isključimo:
Sintaksa:
ifconfig <mrežni interface> down
Primjer za eth0:
ifconfig eth0 down
ili
ip link set eth0 down
U sučajevima kada želimo ručno konfigurirati mrežne (IP) parametre našeg računala ili češće poslužitelja, potrebno je editiranje konfiguracijskih datoteka za mrežu.
U praksi: računala, mrežne pisače i druge sekundarne mrežne uređaje, najbolje je konfigurirati preko DHCP poslužitelja. S druge strane sve primarne mrežne uređaje (Routeri, Switchevi i sl.) te poslužitelje potrebno je ručno konfigurirati, jer nam je njihova dostupnost bitna i u slučajevima kada je DHCP poslužitelj nedostupan ili neispravan.
Konfiguracijske datoteke mrežnih kartica (engl. Interface) koriste se za svaku mrežnu karticu zasebno (jedna datoteka=jedna mrežna kartica). U trenutku podizanja operativnog sustava, čitaju se ove konfiguracijske datoteke u kojima se nalaze upute za rad samih kartica kao i konfiguracija IP parametara.
Osnovni IP parametri
Osnovna mrežna konfiguracijska datoteka za RedHat (CentOS, Fedora i sl.) Linux-e, nalazi se unutar direktorija :
/etc/sysconfig/network-scripts/. Njeno ima oblik ifcfg-ime-mrežne-kartice : pr, za eth0 mrežnu karticu datoteka se zove ifcfg-eth0.
Dakle datoteka za eth0 mrežnu karticu sa punom putanjom je : /etc/sysconfig/network-scripts/ifcfg-eth0
Što može sadržavati ova datoteka, opisati ćemo u tablici (najbitniji parametri) :
| Parametar | Vrijednost | Opis |
| DEVICE= | etho | Naziv mrežne kartice (eth0 ili eth1 ili eth2 , ….) |
| BOOTPROTO= | none ili bootp ili dhcp | Tip protokola koji se koristi za dodjeljivanje IP parametara mreže |
| IPADDR= | IP adresa | IP adresa ove mrežne kartice (pr.: 192.168.1.10) |
| NETMASK= | Netmask | Netmask adresa (pr.: 255.255.255.0) |
| ONBOOT= | yes ili no | Da li ova mrežn akartica treba biti aktivna kod podizanja sustava |
| USERCTL= | yes ili no | yes= svi korisnici imaju pravo kontroliranja rada kartice , no=samo root korisnik ima sva prava |
| NM_CONTROLLED= | yes ili no | Da li Network Manager ima prava oknfiguriranja kartica |
Postoji još cijeli niz parametara i njihovih pripadajućih vrijednosti ali ovo su najbitnije odnosno najčešće korištene.
Preporuka je postaviti : NM_CONTROLLED=no na poslužiteljima.
Dakle NE želimo da Daemon (Servis) Network Manager može mijenjati IP parametre. Network Manager je alat koji je zadužen za automatsku konfiguraciju mrežnih kartica, koji obično ne želimo na poslužiteljima, već eventualno samo na stolnim računalima ili Laptopima.
Ako želimo trajno zaustaviti Network Manager daemon, pokrenimo sljedeće naredbe:
chkconfig NetworkManager off service NetworkManager stop
O radu sa daemonima (servisima) ćemo pričati malo kasnije.
Primjeri
Ručno konfigurirana mrežna kartica eth0, sa sljedećim IP parametrima :
Izgled konfiguracijske datoteke : /etc/sysconfig/network-scripts/ifcfg-eth0 :
DEVICE=eth0 BOOTPROTO=none ONBOOT=yes IPADDR=192.168.1.10 NETMASK=255.255.255.0 NM_CONTROLLED=no USERCTL=yes
Konfiguracija DNS poslužitelja
Konfiguracijska datoteka u kojoj se definiraju DNS poslužitelji koje će naše računalo kontaktirati je /etc/resolv.conf
Ova konfiguracijska datoteka može sadržavati i druge parametre:
| Parametar | Vrijednost | Opis |
| nameserver | IP adresa DNS poslužitelja | Pr.: 195.29.150.3 |
| domain | Ime domene | Pr.: mojadomena.com - dodaje se ako hostname upišemo bez domene (FQDN) |
| search | Ime dodatnih domana | Pr.: mojadomena.com tvojadomena.com itd. (domene odvojene razmakom), proširuju parametar domain |
Unesimo samo naše (izmišljene) DNS poslužitelje u konfiguracijsku datoteku /etc/resolv.conf :
nameserver 195.29.150.3 nameserver 195.29.150.4
Konfiguracija Default Gateway-a i imena računala (Hostname)
Konfiguracija Default Gateway-a, uz još nekoliko osnovnih parametara, nalazi se u konfiguracijskoj datoteci : /etc/sysconfig/network
Ovdje možemo pronaći još nekoliko parametara:
| Parametar | Vrijednost | Opis |
| NETWORKING= | yes ili no | Dali se globalno uključuje mreža (yes) ili ne (no) |
| HOSTNAME= | Ime računala (Hostname) | Ime ovog računala: Pr.: server1 |
| GATEWAY= | IP adresa Default Gateway-a | Pr.: 192.168.1.1 |
Primjer
Dodajemo sljedeće parametre :
NETWORKING=yes HOSTNAME=server1 GATEWAY=192.168.1.1
Sada provjerimo da li se sve ispravno konfiguriralo
Provjera IP adrese i Netmaska
Provjeru radimo s naredbom ifconfig
ifconfig eth0
eth0 Link encap:Ethernet HWaddr 12:22:73:22:28:11
inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:536950 errors:0 dropped:0 overruns:0 frame:0
TX packets:572702 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:53114213 (50.6 MiB) TX bytes:76191038 (72.6 MiB)
Opis : Pogledajmo liniju : inet addr:
Provjera Default Gateway-a
Provjeru Default Gateway-a, možemo vidjeti s naredbama : netstat -rn i ip route
Provjera sa netstat -rn
netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
Opis : Destination 0.0.0.0 i Genmask (Netmask) : 0.0.0.0 označavaju Default Route-u (tj. Route-u za Default Gateway)
Provjera sa ip route
ip route 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10 default via 192.168.1.1 dev eth0
Opis : Ovdje je sve jasno : Default Route-a, pokazuje na Default Gateway (192.168.1.1)
Provjera DNS poslužitelja
Pod pretpostavkom da smo u datoteci /etc/resolv.conf dodali ispravne DNS poslužitelje, njihov rad možemo provjeriti s dvije naredbe : host i nslookup.
Provjerimo www.opensource-osijek.org, sa naredbom nslookup :
nslookup www.opensource-osijek.org Server: 195.29.150.3 Address: 195.29.150.3#53 Non-authoritative answer: www.opensource-osijek.org canonical name = opensource-osijek.org. Name: opensource-osijek.org Address: 213.147.104.78
Opis: Vidimo da je kontaktiran DNS : 195.29.150.3 te da smo dobili odgovor da je za www.opensource-osijek.org zadužena IP : 213.147.104.78
Provjerimo www.opensource-osijek.org, sa naredbom host :
host www.opensource-osijek.org www.opensource-osijek.org is an alias for opensource-osijek.org. opensource-osijek.org has address 213.147.104.78 opensource-osijek.org mail is handled by 0 opensource-osijek.org.
Opis: Vidimo da smo dobili odgovor od DNS poslužitelja da je za www.opensource-osijek.org zadužena IP : 213.147.104.78
Ovime smo završili osnovnu ručnu statičku trajnu (permanentnu) konfiguraciju mreže.
Kao što smo rekli, DHCP protokol se koristi za automatsku konfiguraciju mrežnih IP parametara mrežne kartice na strani klijenta:
* IP adresa i Netmask, * Default Gateway-a, * DNS poslužitelja i mnogih drugih parametara.
DHCP parametri se definirju na strani poslužitelja (DHCP server) a njih dohvaćamo na DHCP klijentu (u ovom slučaju DHCP klijentu na našoj mrežnoj kartici).
Drugim riječima sve IP parametre koje smo u prethodnom poglavlju ručno konfigurirali za svaku mrežnu karticu na računalu (IP adresa i Netmask, Default Gateway i DNS poslužitelji i sl) odnosno pojednostavljeno IP adresu i druge parametre našeg računala, moguće je konfigurirati na jednom centralnom mjestu, za sva računala na mreži. To mjesto e DHCP poslužitelj.
Potom je dovoljno pomoću DHCP klijenta “povući” te sve parametre sa DHCP poslužitelja na svako računalo na mreži koje ima instaliran DHCP klijent.
Kako to radi ?
Recimo da smo na strani DHCP poslužitelja definirali da će SVI DHCP klijenti (računala) na mreži dobiti sljedeće parametre:
* IP adrese iz opsega : 192.168.1.10 do 192.168.1.100 uz Netmask : 255.255.255.0 * DNS Poslužitelje : 158.225.15.16 i 158.226.15.17 * Default Gateway : 192.168.1.1 * …
Kada prvo računalo na mreži pokrene DHCP klijent na svojoj mrežnoj kartici (pr. eth0), njemu će DHCP poslužitelj dodjeliti prvu slobodnu IP adresu iz opsega :
Naše računalo sada ima ispravno konfigurirane IP parametre :
Ako neko drugo računalo na mreži također zatraži IP parametre od DHCP poslužitelja, on mu dodjeljuje sljedeću slobodnu IP adresu iz definiranog opsega (u našem slučaju bi to bila IP: 192.168.1.11).
DHCP poslužitelj čuva ove rezervacije IP adresa za DHCP klijente određeno vrijeme, definirano na DHCP poslužitelju. Ovo vrijeme se zove “engl. DHCP Lease Time”. Ukoliko je ovo vrijeme isteklo a računalo kojemu je dodjeljena ova IP adresa nije ugašeno (i DHCP klijent ispravno radi), dolazi do procesa osvježavanja (engl. Renew) te isto računalo ponovno dobiva istu tu IP adresu, ponovno u istom vremenu trajanja (Lease Time). Odnosno brojač počinje od početka. Ovaj proces se stalno ponavlja, dokle god je računelo (DHCP klijent) aktivno.
U drugom slučaju, kada je to vrijeme isteklo, a računalo (DHCP klijent) je ugašeno (ili mu ne radi DHCP klijent ili mreža), oslobađa se i rezervacija IP adrese za to određeno računalo te postojeća IP adresa postaje slobodna na dodjeljivanje prvom sljedećem računalu.
U bilo kojem trenutku naše računalo (DHCP klijent) može javiti DHCP poslužitelju da oslobađa svoju IP adresu (engl. Release), koja potom, na DHCP poslužitelju postaje dostupna bilo kojem drugom računalu (DHCP klijentu) za dodjeljivanje.
U slučajevima kada privremeno (do restarta računala) želimo dobiti konfiguracijske parametre mreže s DHCP poslužitelja, možemo koristiti naredbu dhclient.
Najčešći parametri naredbe dhclient, vidljivi su u tablici:
| Parametar | Opis |
| -r | (engl. Release) - oslobodi dodjeljenu IP adresu (zahtjev prema DHCP poslužitelju) |
| -R | Pošalji listu opcija koje DHCP klijent traži od DHCP poslužitelja |
| -H | Pošalji DHCP poslužitelju Hostname ovog računala (klijenta) |
| -F | Pošalji DHCP poslužitelju puno ima domene (FQDN) ovog računala (klijenta) |
| -v | (engl. Verbose) - detaljan ispis poruka |
Standardan DHCP klijent upit prema DHCP poslužitelju ima sintaksu :
dhclient interface
Primjerice: dhclient eth0
Ako želimo dobiti parametre mreže od DHCP poslužitelja, na eth0 mrežnoj kartici, dovoljno je pokrenuti sljedeću naredbu:
dhclient eth0
Nakon nekoliko trenutaka, naša mrežna kartica eth0 dobiva sve parametre mreže , popout :
Osim ovog jednostavnog načina upotrebe DHCP klijenta, moguće je sve željene parametre i opcije DHCP klijenta spremiti u konfiguracijsku datoteku : /etc/dhclient.conf.
Ovaj proces će biti objašnjen u sljedećem poglavlju.
U prethodnim primjerima vidjeli smo kako se može privremeno konfigurirati DHCP klijent na našem računalu. Sada ćemo naučiti kako konfigurirati DHCP klijenta trajno.
Dakle editiranjem konfiguracijskih datoteka koje su zadužene za trajnu (i nakon restarta rečunala) konfiguraciju DHCP klijenta.
Prvo provjetimo da li je mreža uključena u datoteci /etc/sysconfig/network:
Provjerimo da li imamo sljedeću liniju :
NETWORKING=yes
Ako je sve u redu idemo dalje - editirajmo konfiguracijsku datoteku za našu mrežnu karticu - u našem slučaju je to eth0, pa je konfiguracijska datoteka :
/etc/sysconfig/network-scripts/ifcfg-eth0.
Sve što je potrebno da bi naše računalo na mrežnoj kartici eth0 radilo kao DHCP klijent su sljedeće linije:
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes
Opis :
DEVICE i ONBOOT smo već opisali a BOOTPROTO sada prebaciujemo u DHCP klijent način rada, sa BOOTPROTO=dhcp.
Ovo je sve što je potrebno da naše računalo i nakon restarta radi u DHCP klijent načinu rada tj. da svaki puta kod restarta dobije sve IP parametre mreže, sa DHCP poslužitelja.
Za provjeru, možemo restartati računalo i vidjeti da li smo dobili sve IP parametre potrebne za rad, sa DHCP poslužitelja.
Provjerimo IP adresu i netmask mrežne kartice sa :
ifconfig eth0 ili ip addr show eth0
Provjerimo Route (na nekoliko načina):
route ili ip route ili netstat -rn
U slučajevima kada želimo definirati dodatne opcije našeg DHCP klijenta,što u većini slučajeva nije potrebno, moramo editirati datoteku: /etc/dhcp/dhclient-ethx.conf odnosno za mrežnu karticu eth0 će to biti datoteka /etc/dhcp/dhclient-eth0.conf.
U slučajevima kada je privremeno potrebno dodavati nove route, koristimo se naredbom route ili ip route.
Ove promijene nisu trajne i traju samo do restarta računala.
Iste naredbe se koriste i za ispis trenutnih route-a na sustavu.
Statičke route su sve route koje smo dodali ručno pomoću neke naredbe ili preko konfiguracijske datoteke,dakle koje nismo dobili pomoću nekog routing protokola (RIP,OSPF, BGP, …).
Primjeri
Ispišimo sve route na sustavu, u brojčanom obliku (-n prekidać) :
route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.17.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 172.17.100.254 0.0.0.0 UG 0 0 0 eth0
Vidimo da je za default route-u (Destination : 0.0.0.0 i Netmask : 0.0.0.0) Default Gateway IP : 172.17.100.254 , preko interface-a : eth0
Metoda pomoću naredbe ip route
ip route 172.17.100.0/24 dev eth0 proto kernel scope link src 172.17.100.10 default via 172.17.100.254 dev eth0
Kako dodati Default Gateway
Default gateway koji će biti trajno (permanentno) konfiguriran, konfigurira se u :
/etc/sysconfig/network, u varijabli GATEWAY=
Privremena konfiguracija Default Gateway-a odrađuje se sa sljedećom sintaksom:
route add default gw <IP adresa Default Gateway-a>
ili pomoću naredbe ip route :
ip route add default via <IP adresa Default Gateway-a>
Primjer
route add default gw 172.17.100.254
ili s naredbom ip route
ip route add default via 172.17.100.254
Dodavanje i brisanje route-a
Kod dodavanja route-a, mogu se dodavati route prema mrežama (engl. Network) ili pojedinim računalima (engl. Host).
Sintaksa za dodavanje (engl. Add) route-a prema mrežama:
route add -net <IP adresa mreže> netmask <Netmask od te mreže> gw <IP adresa Gateway-a od te mreže>
ili
ip route add <IP adresa mreže>/<CIDR oblik netmaska> via <IP adresa Gateway-a od te mreže>
Sintaksa za brisanje (engl. Delete) route-a prema mrežama:
route del -net <IP adresa mreže> netmask <Netmask od te mreže> gw <IP adresa Gateway-a od te mreže>
Primjeri
Dodajmo route-u za mrežu 192.168.100.0 /255.255.255.0 preko Gateway-a : 172.17.100.252
route add -net 192.168.100.0 netmask 255.255.255.0 gw 172.17.100.252
ili
ip route add 192.168.100.0/24 via 172.17.100.252
Ako nam više ne treba obrišimo istu route-u koju smo dodali:
route del -net 192.168.100.0 netmask 255.255.255.0 gw 172.17.100.252
ili
ip route del 192.168.100.0/24 via 172.17.100.252
Testiranje route-a
Ako imamo veći broj route-a i više nismo sigurni preko koje route će naš mrežni paket ići, na raspolaganju nam je dodatni alat : ip route get.
Ovaj alat će nam simulirati prolazak paketa kroz našu routing tablicu i prikazati odabranu route-u.
Primjer : Provjerimo preko koje route će se doći do mreže 192.168.100.0/24
ip -s route get 192.168.100.0/24
192.168.100.0 via 172.17.100.252 dev eth0 src 172.17.100.10
cache users 7 age 6462sec
Opis: Do mreže 192.168.100.0/24 se dolazi preko route u kojoj je Router : 172.17.100.252
Trajnu konfiguraciju statičkih route, postižemo dodavanjem route-a na nivou svake mrežne kartice (engl. interface) u posebnu datoteku, specifičnu za određenu mrežnu karticu.
Tako ćemo trajne statičke route za eth0 mrežnu karticu snimati u datoteku : /etc/sysconfig/network-scripts/route-eth0.
Sadržaj datoteke prati sintaksu naredbe ip route.
Sintaksa:
Mreža/CIDR netmask via <router/gateway za tu mrežu> dev <Mrežna kartica>
Napomena: Statičke route, privremene ili trajne, dodaju se samo za specifične mreže do kojih se ne može doći preko Default Gateway-a
Primjer
Dodajemo statičku trajnu route-u za mrežu 10.10.10.0/24, do koje dolazimo preko IP adrese (Routera) 172.17.100.222, preko mrežne kartice eth0.
Editirajmo datoteku /etc/sysconfig/network-scripts/route-eth0
10.10.10.0/24 via 172.17.100.222 dev eth0
Nakon restarta računala ova nova route-a mora ostati aktivna.
Nabrojati ćemo i objasniti neke od osnovnih alata za provjeru dostupnosti i ispravnosti rada mreže i mrežnih servisa.
Naredba ping se koristi za testiranje dostupnosti hosta (računala,poslužitelja, mrežnog uređaja, …) koji koristi TCP/IP protokol.
Osim same dostupnosti mjeri se i vrijeme koje je potrebno da paket dođe do odredišta.
Ime naredbe ping je nastalo na osnovu (podvodnog) sonara koji šalje impulse zvuka u određenom smjeru, te detektira jeku (engl. Echo) odnosno odbijeni zvuk, koji se odbio od određenog predmeta ispod vode. Zvuk koji se pri tome čuje podsjeća na riječ “ping”.
Kako radi ping ?.
Naredba ping šalje poseban paket, korištenjem ICMP protokola (Internet Control Message Protocol), konkretno se radi o “ICMP Echo Request” poruci, na odredišnu IP adresu te se čeka na odgovor. Sa odredišne IP adrese se šalje odgovor (ICMP Echo Reply) te se mijeri vrijeme između slanja i primanja (engl. Round-trip) te se prati koliko se paketa potencijalno izgubilo.
Vrijeme između slanja i primanja se zove latencija ili tromost odnosno kašnjenje.
Konačan rezultat je ispis statistike o primljenim paketima:
Ping omogućava i korištenje dodatnih opcija (prekidača),od kojih ćemo koristiti samo prekidać -c koji označava koliko paketa želimo poslati, a ostale nećemo objašnjavati.
Primjer
Provjerimo dostupnost IP adrese (192.168.200.100) na našoj lokalnoj mreži, slanjem 5 paketa:
ping -c 5 192.168.200.100 PING 192.168.200.100 (192.168.200.100) 56(84) bytes of data. 64 bytes from 192.168.200.100: icmp_req=1 ttl=64 time=0.297 ms 64 bytes from 192.168.200.100: icmp_req=2 ttl=64 time=0.125 ms 64 bytes from 192.168.200.100: icmp_req=3 ttl=64 time=0.199 ms 64 bytes from 192.168.200.100: icmp_req=4 ttl=64 time=0.246 ms 64 bytes from 192.168.200.100: icmp_req=5 ttl=64 time=0.325 ms --- 192.168.200.100 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 3997ms rtt min/avg/max/mdev = 0.125/0.238/0.325/0.072 ms
Ovdje vidimo da je druga strana dostupna i da je bilo 0% gubitaka.
Bitno je i da nije bilo većih odstupanja u vremenima, za svaki paket te da je prosječno vrijeme (avg : engl. Average): 0.238 ms što je za loklanu mrežu vrlo brzo.
Koja vremena odziva očekivati ?
Za LAN mreže : unutar nekoliko milisekundi (ms)
Za WAN mreže :
Za razliku od naredbe ping koja provjerava dostupnost krajnje točke u komunikaciji, naredba traceroute prikazuje nam sve točke (route) kroz koje prolazi paket do odredišta, uz mjerenje kašnjenja do svake od tranzitnih točaka (odnosno Layer 3 uređaja).
Kako to radi ?
Zamislimo sljedeću topologije mreže na internetu :
Ako naše računalo (PC1) želi napraviti traceroute na drugo računalo PC2 (koje je negdje na internetu), a paket mora proći kroz 6 routera, mjeriti će se vrijeme koje je potrebno od našeg računala koje inicira mjerenje, do svakog od njih i na kraju do odredišta, po principu:
| Računalo 1 (PC1) ←→ | Router 1 (R1) |
| Računalo 1 (PC1) ←→ | Router 2 (R2) |
| Računalo 1 (PC1) ←→ | Router 3 (R3) |
| Računalo 1 (PC1) ←→ | Router 4 (R4) |
| Računalo 1 (PC1) ←→ | Router 5 (R5) |
| Računalo 1 (PC1) ←→ | Router 6 (R6) |
| Računalo 1 (PC1) ←→ | Računalo 2 (PC2) |
Zapravo se na svaku točku u prijenosu (Router) šalju 3 paketa. Ovisno o implementaciji , obično se ispisuju sva tri mjerenja za svaku točku.
U slučaju da sva tri mjerenja po mjernoj točki (routeru) ne budu obrađena, ide se dalje i označavaju se tri znaka o neuspjeloj konekciji (*) na problematičnoj mjernoj točki.
traceroute na Linuxu može slati ICMP poruke (isti prokol kao za ping ali drugi podtip poruke) , UDP poruke ili TCP poruke.Ovaj odabir postoji zbog toga što je moguće da neki routeri u nizu zbog sigurnosnih i drugih razloga imaju isključen rad sa ICMP porukama. Tada će u odgovorima bit samo tri zvijezdice (* * *) koje označavaju grešku, za svaki router koji nije odgovorio.
Upotrebom UDP ili TCP poruka taj problem se riješava jer se više ne šalje ICMP poruka nego TCP odnosno UDP paket (port 53 (DNS)).
Primjer
1. Probajmo napraviti traceroute na google.com:
Napomena :-n prekidać znači da ne želimo da se IP adrese prevode (engl. resolving ) u imena (FQDN) routera, već da imamo samo prikazane IP adrese.
traceroute -n google.com traceroute to google.com (212.92.207.155), 30 hops max, 60 byte packets 1 192.168.100.1 0.051 ms 0.014 ms 0.012 ms 2 192.168.200.1 3.014 ms 4.342 ms 4.511 ms 3 10.51.192.1 2.824 ms 2.813 ms 2.798 ms 4 10.10.4.17 5.841 ms 5.833 ms 5.865 ms 5 10.10.0.29 5.795 ms 5.915 ms 5.943 ms 6 10.50.0.73 6.374 ms 6.332 ms 6.362 ms 7 10.50.0.74 6.201 ms 5.642 ms 5.602 ms 8 * * * 9 * * * 10 * * * 11 * * * 12 * * * 13 * * * 14 * * * 15 * * * 16 * * * 17 * * * 18 * * * 19 * * * 20 * * * 21 * * * 22 * * * 23 * * * 24 * * * 25 * * * 26 * * * 27 * * * 28 * * * 29 * * * 30 * * *
Vidljivo je da sve do router br. 7 imamo mjerenja a dalje je sve zablokirano (za ICMP).
Inaće se pokušava koristiti maksimalno do 30 točaka (routera) do odredišta (tkzv. Hop-ovi). Zbog toga engl. naziv “Hop count”. Ovo ograničenje je po potrebi moguće i proširiti. Ovaj pojam je povezan s pojmom TTL (Time To Live) koji označava koliko maksimalno routera neki mrežni paket može proći pa se s tim parametrom i proširuje broj routera (parametar -m Broj-routera-veći-od-30).
Svaki paket na mreži ima postavljen TTL (Time To Live) broj i prolaskom paketa kroz svaki router na putu ovaj broj router smanji za jedan, sve dok se ne dođe do nule. Ako se došlo do nule paket se odbacuje. Drugim riječima ako je nekom paketu trebalo do odredišta preveliki broj routera on će biti odbačen. Standardni postavljen TTL na operativnom sustavu Linux je obično 64. Definiran je i može se mijenjati u : /proc/sys/net/ipv4/ip_default_ttl
2. Probajmo sada korištenjem TCP protokola - prekidač -T.
U ovom slučaju šalje se TCP SYN paket (za otvaranje TCP konekcije).
traceroute -n -T google.com traceroute to google.com (212.92.207.152), 30 hops max, 60 byte packets 1 192.168.100.1 0.050 ms 0.008 ms 0.007 ms 2 192.168.200.1 3.444 ms 4.108 ms 4.283 ms 3 10.51.192.1 2.213 ms 2.255 ms 2.391 ms 4 10.10.4.17 5.729 ms 5.767 ms 5.803 ms 5 10.10.0.29 6.256 ms 6.209 ms 5.895 ms 6 10.50.0.73 6.982 ms 6.796 ms 6.821 ms 7 10.50.0.74 6.653 ms 5.713 ms 5.626 ms 8 212.92.207.152 5.661 ms 5.348 ms 5.280 ms
Sada vidimo da imamo mjerenja do krajnje točke (točka 8).
Naredba nslookup (engl. name server lookup) koristi se za provjeru ispravnosti ili dostupnosti unosa u DNS (engl. Domain Name System) poslužitelju. Pomoću ove naredbe kontaktiramo DNS poslužitelj da nam razriješi IP adresu na osnovu nekom imena računala ili FQDN imena (ime računala s domenom).
U slučavima kad asumnjamo da nam DNS poslužitelji nisu dobro konfigurirani ili nam zbog nekog drugog razloga DNS resolving ne radi ovo je alat koji nam može pomoći.
Primjer
1. Pronađimo IP adresu poslužitelja opensource-osijek.org
nslookup opensource-osijek.org Server: 195.29.166.116 Address: 195.29.166.116#53 Non-authoritative answer: Name: opensource-osijek.org Address: 213.147.104.78
Ovdje vidimo da je nslookup pronašao prvi DNS poslužitelj konfiguriran na sustavu (192.29.166.116) te da je njemu poslao upit da mu da IP adresu od FQDN imena: opensource-osijek.org .
Dobili smo odgovor da je njegova IP adresa : 213.147.104.78, što je točno.
Iz ovoga možemo reći da nam je DNS poslužitelj dobro konfiguriran te da nam odgovara te da smo dobili traženi odgovor.
Napomena :
Non-authoritative answer znači da smo dobili odgovor od DNS poslužitelja koji nije zadužen za tu domenu (.org u ovom slučaju) te da je on morao pitati viši DNS poslužitelj u hijerarhiji.
Authoritative answer znači da bi dobili odgovor od DNS poslužitelja koji je zadužen za tu domenu za koju smo slali upit te da on nije morao pitati viši DNS poslužitelj u hijerarhiji.
2. Promijenimo DNS poslužitelj koji želimo da se kontaktira u 213.147.96.4 , te mu pošaljimo isti upit.
nslookup > server 213.147.96.4 Default server: 213.147.96.4 Address: 213.147.96.4#53 > opensource-osijek.org Server: 213.147.96.4 Address: 213.147.96.4#53 Non-authoritative answer: Name: opensource-osijek.org Address: 213.147.104.78 > exit
Naredba nslookup može se pokrenuti i bez parametara, tada ulazimo u njeno komandnolinijsko sučelje (CLI).
DNS poslužitelj smo promijenili naredbom server iza koje slijedi IP adresa DNS poslužitelja.
Nakon toga očekuje se puno ime računala (FQDN) koje provjeravamo.
U slučaju da vaš CentOS nema nslookup naredbu, morate instalirati bind-utils: yum install bind-utils
Naredba netstat (engl. Network Statistics) prikazuje nam razne parametre rada mreže :
Postoji cijeli niz parametara od kojih ćemo spomenuti samo neke :
| Parametar (prekidač) | Opis |
| -a | Prikazuje sve mrežne konekcije i TCP/UDP portove |
| -e | Prikazuje “Ethernet”parametre mreže te statistiku o količini primljenih/poslanih podataka |
| -g | Prikazuje statistiku za Multicast |
| -r | Prikazuje Routing tablicu |
| -i | Prikazuje statistiku za mrežne interface-e i mrežne kartice |
| -n | Sve oknekcije koje prikazuje, prikazuje s IP adresama a ne s imenima računala (hostname) |
| -p | Prikazuje statistike prema protokolu uz ispis servisa (daemona) zaduženog za konekciju |
Primjeri
1. Prikaži sve mrežne konekcije (-a) ali u brojčanom formatu (-n):
netstat -an Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:199 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 192.168.1.101:80 123.125.71.35:6851 SYN_RECV tcp 0 0 127.0.0.1:38771 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN tcp 0 0 192.168.1.101:443 144.76.137.226:43556 TIME_WAIT tcp 0 0 192.168.1.101:48388 192.168.1.131:514 ESTABLISHED tcp 0 0 192.168.1.101:443 144.76.137.226:53085 TIME_WAIT tcp 0 0 192.168.1.101:443 144.76.137.226:56128 TIME_WAIT tcp 0 0 192.168.1.101:443 144.76.137.226:40703 TIME_WAIT tcp 0 0 127.0.0.1:389 127.0.0.1:42370 ESTABLISHED ... ... ... ... ... ...
2. Prikaži sve mrežne konekcije (-a) ali u brojčanom formatu (-n) s time da vidimo koji servis (daemon) je otvorio koji TCP/UDP port (-p) ⇒ vidljivo u stupcu PID/Program name:
netstat -anp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 596/slapd tcp 0 0 127.0.0.1:199 0.0.0.0:* LISTEN 610/snmpd tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 776/mysqld tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 858/httpd tcp 0 0 127.0.0.1:38771 0.0.0.0:* LISTEN 16972/Passenger Rac tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 639/vsftpd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 620/sshd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 821/sendmail tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 858/httpd tcp 0 0 192.168.1.101:443 144.76.137.226:48515 TIME_WAIT - tcp 0 0 192.168.1.101:48388 192.168.1.131:514 ESTABLISHED 493/rsyslogd tcp 0 0 192.168.1.101:443 144.76.137.226:51755 TIME_WAIT - tcp 0 0 192.168.1.101:443 144.76.137.226:37826 TIME_WAIT - tcp 0 0 127.0.0.1:389 127.0.0.1:42370 ESTABLISHED 596/slapd ... ... ... ... ... ...
Vidljivo je pr. da je mysql baza podataka (mysqld servis/daemon) na IP adresi : 0.0.0.0 (ovo računalo) , port 3306.
Osim toga vidimo da je Web poslužitelj httpd (Apache) , također na IP adresi : 0.0.0.0 (ovo računalo) , port 80 , …
3. Prikažimo statistiku za sve mrežne interface-e (-i)>
netstat -i Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 0 678732758 0 0 0 663110829 0 0 0 BMRU lo 16436 0 194960446 0 0 0 194960446 0 0 0 LRU
Vidimo da na sustavu postoje dva mrežna interface-a, za koje vidimo i statistike, koliko mrežnog prometa je primljeno i poslano s njih i na njih:
eth0 ⇒ Ovo je mrežna kartica
lo ⇒ Ovo je “loopback” interface
4. Ispiši Routing tablicu (-r):
netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
Vidimo da je Default Gateway (Destination IP : 0.0.0.0 i Genmask (netmask): 0.0.0.0) postavljen na IP adresu : 192.168.1.1, preko eth0 mrežne kartice, kao i routing tablicu za mrežu 192.168.1.0 / 255.255.255.0 koja isto ide na eth0 mrežnu karticu (ovo je mreža na kojoj je ovo računalo).
Naredba netstat je novija varijanta dijela naredbe netstat (engl. Network Statistics) a prikazuje nam samo mrežne statistike, na vrlo detaljan način. Ova naredba dolazi u paketu iproute2.
Postoji samo nekoliko parametara :
| Parametar (prekidač) | Opis |
| -a | Prikazuje sve mrežne statistike |
Primjeri
1. Prikaži sve mrežne statistike (-a) :
nstat -a #kernel IpInReceives 10566 0.0 IpInDelivers 10566 0.0 IpOutRequests 10616 0.0 IpOutDiscards 33 0.0 IpOutNoRoutes 32 0.0 IcmpInErrors 60 0.0 IcmpInTimeExcds 60 0.0 IcmpOutErrors 151 0.0 IcmpOutTimeExcds 151 0.0 IcmpMsgInType3 60 0.0 IcmpMsgOutType3 151 0.0 TcpActiveOpens 633 0.0 TcpPassiveOpens 616 0.0 TcpEstabResets 278 0.0 TcpInSegs 8062 0.0 TcpOutSegs 7989 0.0 TcpOutRsts 1178 0.0 UdpInDatagrams 3117 0.0 UdpNoPorts 124 0.0 UdpOutDatagrams 2466 0.0 Ip6InReceives 141 0.0 Ip6InDiscards 141 0.0 Ip6InOctets 20039 0.0 TcpExtTW 27 0.0 TcpExtDelayedACKs 25 0.0 TcpExtTCPPrequeued 1 0.0 TcpExtTCPHPHits 416 0.0 TcpExtTCPPureAcks 1925 0.0 TcpExtTCPHPAcks 188 0.0 TcpExtTCPAbortOnData 182 0.0 TcpExtTCPAbortOnClose 424 0.0 TcpExtTCPChallengeACK 164 0.0 IpExtInMcastPkts 640 0.0 IpExtOutMcastPkts 219 0.0 IpExtInBcastPkts 821 0.0 IpExtOutBcastPkts 703 0.0 IpExtInOctets 3248600 0.0 IpExtOutOctets 2884655 0.0 IpExtInMcastOctets 92855 0.0 IpExtOutMcastOctets 46335 0.0 IpExtInBcastOctets 150899 0.0 IpExtOutBcastOctets 134279 0.0
Kao što je vidljivo, statistike su prilično detaljne.
Iako lsof nije naredba koja ima direktnu vezu s mrežom, pošto se na UNIX/Linux sustavim sve svodi na pristup nekim (vrstama) datoteka, tako su i mrežne konekcije i otvoreni portovi, vidljivi kao posebne (otvorene) datoteke.
Drugim riječima naredba LiSt Open Files (lsof) nam daje mogućnost da vidimo sve otvorene mrežne konekcije i datoteke koje su vezane za te konekcije. Nadalje možemo vidjeti koji program je otvorio koji mrežni port odnosno koji daemon (servis) je ostvario mrežnu konekciju i sl.
Za provjeru koju verziju naredbe lsof imamo i s kojim parametrima je kompilirana, pokrenite
lsof -v
lsof version information:
revision: 4.82
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
constructed: Thu Jul 23 17:38:32 UTC 2015
constructed by and on: mockbuild@c6b8.bsys.dev.centos.org
compiler: cc
compiler version: 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
compiler flags: -DLINUXV=26016 -DGLIBCV=212 -DHASIPv6 -DHASSELINUX -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DHAS_STRFTIME -DLSOF_VSTR="2.6.16" -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fno-strict-aliasing
loader flags: -L./lib -llsof -lselinux
system info: Linux c6b8.bsys.dev.centos.org 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux
Anyone can list all files.
/dev warnings are disabled.
Kernel ID check is disabled.
Pokretanjem naredbe s prekidačem -i dobivamo popis odnosno listu svih otvorenih datoteka koje su vezane za “Internet” konekcije odnosno mrežu. Dodatno ćemo koristiti i prekidač -n da bi sva računala vidjeli s numeričkim oznakama (s IP adresama).
Pogledajmo primjer
(Naš poslužitelj na kojem pokrećemo ovu naredbu ima IP adresu 192.168.100.1)
lsof -i -n COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 485 root 2u IPv4 420783045 0t0 TCP 192.168.100.1:49743->192.168.100.100:514 (ESTABLISHED) nginx 8886 root 6u IPv4 1687513641 0t0 TCP 192.168.100.1:80 (LISTEN) nginx 8888 nginx 6u IPv4 1687513641 0t0 TCP 192.168.100.1:80 (LISTEN) sshd 13414 root 3r IPv4 1696814439 0t0 TCP 192.168.100.1:ssh->93.137.225.169:60010 (ESTABLISHED) sshd 22746 root 3u IPv4 893714238 0t0 TCP *:ssh (LISTEN) ... ... ...
OPIS: (Ispis je skraćen)
Pogledajmo prvi red. Prva vidljiva naredba (COMMAND) je rsyslogd to je servis/daemon zadužen na primanje (ili slanje) Tzv. “Syslog” poruka. U stupcu “NODE” vidimo da se radi o TCP konekciji. Pod (NAME) vidimo s koje IP adrese (odredište) se spajamo na koju udaljenu IP adresu. Dakle naš server (192.168.100.1, lokalni port 49743) se spojio na udaljeni server (192.168.100.100 , port 514) tip konekcije je “ESTABLISHED” dakle radi se o ostvarenoj i trenutno aktivnoj konekciji na udaljeni server.
Drugi i treći red je “nginx” to je isto servis/daemon (naš lokalni Web poslužitelj), koji je na TCP transportnom protokolu. Dalje je vidljivo da je podignut na IP adresi 192.168.100.1 i to na portu 80 (to je HTTP) i da je u stanju “LISTEN” što znači da sluša nove konekcije.
Slijedeći su ssh servisi (daemon) i to :
Stupac “USER” označava korisničko ima s kojim je pokrenut proces odnosno servis/daemon.
Stupac “FD”
Stupac “FD” nam daje detalje o “File Deskriptorima”
Moguće vrijednosti su :
Osim navedenog ovaj stupac koji označava “File Deskriptore” može imati i druga stanja poput 1u koje znači da se radi o jednom (1) file deskriptoru. Njih naravno može biti i više - brojka govori o tome koliko ih je u upotrebi. Iza brojke slijedi stanje : u , r , w of što znači:
Stupac “TYPE”
Stupac “TYPE” definira vrstu datoteke i njenu identifikaciju. Moguće vrijednosti su:
Filtriranje prema transportnom protokolu
Moguće je i ograničiti ispis samo na vrstu transportnog protokola: TCP ili UDP (isto ćemo koristiti i -n zbog ispisa u obliku IP adrese a ne hostname-a/FQDN-a):
Za TCP:
lsof -iTCP -n
ili za UDP
lsof -iUDP -n
Filtriranje prema portu
Moguće je filtrirati i prema portu. Probajmo izlistati sve konekcije za koje se koristi port 22 (SSH):
lsof -i :22 -n COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 13414 root 3r IPv4 1696814439 0t0 TCP 192.168.100.1:ssh->93.137.225.169:60010 (ESTABLISHED) sshd 22746 root 3u IPv4 893714238 0t0 TCP *:ssh (LISTEN) sshd 22746 root 4u IPv6 893714240 0t0 TCP *:ssh (LISTEN
Filtriranje prema odredišnom računalu
Sada ćemo filtrirate sve otvorene konekcije prema udaljenom računalu s IP 93.137.225.169 (to je naše udaljeno računalo s kojega smo se spojili na poslužitelj) :
lsof -i@93.137.225.169 -n COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 13414 root 3r IPv4 1696814439 0t0 TCP 192.168.100.1:ssh->93.137.225.169:60010 (ESTABLISHED)
Filtriranje prema stanju konekcije
Moguće je filtrirati izlistanje stanja konekcije, prema definiranim stanjima :
Uz dodatna stanja:
Pronađimo sve TCP konekcije koje su u stanju “ESTABLISHED” dakle ostvarene:
lsof -i -sTCP:ESTABLISHED -n COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 485 root 2u IPv4 420783045 0t0 TCP 192.168.100.1:49743->192.168.100.100:514 (ESTABLISHED) sshd 13414 root 3r IPv4 1696814439 0t0 TCP 192.168.100.1:ssh->93.137.225.169:60010 (ESTABLISHED)
Dodatno pogledajte primjere upotrebe naredbe lsof u poglavlju
”Transparent Huge Pages“ te u poglavlju "Napredno: File Descriptors".
TUN i TAP su posebna virtualna mrežna sučelja, koja se koriste za posebne namjene.
TUN (Engl Network TUNnel) simulira mrežno sučelje, koje radi na OSI sloju 3 (IP). Dakle TUN mrežno sučelje se koristi za namjene usmjeravanja (routinga), poput raznih VPN tunela (Pr. openVPN) i slično. S druge strane TAP (Engl. Network TAP) simulira mrežno sučelje na nižem sloju - OSI sloj 2, pa prema tome radi s ethernet mrežnim okvirima. Stoga se on najčešće koristi za kreiranje mrežnih mostova (Engl. bridge), poput mostova (bridge) koji su poveznica između hipervizora za virtualizaciju i fizičkog mrežnog sučelja (mrežne kartice) s jedne strane i poveznice s virtualnom mrežnom karticom unutar virtualnog računala, s druge strane. Za ove obije vrste virtualnih mrežnih sučelja, koristi se isti upravljački program: /dev/net/tun.
Primjer iz virtualizacije
Ako smo pokrenuli QEMU (KVM) hipervizor za virtualizaciju, te jedno virtualno računalo na njemu, a koje ima konfiguriranu barem jedno mrežno sučelje (mrežnu karticu), to virtualno mrežno sučelje se mora mapirati prema hipervizoru, na jedno TAP mrežno sučelje.
Potražimo, prema file deskriptorima, poveznice prema svim /dev/net/tun uređajima, tako ćemo pronači i naš hipervizor (KVM/QEMU), koji u konkretnom slučaju ima PID: 18863.
lsof | grep "/dev/net/tun" kvm 18863 root 17u CHR 10,200 0t70 136 /dev/net/tun kvm 18863 18864 root 17u CHR 10,200 0t70 136 /dev/net/tun kvm 18863 18888 root 17u CHR 10,200 0t70 136 /dev/net/tun kvm 18863 18889 root 17u CHR 10,200 0t70 136 /dev/net/tun kvm 18863 18891 root 17u CHR 10,200 0t70 136 /dev/net/tun
Naredba lsof nam je našla upravo proces kvm koji ima PID koji smo tražili a koji koristi upravljački program za virtualno mrežno sučelje ( /dev/net/tun ) - prema virtualnom računalu.
Dakle sada za PID 18863, tražimo file deskriptor, broj 17, te tražimo više podataka o njemu (o file deskriptoru br. 17, za PID 18863)
cat /proc/18863/fdinfo/17 pos: 70 flags: 0104002 mnt_id: 20 iff: tap310i0
Ono što smo tražili, nalazi se u polju: iff:.
Dakle dobili smo traženo ime virtualnog mrežnog sučelja tipa TAP, koje je u ovom slučaju: tap310i0
iff: polje je novost, koja nije dostupna u starijim (2.6.x) inačicama linux kernela.
Pogledajmo i detalje o ovom mrežnom sučelju:
ifconfig tap310i0
tap310i0 Link encap:Ethernet HWaddr 2a:bb:57:83:0b:20
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:625 errors:0 dropped:0 overruns:0 frame:0
TX packets:1266 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:52163 (50.9 KiB) TX bytes:108607 (106.0 KiB)
Naredba ss pripada novog generacija alata iz iproute2 paketa te je nasljednik naredbe netstat.
Naredbe netstat pretražuje /proc/ direktorij u kojemu se nalaze datoteke u kojima se nalaze razni kernel parametri mreže. U slučajevima kada imamo veliki broj konekcija ili mrežnih parametara ova metoda tj. rad naredbe netstat zna biti prilično usporen.
S druge strane, naredba ss informacije izvlači direktno iz kernela, što ju čini puno bržom u radu. Dodatno, moguće je koristiti i napredne filtere ugrađene u samu naredbu.
Najčešći prekidaći naredbe ss su :
| Naredba i prekidač | Opis |
| ss -a | Ispiši sve |
| ss -n | Interpretiraj sve protokole brojčano bez prepoznavanja imena protokola |
| ss -s | Ispiši listu svih otvorenih socketa |
| ss -l | Ispiši listu svih otvorenih portova |
| ss -p | Ispiši i procese koji su otvorili portove/sockete |
| ss -t | Ispiši samo TCP |
| ss -u | Ispiši samo UDP |
Primjeri
1.Prikaži sve mrežne konekcije u brojčanom formatu:
ss -an Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port nl UNCONN 0 0 0:2079 * nl UNCONN 0 0 0:0 * nl UNCONN 0 0 4:0 * nl UNCONN 0 0 7:0 * nl UNCONN 0 0 9:1908 * nl UNCONN 0 0 9:0 * nl UNCONN 0 0 10:0 * nl UNCONN 0 0 11:0 * nl UNCONN 0 0 15:1396 * nl UNCONN 0 0 15:-4177 * nl UNCONN 0 0 15:0 * nl UNCONN 0 0 15:-4176 * nl UNCONN 0 0 16:0 * p_raw UNCONN 0 0 *:eth0 * u_str LISTEN 0 30 /var/run/dbus/system_bus_socket 8859 * 0 u_dgr UNCONN 0 0 /dev/log 8780 * 0 u_str LISTEN 0 30 @/com/ubuntu/upstart 7678 * 0 u_seq LISTEN 0 0 @/org/kernel/udev/udevd 7882 * 0 u_str ESTAB 0 0 * 8867 * 8868
2. Ispiši listu svih otvorenih portova , TCP , brojčano:
ss -tln State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:5080 *:* LISTEN 0 128 *:443 *:* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:5080 ::* LISTEN 0 128 :::443 :::*
3. Ispiši sve TCP otvorene portove, numerički s procesima koji su ih otvorili
ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:5080 *:* users:(("ssh",pid=21314,fd=5))
LISTEN 0 128 *:443 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 ::1:5080 :::* users:(("ssh",pid=21314,fd=4))
LISTEN 0 128 :::443 :::*
4. Ispiši samo IPv4, TCP i to sve otvorene konekcije (engl. Established)
ss -t4 state established Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 172.17.100.10:https 194.138.12.171:54566 0 0 172.17.100.10:1023 192.168.100.11:24007 0 0 172.17.100.10:surf 192.168.100.11:49152 0 0 172.17.100.10:exp1 20.20.10.30:49152 0 0 172.17.100.10:38374 192.168.100.110:ssh 0 232 172.17.100.10:https 10.10.10.10:34155 0 0 172.17.100.10:1015 20.20.10.20:49152 0 0 172.17.100.10:https 10.10.10.10:58294
Napomena : Stanje svake konekcije može biti sljedeća:
| Stanje | Opis |
| established | Ostvarene konekcije |
| syn-sent | TCP syn paket poslan |
| syn-recv | TCP syn paket primljen |
| fin-wait-1 | TCP je u stanju zatvaranja i čeka se FIN ACK paket s druge strane |
| fin-wait-2 | TCP Socket je zatvoren ali se čeka potvrda FIN ACK s druge strane |
| time-wait | TCP FIN Timeout još nije istekao te je veza u stanju čekanja da se zatvori |
| closed | Zatvoreno |
| close-wait | Program koji je otvorio TCP socket je još aktivan i nije još zatvorio TCP socket |
| last-ack | Stanje, trenutak prije urednog zatvaranja TCP konekcije |
| closing | U stanju zatvaranja |
| all | Sva stanja od gore |
| connected | Konekcija je ostvarena |
| synchronized | Sva stanja osim syn-sent |
| bucket | Stanja, koja se smatraju minisocket, poput time-wait i syn-recv |
| big | Suprotno od bucket |
5. Ispišimo sve TCP ostvarene konekcije na port 443 (HTTPS protokol),i to da filtriramo i source port 443 i destination port 443, brojčano :
ss -atn -o state established '( dport = :443 or sport = :443 )' Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 172.17.100.10:443 20.20.20.20:54566 timer:(keepalive,47min,0) 0 232 172.17.100.10:443 10.10.10.10:34155 timer:(on,064ms,0) 0 0 172.17.100.10:443 10.10.10.10:58294 timer:(keepalive,47min,0)
Mrežni servisi ili u linux terminologiji “Daemon”-i, zaduženi su za pojedine mrežne protokole.
U pravilu jedan daaemon - jedan protokol ili grupa protokola.
Dalje u tekstu objasniti ćemo njih nekolicinu.
NetworkManager servis tj. u Linux terminologiji “Daemon” je zadužen za kontrolu i konfiguraciju mrežnih kartica. On je zadužen i za praćenje stanja mrežnih kartica (pr. da li su aktivne ili nisu) te za njihovo aktiviranje prema potrebi.
NetworkManager se sastoji od daemona (servisa), koji mora biti stalno aktivan (i pokrenut), GNOME apleta (unutar grafičkog sučelja) koji prikazuje stanje mrežnih kartica i grafičkog konfiguracijskog alata. Iz grafuičkog konfiguracijskog alata se radi sva konfiguracija mrežnih kartica. On podržava razne vrste mrežnih kartica :
Što se tiće konfiguracije mrežnih kartica, u njemu je moguće definirati sve IP parametre :
Osim toga NetworkManager ima API preko “D-Bus” sustava, koji omogućava provjeru,nadzor i konfiguraciju mrežnih kartica
NetworkManager je standardno instaliran od verzije RedHat/CentOS 6.x.
U slučaju da nije instaliran, a potreban vam je, moguće ga je instalirati na sljedeći način:
yum install NetworkManager
Kao i svaki daemon (servis), potrebno je da bude podignut automatski kod svakog podizanja operacijskog sustava. To ćemo osigurati sljedećom naredbom:
chkconfig NetworkManager on
I na kraju mi ga NEĆEMO koristiti jer želimo sve konfiguracije odrađivati ručno i biti svjesni koje datoteke su zaslužene za konfiguraciju raznih dijelova mrežnog podsustava.
Isključimo ga, trajno:
chkconfig NetworkManager off
Te ga zaustavimo:
service NetworkManager stop
Toliko o NetworkManager-u.
Funkcioniranje SSH protokola smo objasnili u prijašnjim poglavljima.
SFTP protokol je praktično implementacija FTP protokola preko SSH kriptiranog kanala.
SCP je implementacija RCP (Remote Copy) naredbe za kopiranje datoteka ili direktorija, preko SSH kriptiranog kanala.
SSH, SFTP i SCP funkcionalnosti su implementirane unutar SSH daemona : sshd.
SSH Servis (poslužiteljska strana) odnosno prema linux terminologiji “daemon” je uglavnom već instaliran.
Ovako možemo provjeriti da li je SSH “daemon” već instaliran :
rpm -q openssh-server openssh-server-5.3p1-112.el6_7.x86_64
Opis :
Pitali smo “RedHat Package Manager” (rpm) da nam provjeri da li je paket imena openssh-server već instaliran i ako je, da nam pokaže o kojoj se točno verzija radi.
U gornjem slučaju je sve u redu jer je SSH “daemon” instaliran.
U slučaju da SSH nije instaliran, to je moguće napraviti na sljedeći način.
U ovom primjeru ćemo instalirati i SSH poslužitelj i SSH klijent:
yum -y install openssh-server openssh-clients
Nakon ove točke, potrebno je samo pokrenuti daemon:
service sshd start
Nakon toga omogučimo automatsko pokretanje SSH daemona kod svakog pokretanja sustava
chkconfig sshd on
Sada možemo provjeriti da li se SSH daemon pokrenuo, na TCP portu 22.
netstat -tulpn | grep :22 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2030/sshd tcp 0 0 :::22 :::* LISTEN 2030/sshd
Vidimo da je TCP port 22 u upotrebi na lokalnom računalu (0.0.0.0) te da ga koristi deamon sshd.
Ovo znači da je sve u redu.
Sada se s drugog računala sa SSH klijentom možemo spojiti na ovo račnualo (na SSH poslužitelj). Korisnički računi s kojima se možemo spajati su svi korisnički računi na ovom računalu (poslužiteljska strana) s kojima se moguće logirati na samo računalo.
Vrlo često je slučaj da je direktno logiranje na SSH poslužitelj kao korisnik root onemogućeno, što je moguće naknadno promijeniti.
Konfiguracijska datoteka SSH daemona se nalazi u : /etc/ssh/sshd_config.
U svim primjerima dolje, pretpostavlja se da ćete editirati gore navedenu datoteku, snimiti ju te restartati ssh daemon, s naredbom:
service sshd restart
Kako omogučiti ssh pristup root korisniku ?
Parametar PermitRootLogin mora izgledati ovako
PermitRootLogin yes
Ovo je ujedno i potencijalni sigurnosni problem te se stoga preporuča postaviti lozinku za root korisnika na vrlo kompleksnu (da sadrži velika i mala slova, brojeve i posebne znakove)
Kako promijeniti standardni TCP port 22 u neki drugi - recimo TCP port 11111
Parametar Port 22 moramo promijeniti u :
Port 11111
Povečajmo sigurnost
Smanjimo vrijeme koje imamo za logiranje na 1 minutu.
Smanjimo broj pogrešnih pokušaja za logiranje na 5, nakon kojih više neće biti moguće ponovno logiranje s istim korisničkim računom na neko vrijeme.
Ova metoda riješava i problem “Brute Force” napada na pojedini korisnički račun, preko SSH protokola.
Ograničimo i broj aktivnih istovremenih SSH konekcija na ssh poslužitelj na 10. komada.
LoginGraceTime 1m MaxAuthTries 5 MaxSessions 10
… i ne zaboravimo na restart ssh daemona.
Zamislimo da se s računala PC-A spajamo preko SSH klijenta, na SSH poslužitelj na računalu PC-B, ka o na slici :
Dođimo do računala : PC-A : IP : 10.10.10.10 i pokrenimo ssh klijent, da se spaja na računalo PC-B : IP 10.10.10.20, s korisničkim računom root.
Dakle spajamo se kao korisnik root na računalo PC-B:
[root@PC-A ~]# ssh 10.10.10.20 -l root root@10.10.10.20's password: [root@PC-B ~]#
Nakon što budemo unjeli lozinku za računalo PC-B - root@10.10.10.20's password: spajamo se na njega i dobivamo Shell, na njemu, kao da smo na njega spojeni lokalno (kao da sjedimo ispred njega).
SCP (Secure Copy) naredba se koristi za kopiranje datoteka ili direktorija s računala na računalo, na siguran (kriptiran) način.
U istoj konfiguraciji ka na slici prije, prekopirajmo datoteku vazno.txt s računala PC-A na PC-B:
Gore navedena datoteka se nalazi unutar našeg direktorija /root/podaci/ i na istu lokaciju ćemu je prekopirati na drugom računalu. Ovo radimo kao korisnik root :
[root@PC-A ~]# scp /root/podaci/vazno.txt root@10.10.10.20:/root/podaci/ root@10.10.10.20 password: vazno.txt 100% 47KB 47.5KB/s 00:00
Nakon što upišemo lozinku, za root korisnički račun na računalu, na koje se spajamo tj. PC-B datoteka se počinje kopirati (vidljiv je napredak i statistika)
Kao što smo rekli Trivial File Transfer Protocol (TFTP) je vrlo jednostavan protokol za razmjenu datoteka preko mreže.
Objasniti ćemo instalaciju i pokretanje TFTP “daemona”.
TFTP je samostalan servis ili “daemon” ali se za pokretanje oslanja na tkzv “Superserver Daemon” koji je zadužen za samo pokretanje i sigurnost TFTP-a , kao i nekih drugih manjih Linux Servisa.
Ovaj “Superserver Daemon” se zove xinetd.
xinetd sluša dolazne mrežne zahtjeve za pristup mrežnim servisima i na osnovu protokola koji se zahtjeva pokreće konkretan servis odnosno “daemon”.
Dakle osnovni identifikator koji koristi xinetd je broj porta, zapravo destination port koji označava konkretan protokol, na osnu kojeg zaključuje što pokrenuti.
xinetd ima ugrađene mehanizme za kontrolu pristupa (ACL), napredne mogućnosti logiranja te mogućnost da aktivira određeni servis u određeno vrijeme.
Nadalje on ima mogućnost limitiranja broje pokrenutih poslužiteljskih servisa te ugrađene mehanizme protiv skeniranja otvorenih portova.
Sve gore navedebo su osnovni ratzlozi zbog kojih se TFTP ne pokreće samostalno već koristi xinetd servis iznad sebe. Naime TFTP ne posjeduje niti jedan od navedenih zaštitnih mehanizama, te je simbioza s xinetd najbolja moguća.
Provjerimo da li imamo instaliran tftp-server
S već poznatim RedHat Package Manager alatom ćemo vidjeti da li je tftp-server instaliran
rpm -q tftp-server package tftp-server is not installed
O ovom slučaju nije te ćemo ga instalirati.
Kao što smo rekli on ovisi o xinetd pa ako niti on nije instaliran , instalirati ćemo ih automatski.
Sjetimo se da yum zna provjeriti da li jedan paket ovisi o nekom drugom, te će ih sve instalirati, u pravom redosljedu:
yum -y install tftp-server ... ... ... Loaded plugins: fastestmirror, refresh-packagekit, security Setting up Install Process Loading mirror speeds from cached hostfile * base: centos.muzzy.it * epel: epel.besthosting.ua ... ... .. Resolving Dependencies --> Running transaction check ---> Package tftp-server.x86_64 0:0.49-7.el6 will be installed --> Processing Dependency: xinetd for package: tftp-server-0.49-7.el6.x86_64 --> Running transaction check ---> Package xinetd.x86_64 2:2.3.14-39.el6_4 will be installed --> Finished Dependency Resolution ... ... .. Downloading Packages: (1/2): tftp-server-0.49-7.el6.x86_64.rpm | 39 kB 00:00 (2/2): xinetd-2.3.14-39.el6_4.x86_64.rpm | 121 kB 00:01 --------------------------------------------------------------------------- Total 115 kB/s | 161 kB 00:01 ... ... ... Running Transaction Installing : 2:xinetd-2.3.14-39.el6_4.x86_64 1/2 Installing : tftp-server-0.49-7.el6.x86_64 2/2 Verifying : tftp-server-0.49-7.el6.x86_64 1/2 Verifying : 2:xinetd-2.3.14-39.el6_4.x86_64 2/2 Installed: tftp-server.x86_64 0:0.49-7.el6 Dependency Installed: xinetd.x86_64 2:2.3.14-39.el6_4 Complete!
Sada vidimo da je sve instalirano.
Da bi sve radilo, potrebno je konfigurirati i xinetd i tftp-server da se podižu zajedno sa cijelim operacijskim sustavom (Runleveli 3,4 i 5).
chkconfig --level 345 xinetd on
Pošto zapravo xinetd podiže tftp-server odnosno daemon imena tftp, on nije direktno vidljiv preko naredbe chkconfig odnosno nalazi se na kraju ispod xinetd konfiguracije.
Pogledajmo kako to sada izgleda (izrezan je samo kraj ispisa naredbe od dolje):
chkconfig
... ... ...
xinetd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
... .... ...
xinetd based services:
chargen-dgram: off
chargen-stream: off
daytime-dgram: off
daytime-stream: off
discard-dgram: off
discard-stream: off
echo-dgram: off
echo-stream: off
rsync: off
tcpmux-server: off
tftp: off
time-dgram: off
time-stream: off
Viidmo da je tftp isključen
Uključimo ga
chkconfig tftp on
Pogledajmo sada :
Pokrenimo xinetd, koji će sada pokrenuti i tftp.
service xinetd start Starting xinetd: [ OK ]
Provjerimo da li se xinetd podigao, na UDP portu 69 (što znači da je zadužen za TFTP protokol koji radi na UDP portu 69).
netstat -tunap | grep xinetd udp 0 0 0.0.0.0:69 0.0.0.0:* 22259/xinetd
Dakle sve je u redu.
Konfiguracijska datoteka TFTP servisa se nalazi u datoteci /etc/xinetd.d/tftp.
Ova datoteka standardno izgleda ovako:
# default: off
# description: The tftp server serves files using the trivial file transfer \
# protocol. The tftp protocol is often used to boot diskless \
# workstations, download configuration files to network-aware printers, \
# and to start the installation process for some operating systems.
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
per_source = 11
cps = 100 2
flags = IPv4
}
Važni parametri:
user = Koji korisnik pokreće servis - po mogućnostzi ne koristiti root korisnika zbog sigurnostiserver_args = direktorij u kojemu se nalaze datoteke koje se dijele preko TFTP-a
Dakle unutar direktorija /var/lib/tftpboot/ trebaju se nalaziti sve datoteke i direktoriji koje dijelimo preko TFTP protokola.
Ako radimo bilo kakve promjene na konfiguracijskoj datoteci, potrebno je restartati xinetd servis
Na prvom računalu PC-A instalirajmo tftp klijent te se probajmo spojiti na drugo računalo koje je TFTP poslužitelj PC-B
yum -y install tftp ... ... ... Installed: tftp.x86_64 0:0.49-7.el6 Complete!
Sada kreirajmo neku datoteku na TFTP poslužitelju PC-B unutar direktorija /var/lib/tftpboot.
echo 12345 > /var/lib/tftpboot/proba.txt
Pošto smo root korisnik, uđimo u direktorij /root/, gdje će se i kopirati sve datoteke preko tftp protokola.
S prvog računala se spojimo na drugo računalo (PC-B : 10.10.10.20), preko tftp klijenta koji smo upravo instalirali.
[root@PC-A ~]# cd /root/ [root@PC-A ~]# tftp 10.10.10.20 tftp> get proba.txt tftp> quit
Pogledajmo sada datoteku koju smo “skinuli” s tftp servera:
[root@PC-A ~]# cat proba.txt 12345
Dakle to je to.
TFTP protokol podržava dvije osnovne operacije (i naredbe) nad datotekama :
get ime datoteke - download (sa TFTP poslužitelja) datoteke točno definiranog imenaput ime datoteke - upload (na TFTP poslužitelj) datoteke točno definiranog imenaNije moguće izlistavati datoteke koje se nalaze na TFTP poslužitelju, kao kod FTP protokola, već je potrebno znati točno ime datoteke.
HTTP (engl. Hypertext Transfer Protocol) je aplikacijski protokol koji je i osnova današnjeg Web-a ( World Wide Web ).
Na Linux susstavima postoji nekoliko različitih poslužitelja za HTTP protokol.
Mi ćemo koristiti jedan od najpoznatijih : Apache.
Provjerimo da li je Apache već instaliran.
U CentOS/RedHat/Fedora linuxima daemon koji je zadužen za apache poslužitelj se zove httpd.
Provjerimo da li je već instaliran:
rpm -qa httpd
Po svemu sudeći nije instaliran , pošto ga naš “RedHat Package Manager” nije pronašao na našem računalu
Instalirajmo ga (isips je skraćen za potrebe prikaza)
yum -y install httpd Loaded plugins: fastestmirror Setting up Install Process ... ... ... Resolving Dependencies --> Running transaction check ---> Package httpd.i686 0:2.2.15-47.el6.centos will be installed --> Processing Dependency: httpd-tools = 2.2.15-47.el6.centos for package: httpd-2.2.15-47.el6.centos.i686 ... ... ... Dependencies Resolved ============================================================================================================================== Package Arch Version Repository Size ============================================================================================================================== Installing: httpd i686 2.2.15-47.el6.centos updates 829 k Installing for dependencies: apr i686 1.3.9-5.el6_2 base 129 k apr-util i686 1.3.9-3.el6_0.1 base 89 k ... ... ... Installed: httpd.i686 0:2.2.15-47.el6.centos Dependency Installed: apr.i686 0:1.3.9-5.el6_2 apr-util.i686 0:1.3.9-3.el6_0.1 apr-util-ldap.i686 0:1.3.9-3.el6_0.1 httpd-tools.i686 0:2.2.15-47.el6.centos mailcap.noarch 0:2.1.31-2.el6 Complete!
Dakle sada je sve potrebno instalirano (uključujuči pakete o kojima je ovisila instalacija našeg željenog httpd paketa).
Konfiguracijska datoteka Apache odnosno httpd daemona se nalazi u datoteci :
/etc/httpd/conf/httpd.conf.
Unutar ove datoteke postoji cijeli niz konfiguracijskih parametara od kojih ćemo proči samo par osnovnih potrebnih za rad.
Dijelovi konfiguracije koji nisu u upotrebi su “zakomentirani” odnosno na početku reda se nalazi znak #.
Tako je i sa samim imenom HTTP poslužitelja, koje bi trebalo biti definirano, uz ime domene.
Editirajmo datoteku : /etc/httpd/conf/httpd.conf te pronađimo red u kojemu se nalazi
#ServerName
Ispod tog reda dodajmo naš novi red s imenom našeg HTTP poslužitelja
ServerName test.testlab.hr
Ovdje smo imenovali naš HTTP poslužitelj i njemu pripadajuču domenu.
Pogledajmo još neke od osnovnih parametara:
StartServers 8 označava koliko daemona će se pokrenuti odjednom kod podizanja HTTP poslužitelja'MinSpareServers 5 označava minimalni broj poslužitelja koji će dodatno biti pokrenutiMaxClients 256 označava ogranićenje broja spojenih klijenata na svaki pojedini HTTP poslužiteljski daemonPokrenimo sada “Apache”:
service httpd start Starting httpd: [ OK ]
Provjerimo da li je stvarno sve u redu (HTTP protokol radi na TCP portu 80):
netstat -tunap | grep httpd tcp 0 0 :::80 :::* LISTEN 1198/httpd
Vidim oda je TCP port 80 , za koji je zadužen daemon httpd aktivan.
Dakle sve je u redu sa strane mreže.
Sada pogledajmo što se događa sa strane Linux procesa:
ps -ef | grep httpd root 1198 1 0 19:23 ? 00:00:00 /usr/sbin/httpd apache 1200 1198 0 19:23 ? 00:00:00 /usr/sbin/httpd apache 1201 1198 0 19:23 ? 00:00:00 /usr/sbin/httpd apache 1202 1198 0 19:23 ? 00:00:00 /usr/sbin/httpd apache 1203 1198 0 19:23 ? 00:00:00 /usr/sbin/httpd apache 1204 1198 0 19:23 ? 00:00:00 /usr/sbin/httpd apache 1205 1198 0 19:23 ? 00:00:00 /usr/sbin/httpd apache 1206 1198 0 19:23 ? 00:00:00 /usr/sbin/httpd apache 1207 1198 0 19:23 ? 00:00:00 /usr/sbin/httpd
Vidimo da je osam procesa pokrenuto od strane korisnika apache kako bi i trebalo (oni su zaduženi za komplentnu funkcionalnost HTTP poslužiteljkog protokola).
Vidimo i jedan proces pokrenut od korisnika root ovo je isto normalno jer ovaj korisnik (root= administrator na Unix/Linux sustavima - sjetimo se) pokreće inicijalni proces koji otvara TCP port 80.
Ovo je važno zbog tri stvari :
root korisnik ima pravo na sustavo otvarati portove koji su ispod 1023root korisnik, pokreće sve ostale child ili pod procese koij su zapravo odgovorini za http poslužitelj i brine se o podizanju novih prema potrebi.
Pogledajmo stablo procesa httpd:
pstree -p | grep httpd
|-httpd(1198)-+-httpd(1200)
| |-httpd(1201)
| |-httpd(1202)
| |-httpd(1203)
| |-httpd(1204)
| |-httpd(1205)
| |-httpd(1206)
| `-httpd(1207)
Sada je sve puno jasnije - u zagradama su “Process ID” ili PID brojevi svakog procesa. Vidljivo je da je jedan proces pokrenuo 8 podprocesa.
Podsjetimo se da su PID brojevi jedinstveni identifikacijski brojevi za svaki proces unutar Linuxa).
Pošto nam je ovih 8 procesa previše i nepotrebno, pošto je oknfigurirano da jedan proces može obrađivati do 256 korisnika, što ukupno znači 8×256=2048 istovremenih korisnika a mi ne očekujemo toliku navalu na naš HTTP poslužitelj, smanjiti ćemo uvu brojku.
Ponovno editirajmo datoteku : /etc/httpd/conf/httpd.conf te pronađimo redove u kojima se nalazi:
StartServers 8 MinSpareServers 5
Te promijenio ovaj broj u 2 za oba parametra jer želimo d ase pokrenu samo 2 daemona i maksimalno također dva rezervna (MinSpareServers) odnosno ukupno će biti pokrenuta samo dva.
StartServers 2 MinSpareServers 2
Snimimo datoteku te restartajmo daemon.
service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ]
Provjerimo koliko sada imamo httpd procesa :
ps -ef | grep httpd root 1671 1 0 19:45 ? 00:00:00 /usr/sbin/httpd apache 1673 1671 0 19:45 ? 00:00:00 /usr/sbin/httpd apache 1674 1671 0 19:45 ? 00:00:00 /usr/sbin/httpd
Uspjeli smo, pokrenuta su samo dva, tako da se na naš novi Web poslužitelj sada istovremeno može spojiti 512 korisnika.
Automatsko pokretanje Apache http poslužitelja
Ako želimo da se naš Apache http poslužitelj pokreće kod svakog pokretanja ili restarta Linux sustava, to je jednostavno :
chkconfig httpd on
I to je to.
Što je (engl.) Firewall ili Vatrozid ?.
Vatrozid ili Firewall predstavlja uređaj ili tehnologiju odnosno u našem slučaju servis (u linux terminologiji tkzv. “Daemon”) koji prati i kontrolira mrežni promet, na nivou svakog mrežnog paketa. Sljedeći korak rada i osnovna funkcionalnost firewall-a je donošenje odluke, na osnovi zadanih kriterija, što napraviti sa svakim mrežnim paketom koji dođe do našeg računala (preciznije, svake pojedine mrežne kartice):
Možemo reći da je funkcionalnost Firewalla kontroliranje mrežnih paketa koji dolaze, prolaze ili izlaze kroz naše računalo osnosno zapravo kroz mrežne slojeve unutar kernela operativnog sustava.
Dakle firewall koristimo kada želimo ograničiti pristup na neki mrežni servis (protokol). Primjerice želimo ograničiti pristup za SSH protokol na našem poslužitelju i to tako da dozvoljavamo SSH promet samo s određenih IP adresa, koje su unutar naše mreže. Drugi primjer može biti ograničenje broja otvorenih konekcija (na recimo 100 u sekundi) na naš Web poslužitelj na TCP portu 80 (http protokol). Nadalje, možemo zabraniti sav mrežni promet, prema našem poslužitelju, sa strane interneta, osim za HTTP protokol (TCP port 80) itd..
Za ovu funkcionalnost, u Linuxu se brine sam kernel operativnog sustava ali sve kriterije za obradu i filtriranje mrežnih paketa mu proslijeđuje servis (i naredba): iptables.
Pošto je Firewall već instaliran s vašim Linuxom, potrebno ga je samo pokrenuti.
Ručno pokretanje Firewalla :
service iptables start
ili
/etc/init.d/iptables start
Ručno zaustavljanje Firewalla :
service iptables stop
ili
/etc/init.d/iptables stop
Ručni restart Firewalla :
service iptables restart
ili
/etc/init.d/iptables restart
Ako želimo da se Firewall starta kod podizanja Linuxa, napravimo sljedeće:
chkconfig --level 345 iptables on
(Možete se podsjetiti kako se upravlja sa servisima odnosno daemonima jer je ovo standardna metoda automatskog pokretanja)
Ili ako ne želimo da se Firewall starta kod podizanja Linuxa, napravimo sljedeće:
chkconfig --level 345 iptables off
Također možemo raći da je iptables filter mrežnog prometa (paketa).
On se sastoji od nekoliko tipova tablica (engl. tables), koje se sastoje on nizova ili tokova podataka (engl. chain), a na svaki od njih se primjenjuju pravila rada(engl. rules).
Tablice su podjeljene u nekoliko kategorija :
Operacije tj. filteri ili nizovi (engl. chains) su podjeljeni u nekoliko grupa:
Za sada ćemo se fokusirati na Filter tablice. Filter tablica može koristiti tri operacije/filtera/niza (engl. chain) :
Sada svaki paket mora proći kroz provjeru pravila (engl. rules) odnosno kriterija koji mogu biti :
syslog servis)
Pogledajmo logički dijagram toka Linux firewall-a i to samo dijela Filter tablice:
Potrebni su nam i prekidači kojima definiramo radnju za određeno pravilo:
Osim gore navedene provjere postoje i dodatni kriteriji provjere :
Sada kada znamo osnove, potrebno je razumjeti i načine dodavanja, brisanja i mjenjanja pravila Firewall-a:
Kkada kreiramo pravila (engl. rule), ona se dodaju prema redoslijedu prema kojem smo ih kreirali, prema brojevima, te nije svejedno koje pravilo je prije kojega : Ako recimo prvo imamo pravilo da se svi paketi odbacuju (DROP) sva pravila nakon toga će postati nevažna jer će se svi paketi odbacivati. Ali ako s druge strane prvo dodamo pravila za pojedine protokole i sl. a tek na kraju pravilo da se sve ostalo odbaciju tada iamo drugu priću.
Ručno dodavanje IPTABLES pravila
Dodavanje prava pristupa za pojedinu IP adresu, za sve protokole. Dodajmo pravo IP adresi 10.10.10.1 da smije pristupiti našem Linux računalo, preko bilo kojeg protokola (porta).
iptables -A INPUT -s 10.10.10.1/32 -j ACCEPT
Dodavanje prava pristupa za pojedinu IP adresu, za samo točno određeni protokol (SSH), TCP port 22. Dodajmo pravo IP adresi 10.10.10.1 da smije pristupiti našem Linux računalo, samo preko protokola SSH (TCP porta 22).
Dakle ovdje koristimo –dstport odnosno “Destination port” 22 koji označava i mrežni servis/protokol (SSH).
iptables -A INPUT -s 10.10.10.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
Dodavanje prava pristupa za cijelu mrežu (20.20.20.0 / 24), za sve protokole.
iptables -A INPUT -s 20.20.20.0/24 -j ACCEPT
Na kraju, kada smo završili dodavanje prava svime kojima smo željeli, moramo kreirati pravilo da se sve ostalo odbacuje. To čemo napraviti sa sljedećom naredbom:
iptables -A INPUT -j DROP
Moramo biti svjesni činjenice da se pravila dodaju redoslijedom kojim ih i upisujemo. Prema tome, važno je koje pravilo primjenjujemo prije kojega, jer ih Firewall i provjerava u istom redosljedu.
Obrišimo sva pravila, privremeno (do restarta računala):
iptables –flush
Sada ćemo dodati nekoliko ulaznih pravila (INPUT) iz primjera gore:
iptables -A INPUT -s 10.10.10.1/32 -p tcp -m tcp --dport 22 -j ACCEPT iptables -A INPUT -s 20.20.20.0/24 -j ACCEPT
Pogledajmo kako to izgleda, s ispisom rednih brojeva pravila:
iptables -L --line-numbers -n Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT tcp -- 10.10.10.1/32 0.0.0.0/0 tcp dpt:22 2 ACCEPT all -- 20.20.20.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
Vidiljiv je redoslijed pravila (num) i pravila koja smo dodali (1 i 2).
FORWARD i OUTPUT nismo dirali prema tome nema niti pravila za njih, te je za njih sve dozvoljeno bez ograničenja.
Probajmo sada ubaciti novo pravilo između 1 i 2.
Razlik aje u tome da nismo koristili prekidač -A (Append - dodaj) već -I (Insert - ubaci) te smo naveli redni broj pravila na čije mjesto se ubacujemo a staro previlo s tim rednim brojem pomičemo dolje.
Dodajemo pravila u kojemu računalu 10.10.10.1 dodajemo prava pristupa na TCP port 80 (HTTP).
iptables -I INPUT 2 -s 10.10.10.1/32 -p tcp -m tcp --dport 80 -j ACCEPT
Pogledajmo sada novu tablicu:
iptables -L --line-numbers -n Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT tcp -- 10.10.10.1/32 0.0.0.0/0 tcp dpt:22 2 ACCEPT tcp -- 10.10.10.1/32 0.0.0.0/0 tcp dpt:80 3 ACCEPT all -- 20.20.20.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
Brisanje pojedinog pravila
Sada ipak obrišimo pravilo koje smo dodali (sada je to Br.2.)
Prekidač -D govori da želimo obrisati pravilo i to INPUT br. 2.
iptables -D INPUT 2
Pogledajmo ponovno tablicu s parvilima firewalla>
iptables -L --line-numbers -n Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT tcp -- 10.10.10.1/32 0.0.0.0/0 tcp dpt:22 2 ACCEPT all -- 20.20.20.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination
Vidljivo je da više nema starog pravila broj 2. većda je na njegovo mjesto došlo pravilo koje je bilo broj 3.
Snimanje firewall pravila koja smo ručno upisali
service iptables save
S gore navedenom naredbom snimili smo sva pravila koja smo ručno unjeli, te će biti aktivna kod sljedećeg restart računala.
Ova pravila se snimaju u datoteku :
/etc/sysconfig/iptables i to u malo drugačijem formatu negu ručnu upisane naredbe (zapravo samo bez iptables naredbe).
Restart Firewall
Firewall možemo restartat sljedećom naredbom:
service iptables restart
U procesu restarta firewall servisa (daemona) on ponovno učitava sadržaj datoteke : /etc/sysconfig/iptables te se primjenjuju sva pravila koja su unutar datoteke (ako ih ima).
Kako to sve radi?
U pozadini za svo filtriranje i obradu paketa, na najnižem nivou je zadužen linux kernel, koji za svaki pojedini mrežni protokol, koristi “Netfilter” framework, koji omogućava dublje baratanje s mrežnim paketima.
Netfilter potom za svaki specifičan mrežni protokol poziva “Netfilter module” koji zapravo odrađuju (i obrađuju) specifične zadatke.
Podsjetimo se Linux mrežnog modela (pogledajte dio Netfilter podsustava):
Pogledajmo sada samo dio “Netfilter podsustava”
Ukratko ćemo se upoznati s naprednim mrežnim tehnologijama i objasniti ćemu one služe.
Promet između VLAN-ova nije moguć bez Layer 3 uređaja (dakle bez routera ili Multilayer Switcheva).
TRUNK-ovi (prema Cisco terminologiji) omogućavaju “propuštanje” više istovremenih VLAN-ova, kroz određeni interface. Standardno svaki interface može biti isključivo samo u jednom VLAN-u. U slučaju potrebe da kroz određeni interface (port na switchu/routeru/…) moramo ili želimo propuštati više VLAN-ova, moramo interface konfigurirati kao trunk te odabrati neki od “trunk” protokola, koji pojednostavljeno, na svaki mrežni paket lijepe VLAN-ID, tkzv “tag” ili “naljepnicu” , sve dok putuje kroz interface koji je u trunk mod-u.Dakle kada paket koji ima VLAN tag, dođe do “normalnog” interface-a, u točno određenom VLAN-u (čiji “tag/ID” nosi), taj tag se skida i paket dalje nastavlja put kao običan/normalan. Postoji nekoliko protokola za trunk-ing a to su:
Kako to radi na pojednostavljenom modelu, vidljivo je na slici.
Pojmovi “Bonding”, “Agregacija” ili “Ether Channel” označavaju razne metode “povezivanja” više fizičkih mrežnih kartica u jednu logičku mrežnu karticu.Ta logička mrežna kartica ima veću ukupnu propusnost (engl. Throughput) od pojedine fizičke mrežne kartice te omogućava redundanciju odnosno ispad jedne (ili više) fizičkih mrežnih kartica, bez prekida u radu na nivou logičke mrežne kartice a i same mrežne komunikacije.
Kako radi Linux “Bonding”:
Postoji nekoliko različitih modova rada “Bonding”-a, od kojih neki zahtjevaju i rekonfiguraciju sa strane Switcha na koji su spojeni, te naravno i podršku za protokole koji su potrebni za ovakav rad (na strani switcha).
Logička shema povezivanja je vidljiva na slici:
Na većini Linuxa, od kernela 2.6.32, dostupni su sljedeći modovi rada “Bonding”-a:
mode=0 (balance-rr) Round-robin load balancing način rada :
Šalje pakete sekvencijalno od prve fizičke “engl. slave” mrežne kartice, do zadnje.
Prednosti : Load Balancing i tolerancija na ispad
Nije potrebna konfiguracija switcha
mode=1 (active-backup) Active-backup način rada:
Samo prva mrežna kartica (slave) je aktivna. Druga (slave) postaje aktivna samo isključivo ako je trenutna aktivna neispravna. MAC adresa “Bond”-a je vidljiva samo na jednom portu da se ne stvaraju problemi na strani switcha.
Prednosti : tolerancija na ispade
Nije potrebna konfiguracija switcha
mode=2 (balance-xor) XOR način rada:
Šalje pakete bazirano na algoritmu [(Source MAC XOR Destination MAC) modulo ukupan broj “slave” kartica]. Ova metoda odabire istu karticu (slave) za svaku odredišnu MAC adresu.
Prednosti : Load Balancing i tolerancija na ispad
Nije potrebna konfiguracija switcha
mode=3 (broadcast) Broadcast način rada:
Šalje pakete na sve mrežne kartice (slave)
Prednosti : tolerancija na ispade
Nije potrebna konfiguracija switcha
mode=4 (802.3ad) Koristi se IEEE 802.3ad protokol za dinamičku agregaciju (bonding) sa switchem.
Kreira agregacijsku (bonding) grupu koja dijeli istu brzinu i duplex na svim mrežnim karticama. Koriste se sve mrežne kartice istovremeno prema 802.3ad protokolu.
Prednosti : Load Balancing i tolerancija na ispad
Potrebna je rekonfiguracija switcha te switch mora podržavati protokool 802.3ad
mode=5 (balance-tlb) Adaptivni “Transmit load balancing”:
Šalju se paketi koji su distribuirani prema trenutnom opterečenju na svakoj mrežnoj kartici (slave). Dolazni promet se prima preko jedne kartice,a ako je ona neispravna druga kartica preuzima ulogu primatelja.
Prednosti : Load Balancing i tolerancija na ispad
Nije potrebna konfiguracija switcha
mode=6 (balance-alb) Adaptivni “Load balancing”:
Uključuje prethodni mod rada (mode=5) i dodaje “receive load balancing” tj. balansiranje primatelja tj. kartica koje primaju promet Dakle dolazni load balancing (receive load balancing) se postiže time da bonding upravljački program barata s ARP porukama tj. presreće ih u odlasku prema mreži i mijenja njihovu source MAC adresu. Na taj način svaki paket ima kao Source MAC adresu, adresu druge fizičke mrežne kartice unutar bond-a, pa će na taj način i dolazni paketi ići svaki na drugu fizičku mrežnu karticu. NA ovaj način se dobiva i load balancing odlaznog prometa.
Nije potrebna konfiguracija switcha
Ovo su samo osnovni principi i modovi rada Linux bonding-a.
Engl. “Network Namespace” odnosno izolirani mrežni prostor, koristi se za kreiranje potpuno odvojene i izolirane virtualne mreže unutar fizičkog računala.
Svaki izolirani mrežni prostor se ponaša poput mreže svakog zasebnog virtualnog računala,a unutar njega postoje :
Dakle možemo reći da je ovo virtualizacija mreže ali unutar jednog Linux OS-a i njegovog kernela.
Ova tehnologija se najčešće koristi za izolaciju mreže unutar raznih Linux kontejnera,na sličan način kako ih koriste i : LXC, OpenVZ ili Docker-a.
Više informacija o ovim tehnologiama pogledajte na :
LXC https://linuxcontainers.org/
OpenVZ https://openvz.org/Main_Page
Docker http://www.docker.com/
Pogledajmo još nekoliko činjenica o Network Namespace-u:
Kratak (p)opis mrežnih uređaja i pojmova o kojima smo pričali:
Hub-ovi ili koncentratori su se koristili za spajanje više uređaja (računala/poslužitelja , …) na dijeljeni mrežni medija (pr. bakar [UTP]) mrežu. Oni rade poput “Repeater-a” dakle oni samo pojačavaju oslabljeni signal kroz mrežu . Oni su prema OSI modelu na prvo sloju (Layer 1).
Oni nemaju nikakvu logiku rada već samo pojačavaju i šalju signal na mrežu. HUB-ove su zamjenili switchevi (pogledajte prethodno poglavlje “Nasljeđe prošlosti” i CSMA/CD protokol koji je izmišljen zbog HUB-ova i problema koje donose).
Bridge uređaji su se koristili za spajanje više mreža povezanih HUB-ovima. Oni su odvajali segmente mreža spojenih HUB-ovima, pošto rade na OSI sloju 2 (Layer 2). Bridge-evi su zapravo switchevi ali sa vrlo malim brojem portova. Bridgeve su zamjenili Switchevi tj. switchevi su bridgevi sa velikim brojem portova.
Switchevi ili preklopnici su uređaji koji rade na OSI sloju 2 (Layer 2) (postoje i Multilayer switchevi).
Switchevi odlučuju o preklapanju na osnovu MAC adresa, koje se nalaze unutar svakog paketa podataka, koji putuje mrežom.Switchevi imaju puno portova (mrežnih utičnica) na koje se spajaju računala.
To u praksi znači da switch za svaki paket koji primi, provjeri odredišnu (destination) MAC adresu i onda na osnovu svoje tablice MAC adresa odlučuje na koji port (u konačnici kojem računalu) će proslijediti taj paket. Ako destination MAC adresa paketa nije u MAC adress tablici tada switch traži preko ARP poruke (koja je broadcast - svi na mreži ju primaju) tko ima tu MAC adresu te osvježava svoju MAC tablicu. Nakon toga se taj mrežni paket šalje na ispravan port. Switchevi preklapanje paketa (s porta na port) odrađuju brzinama u okvirima mikrosekundi (µs).
Routeri ili usmjerivači su uređaji koji rade na OSI sloju 3 (Layer 3) i/ili OSI sloju 4 (Layer 4). Oni obično povezuje udaljene lokacije – veza između LAN-a i WAN-a. Njihov princip rada je sličan kao kod switcheva samo što oni umjesto MAC adresa provjeravaju IP adrese. Svaki paket koji dođe do routera, router provjeri (pročita destination IP) te pogleda u svoju routing tablicu (slčno kao MAC tablica kod switcha) da li zna kamo ga poslati.
Router također ima DEFAULT ROUTE-u (slično kao Defaul Gateway), ona služi u slučajevima kada Router ne zna kamo s nekim paketom, onda ga on šalje na mrežni interface (serijski link, ethernet, … ), na koji mu pokazuje default route-a.
Routeri su puno složeniji od Switcheva i imaju posebne routing protokole na osnovu kojih razmijenjuju znanje o dostupnosti određenih lokacija (route-a), njihovoj brzini i sl. Routeri obično povezuju udaljene lokacije (LAN-ove preko WAN mreža). Routeri obično imaju manje portova (mrežnih interface-a), od switcheva.
Za obradu svakog mrežnog paketa Routeri koriste centralni procesor (CPU), te je zbog toga prosječno vrijeme obrade svakog mrežnog paketa mjereno u milisekundama (ms).
Multi-layer switch-evi su uređaji koji rade na OSI slojevima (Layerima) 2,3 i 4. Dakle prema logici oni su uređaji koji objedinjuju funkcionalnost stndardnih switcheva (Layer 2) i Routera (Layer 3 i 4).
Multi-layer switch-evi mogu odluke o switching-u/routingu odraditi na osnovi :
source/destination MAC adrese u Layer 2 ili
source/destination IP adrese u Layer 3 ili
source/destination porta u Layer 4.
Ono što je specifično za njih je da oni preklapanje (switching) ili usmjeravanje (Routing) paketa odrađuju brzinama koje su inaće moguće samo na Switchevima, i to bez upotrebe centralnog procesora (CPU). Naime oni ove odluke donose upotrebom tkzv ASIC IC-ova. ASIC (Application Specific Integrated Circuit) je IC (“chip”) koji se ovisno o izvedbi i modelu switcha praktično nalazi na svakom portu (interface-u). On je u mogućnosti unutar granica milisekundi: primiti, obraditi i proslijediti svaki mrežni paket.
Firewalli su uređaji koji se stavljaju između javnih dijelova mreže i unutarnje (zaštićene) mreže. Njihova namjena je blokiranje neželjenog prometa u oba smjera (pr. sa interneta na unutarnju mrežu tvrtke i obratno). Oni također rade na Layer 3 nivou i provjeravaju svaki paket koji dođe do njih ali i na Layer 4 (TCP/UDP portovi - dakle prepoznaju protokole) a često znaju filtrirati pakete do nivoa aplikacija (Layer 7). Oni sadrže access liste u kojima se nalaze dozvole za određene IP adrese i protokole tako da se mogu točno definirati prava pristupa: prema pojedinim IP adresama (141.29.125.5, 141.29.125.55, …), opsegu adresa (141.29.125.*, 141.29.124.*), protokolima (http, ftp, telnet, ntp, …) /portovima (21,23,25,55,78, …), ili nekim drugim kriterijima kome se dozvoljava pristup izvana i to točno na koje računalo/server ili sl. unutar tvrtke i prema van.
Firewalli obično imaju 2 interface –a: Inside i Outside:
Inside i Outside pojmovi podrazumijevaju unutarnje (inside) mrežne priključke kod firewalla, na koje/i su spojena računala ili mrežna oprema koja nije vidljiva ostatku mreže. Outside su mrežni priključci koji su vidljivi svima na mreži (naravno i na njih se može ograničiti pristup).
DMZ (DeMilitarised Zone) ili demilitarizirana zona je zona koja se nalazi između interneta i intraneta (interneta i tvrtkine unutarnje mreže ). Poslužiteljii i uređaji koji se nalaze unutar te zone imaju malo veća prava pristupa nego da se nalaze na intranetu ali imaju određene restrikcije od i prema internetu, zbog svoje zaštite. Razna oprema se stavlja u DMZ zbog potreba razvoja projekata kojima je potreban direktan pristup internetu ili za potrebe Web hostinga, E-mail poslužitelja i sl. Dakle u DMZ zone čessto se stavljaju Web (http/https) poslužitelji, E-mail poslužitelji, FTP poslužitelji, DNS poslužitelji i sl.
Proxy poslužitelji (Server) su uređaji koji se stavljaju nakon Firewalla i Routera prema unutarnjoj mreži (intranetu) te se preko njih računala spajaju na internet. Oni u pravilu imaju access liste u kojima su definirane IP adrese računala ili korisnička imena korisnika kojima se dopušta pristup internetu prema određenim pravilima. Na Proxy poslužitelju se može ograničiti pristup raznim sadržajima na internetu.Oni također mogu ubrzati pristup internetu snimanjem sadržaja stranica kojima se pristupa na internetu, lokalno na disk (Cache-ing Proxy ).
VPN (Virtual Private Network) su privatne mreže koje se fizički nalaze unutar javnih mreža, kaošto je internet. Korištenjem VPN mreže korisnik može sa udaljene lokacije, koja ima pristup internetu, putem VPN-a pristupiti mrežnim resursima svoje tvrtke, kao da je fizički unutar njene mreže. VPN radi tako da se između udaljenog korisnika i tvrtkine mreže (na osnovu logina/lozinke i ključeva) ostvaruje kriptirani (šifrirani), tunel kroz koji putuju podaci. Te podatke ne može vidjeti nitko osim dvije strane koje su otvorile VPN tunel. U globalu razlikujemo 3 tipa VPN-a:
Zbog potrebe za praćenjem stanja raznih komponenti sustava, logiraju odnosno snimaju se određene aktivnosti na sustavu u tkzv. “log” datoteke.
U Linuxu je moguće logirati više-manje sve, na vrlo jednostavan način koji se svodi na zapisivanje u neku od za to predviđenih datoteka. Standardno se datoteke za logiranje nalaze u /var/log/ direktoriju. Većina tih datoteka je u tekstualnom formatu (uz nekoliko iznimki).
Pogledajte kratku listu log datoteka s opisima:
dmesg.lastlog se može vidjeti sadržaj ove datoteke.last može se vidjeti formatirana statistika iz ove datoteka , također i sa utmpdump /var/log/btmp.who čita iz ove datoteke. Sadržaj možemo vidjeti sa : utmpdump /var/log/wtmp.
Primjer
Pošaljimo poruku koja će biti vidljiva unutar shell-a te će se zapisati u sistemsku log datoteku /var/log/messages, koju možemo pregledati i s naredbom dmesg.
Poruka neka bude ”–TEST–“.
Naredba za ovu namjenu je logger , prekidać -s označava da će osim zapisa u /var/log/messages , poruka bit iprikazana i u shellu (komandnolinijskoj ljusci).
logger -s "--TEST--" root: --TEST
Provjerimo da li se sve upisalo u sistemsku log datoteku.
tail /var/log/messages ... ... ... ... ... ... Sep 20 17:01:24 Server1 root: --TEST--
U određenim situacijama može doći do drastičnih problema u radu Linux sustava a one koje rezultiraju fatalnim greškama i do problema u radu Linux kernela te blokiranja cijelog računala. Srećom Linux ima mogućnost riješiti ove probleme na način da nam omogućava snimanje stanje kompletne memorije koje je snimljeno u trenutku navedenih grešaka te pohranom iste na lokalni disk ili preko mreže na neko drugo računalo. Takvo stanje memorije se naknadno može analizirati te otkriti uzrok greške.
Upoznajmo se prvo s pojmom Kernel panic
“Kernel panic” je definirana radnja koju pokreće operacijski sustav u trenutku kada detektira interne fatalne greške od kojih se ne može oporaviti. Ovaj pojam se koristi kako za Linuxe tako i za sve UNIX-oidne operacijske sustave. Ekvivalent ovakvim greškama i Windows svijeta je Tzv “Stop Error” znan i kao “Blue Screen of Death”.
U slučajevima kada se Linux kernel sruši u slučaju neke fatalne greške sustava, kdump je u mogućnosti sačuvati konzistenciju sustava podizanjem (Engl. Booting) drugog, posebnog Linux kernela. Ovaj “posebni” Linux kernel se obično naziva: “dump-capture kernel” a koristi se za eksportiranje i snimanje stanja RAM memorije od kernela koji se srušio. Ovo snimanje stanja memorije se zove “Memory dump”.
S obzirom na činjenicu da se u trenutku rušenja primarnoga Linux kernela nešto fatalno dogodilo, ne bi bilo pametno pokušavati snimiti stanje memorije korištenjem istog tog kernela jer je upitno kako bi to završilo i da li bi se uopće takva operacija mogla izvršiti (isti se kernel i srušio zbog nekog problema).
kdump je funkcionalnost Linux kernela koja kreira “Crash Dump” u slučaju kada se kernel sruši ili zablokira uslijed fatalne greške. Kada je ova funkcija pokrenuta kdump eksportira sliku memorije (Engl. Memory image)
na medij prema izboru i to automatski :
/proc/vmcoreU svakom slučaju ova slika stanja memorije se eksportira kao “Executable and Linkable Format” (ELF) objekt, te se naknadno može analizirati.
Slika memorije (Engl. Memory image) koju izrađuje kdump se zove vmcore.
Dakle naš kdump koristi metodu dvostrukog kernela koji u radu koristi kexec za pokretanje našeg “dump-capture kernel”-a isti tren kada se dogodi neka fatalna greška na trenutno aktivnom (primarnom) linux kernelu.
Naime kexec ima mogućnost pokretanja novog (ovog posebnog) Linux kernela preko postojećeg koji se srušio i to bez potrebe da se to radi na standardan način učitavanjem “Boot loader”-a i svih standardnih procedura od strane BIOS-a ili UEFI-ja. Ovo učitavanje preko postojećeg ipak znači da se postojeći kernel koji se srušio ne dira niti se diraju memorijske adrese koje su bile u upotrebi od strane srušenog kernela jer bi to značilo inkonzistenciju podataka te bi ova cijela procedura bila uzaludna.
U praksi postoje čak dva moguća modela ovakvog rada :
U većini slučajeva se koristi pristup s ovim posebnim kernelom
Kako to radi ?
Sadržaj RAM memorije se prilikom pokretanja operacijskog sustava popunjava te se u nju prvo učitava primarni kernel koji podiže ostatak operacijskog sustava. Istovremeno se učitava i onaj mali “dump-capture” kernel u svoj dio RAM memorije koji se rezervira SAMO za njega. Stoga je nemoguće da RAM memorija koja je rezervirana i zauzeta od strane ovog posebnog kernela uopće bude dostupna primarnom Linux kernelu ili njegovim procesima odnosns programima, bilo namjerno ili slučajno. Ovo je važno jer želimo funkcionalan zaseban kernel koji nitko ne može “pobrkati” čak niti u slučaju kada se dogodi “rušenje” primarnog kernela.
Dodatno, neke arhitekture procesora, poput x86 i ppc64 traže da se pri inicijalizaciji sustava unaprijed rezervira fiksna veličina RAM memorije za proces pokretanja kernela, bez obzira o poziciji gdje se ta memorija nalazila. U tom slučaju kexec kopira i taj dio RAM memorije tako da je on dostupan našem “dump-capture” kernelu. Veličina ove prealocirane RAM memorije, kao i opcionalno njena pozicija, mogu se definirati u kernel “boot” parametrima sustava: crashkernel.
Koji je proces pokretanja ?
Nakon što se primarni kernel pokrenuo, kexec utility (naredba) učitava i “dump-capture” kernel (kernel image) i njegov pripadajući “initrd” image (RAM disk image), koji se učitavaju u gore navedeni rezervirani i izolirani dio RAM memorije namijenjen za drugi kernel.
Postoje i dodatni utility programi koji podržavaju kdump mehanizme.
kdump funkcionalnost, zajedno sa kexec-om je postala standardno itegrirana s Linux kernelom od verzije 2.6.13, koja je razvijena 29.08.2005.g.
Da bi sve ovo radilo potrebne su tri stvari:
kexec
Kernel učitava kernel
Pokretanje odnosno učitavanje novog kernela iz postojećeg kernela nije u potpunosti podržano u kernelima starijim od 2.6.26 jer je do tada bilo moguće pokretanje kernela s jedne jedine adrese u memoriji, koja je naravno bila zauzeta s prvim kernelom koji se učitao. Dodatni problem je i u tome što je novi (dodatni) kernel koji se mora učitati, morao imati i zaštitu od direktnog pristupa RAM memoriji (DMA pristup).
Za DMA pogledajte poglavlje "Napredno: DMA (Direct Memory Access)"
Dodatno, novi “dump-capture” kernel mora imati mogućnost pristupa određenim informacijama starog kernela, i to od trenutka kada se stari kernel srušio. Prema tome novi kernel mora imati i informaciju na kojim memorijskim lokacijama (adresama) se nalazi stari kernel.
Za sve ove kao i mnoge druge radnje je zadužena naredba kexec kao i njeni pripadajući sistemski pozivi ( kexec_load ), preko kojih uopće dolazi do potrebnih informacija. kexec na kraju krajeva i učitava odnosno pokreće novi kernel u rezervirano i izolirano područje memorije.
Konfiguracija kexec i kdump para je specifična za svaku distribuciju Linuxa. Mi ćemo se držati RedHat/CentOS distribucija (mada i među njima ima razlika u konfiguraciji).
Početak
Za početak je potrebno instalirati navedene alate potrebne za ovakav rad. Ovi alati/programi obično dolaze unutar softverskog paketa koji se obično zove kexec-tools.
U daljem tekstu navesti ćemo primjere za RedHat Enterprise Linux (RHEL) pošto je on u najvećoj mjeri pripremljen za ovakav rad. Što se tiće CentOS Linux i kod njega je moguće konfigurirati sustav na ovakav način ali uz dodatne korake koji prethode ovima za RedHat Enterprise Linux.
1. Provjerimo trenutnu verziju kernela
uname -a Linux localhost.localdomain 2.6.32-642.1.1.el6.x86_64 #1 SMP Tue May 31 21:57:07 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Dakle imamo kernel 2.6.32-642.1.1.el6.x86_64
2. Provjerimo da li je kernel kompiliran sa svim potrebnim opcijama (za svaki slučaj).
egrep "KEXEC|CRASH|CAL_S" /boot/config-2.6.32-642.1.1.el6.x86_64 CONFIG_KEXEC=y CONFIG_KEXEC_AUTO_RESERVE=y CONFIG_CRASH_DUMP=y CONFIG_KEXEC_JUMP=y CONFIG_PHYSICAL_START=0x1000000 CONFIG_CRASH=y
Sve tražene opcije su uključene u trenutni kernel pa idemo dalje
3. Provjerimo s kojim opcijama vezanim za “Crash kernel” je naš kernel pokrenut:
grep crash /proc/cmdline BOOT_IMAGE=/vmlinuz-2.6.32-642.1.1.el6.x86_64 root=UUID=fe0f5d06-afb2-42a6-b653-e93f0397538d ro crashkernel=auto nomodeset rhgb quiet LANG=en_US.UTF-8
4. Vrijeme je za instalaciju kexec-tools-a
yum -y install kexec-tools
5. Sada je potrebno uključiti kdump deamon kod podizanja sustava te ka odmah i pokrenuti
Za RedHat 6.x ili CentOS 6.x
chkconfig kdump on service kdump start
Provjerimo da li se sve pokrenulo kako treba
/etc/init.d/boot.kdump status kdump kernel loaded running
Dakle sve je ok (“running”)
Za RedHat 7.x ili CentOS 7.x
systemctl start kdump systemctl enable kdump
Provjerimo da li se sve pokrenulo kako treba:
systemctl status kdump kdump.service - Crash recovery kernel arming Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled) Active: active (exited) since Mon 2016-05-30 20:15:28 CEST; 1 weeks 3 days ago Main PID: 2526 (code=exited, status=0/SUCCESS) CGroup: /system.slice/kdump.service May 30 20:15:28 server01 systemd[1]: Starting Crash recovery kernel arming... May 30 20:15:28 server01 kdumpctl[2526]: kexec: loaded kdump kernel May 30 20:15:28 server01 kdumpctl[2526]: Starting kdump: [OK] May 30 20:15:28 server01 systemd[1]: Started Crash recovery kernel arming. Jun 09 23:10:21 server01 systemd[1]: Started Crash recovery kernel arming.
Sve izgleda u redu.
6. Provjerimo da li imamo potrebne naredbe:
which kexec /sbin/kexec
i
which kdump /sbin/kdump
Sjetimo se da kdump startup skripta kod podizanja sustava učitava “crash kernel” u memoriju
7. Možemo restartati sustav te provjerimo da li se stvarno u RAM memoriji nalazi “crash kernel”
grep -i crash /proc/iomem 03000000-0b0fffff : Crash kernel
Vidimo memorijske adrese na kojima se nalazi učitan “crash kernel” prema tome sve je u redu.
Sve je spremno.
Konfiguracija kdump-a.
Konfiguracija kdump-a se nalazi u datoteci /etc/kdump.conf tako da je moguće konfigurirati ili optimizirati sve potrebno (ako vaše potrebe ili želje odstupaju od standardnog)
Standardno se “Core dump” datoteke snimaju u direktorij : /var/crash/, na lokalni tvrdi disk.
Ručno pozivanje “crash dump”-a
Za ručno pozivanje crash dump-a tj. snimanje stanja cijele RAM memorije (sa svim programima) od trenutnog kernela (potencijalno problematičnog) je moguće sa SysRQ pozivima.
Pogledajte poglavlje : "SysRq i Print Scrn tipka"
Ukratko ovako:
Uključimo SysRQ funkcionalnost
echo 1 > /proc/sys/kernel/sysrq
I ovako pokrećemo Kernel Crash te Crash dump proceduru zapisivanja na disk:
echo c > /proc/sysrq-trigger
Ovo je nasilna metoda koja ne zaustavlja pokrenute procese niti snima sve potrebno na disk.
Nježnija metoda (umjesto echo c > /proc/sysrq-trigger ) bi bila:
1. Uredno gašenje svih programa (e)
echo e > /proc/sysrq-trigger
2. Ugasimo i programe koji se nisu uspjeli lijepo i uredno ugasiti (ako ih ima) (i)
echo i > /proc/sysrq-trigger
3. Sinkronizirajmo sve zaostale podatke u RAM memoriji na disk (s)
echo s > /proc/sysrq-trigger
4. Te na samom kraju “Crash dump”
echo c > /proc/sysrq-trigger
Ovo može potrajati ovisno o tome koliko RAM memorije je bilo zauzeto jer se sva mora zapisati na tvrdi disk. Kada se sve završi sustav će se restartati
NMI (Non-Maskable Interrupts) stanja
U slučajevima kada je sustav toliko zaglavljen da nije moguće poslati SysRQ naredbe, odgovor je reagiranje na NMI signale.
NMI signali odnosno “Interrupti” ili signali prekida su posebni hardverski signali prekida s najvišim prioritetom i koji se ne mogu ignorirati niti na koji način. Ovo su obično signali koji se kreiraju uslijed neke velike greške na hardveru ili sl.
Stoga je dobro konfigurirati mogućnost da se u treutku kreiranja NMI signala pokreće i kernel dump.
Ako je ova mogućnost več uključena tada će u posebnoj datoteci /proc/sys/kernel/unknown_nmi_panic biti vrijednost 1.
Provjerimo :
cat /proc/sys/kernel/unknown_nmi_panic 1
Ovo je moguće i trajno postaviti zapisivanjem vrijednosti kernel.unknown_nmi_panic = 1 u datoteku /etc/sysctl.conf.
Provjerimo
grep nmi /etc/sysctl.conf kernel.unknown_nmi_panic = 1
X Window sustav ponekad nazivan X11, X ili X-Windows je grafičko sučelje (engl. GUI - Graphical User Interface) za rad s “prozorima” (engl. Windowing system). Dakle ovaj sustav vizualno sliči grafičkom sučelju operativnih sustava Windows ili MAC OS.
Istraživanje upotrebe grafičkih elemenata za rad na računalu pokrenuto je u tvrtci “Xerox” unutar istraživačkog centra “Palo Alto Research Center” (PARC), početkom 1970.g.. PARC projekt je imao vrlo veliki utjecaj na razvoj prvog računala s upotrebljivim grafičkim sučeljem, dakle govorimo o Apple Lisa računalu te kasnije o Apple Macintosh i drugim računalima odnosno operacijskim sustavima.
Razvoj X Window sustava započeo je 1984 od strane “Massachusetts Institute of Technology” (MIT), pod oznakom protokola X11. Većim djelom ovaj projekt su sponzorirali DEC i IBM. Godine 1986, MIT, Apple, AT&T, DEC, HP i SUN ulažu dodatna sredstva u daljnji razvoj projekta koji će voditi novoosnovani “X” konzorcij Od 1987 do danas “X.Org Foundationhttp://www.x.org/” je zadužen za njegov razvoj.
Svaki X Window sustav se sastoji od nekoliko komponenti:
X Window sustav koristi model klijent - poslužitelj (engl. Server). To znači da “X Server” komunicira sa raznim X klijentskim programima. S druge strane sam X11 protokol je zamišljen kao mrežni protokol. To znači da nije nužno da se sve ono što bi trebali vidjeti na lokalnom monitoru/zaslonu, nužno mora biti samo lokalno, već “bilo gdje” na mreži, sve dok s druge strane mreže, postoji računalo koje ima instaliran “X Server”, koji ima kontrolu nad monitorom, mišem i tipkovnicom tog udaljenog računala. Zvuči pomalo čudno ?.
Dakle osnovni zadaci” X Server“-a su baratanje :
X Server omogućava spajanje više X Klijenata (aplikacija) istovremeno i to svaki u svom zasebnom prozoru, što danas zvuči uobičajeno, ali sjetimo se od kada se sustav dizajnirao i razvijao.
X klijent je zapravo bilo koja aplikacija koja treba koristiti resurse “X Server”-a. Klijent šalje poslužitelju zahtjeve poput :
Dok s druge strane poslužitelj (X Server) vraća klijentu sve ostale interakcije, poput, korisnik je kliknuo na dugme “OK”.
Dodatno komunikacija nije ograničena samo na jedan (ili više) klijenata odnosno aplikacija prema jednom X Serveru, već je moguće imati razne kombinacije. Moguće je da se nekoliko X klijenata spaja na jedan X Server (pr. lokalno računalo), dok se istovremeno nekoliko drugih X klijenata odnosno aplikacija spaja ne neki drugi udaljeni X Server (negdje na mreži).
Prema tome vrlo važna komponenta unutar X Window sustava je ova mrežna komponenta, koja povezuje X Server i X klijent te koja mu daje vrlo veliku fleksibilnost u radu. Važno je i to da mrežna komunikacija nije razvijena naknadno, već ona pripada osnovnim funkcionalnostima X11 protokola.
Ali (malo komplikacije) X Server nije zadužen za iscrtavanje bilo čega na ekranu. On zapravo sve zahtjeve za konačno iscrtavanje, proslijeđuje sljedećoj komponenti X Window sustava, a to je “Window Manager”.
“Window Manager” je taj koji zapravo određuje na koji način če se prozor iscrtavati i kako će izgledati. Kao i sve ostale detalje: kako će se prozori povečavati, smanjivati, pomjerati i sl. U Konačnici on je zadužen za sve ono što vidimo na zaslonu našeg monitora.
“Window Manager”-a ima na desetke, neki su manji i brži drugi su veći ali nude napredne konfiguracije i sl. Neki od njih vizualno izgledaju poput Microsoft Windows-a raznih verzija, neki popout MAC OS-a, neki su potpuno dugačiji a neki poput kombinacije navedenih.
Lista samo nekih od Window Managera:
Zanimljivo je i to da na svaki Linux sustav možemo instalirati više “Window Manager”-a te si svaki korisnik može konfigurirati koji od njih će koristiti.
Slika prikazuje izgled Xfce “Window Managera”:
Slika dolje prikazuje izgled LXDE “Window Managera”, koji je malo moderniji od Xfce ali je zadržao brzinu:
ASCII (engl. American Standard Code for Information Interchange) je 7-bitni kod za karaktere (alfabete) u kojemu svaki bit predstavlja pojedini alfabet.
Pogledajmo ASCII tablicu razlomljenu u dvije logičke cijeline.
Prva cjelina su kodovi od 0 do 31 koji predstavljaju kontrolne kodove:
| DEC | OCT | HEX | Symbol | Description |
| 0 | 000 | 00 | NUL | Null char |
| 1 | 001 | 01 | SOH | Start of Heading |
| 2 | 002 | 02 | STX | Start of Text |
| 3 | 003 | 03 | ETX | End of Text |
| 4 | 004 | 04 | EOT | End of Transmission |
| 5 | 005 | 05 | ENQ | Enquiry |
| 6 | 006 | 06 | ACK | Acknowledgment |
| 7 | 007 | 07 | BEL | Bell |
| 8 | 010 | 08 | BS | Back Space |
| 9 | 011 | 09 | HT | Horizontal Tab |
| 10 | 012 | 0A | LF | Line Feed |
| 11 | 013 | 0B | VT | Vertical Tab |
| 12 | 014 | 0C | FF | Form Feed |
| 13 | 015 | 0D | CR | Carriage Return |
| 14 | 016 | 0E | SO | Shift Out / X-On |
| 15 | 017 | 0F | SI | Shift In / X-Off |
| 16 | 020 | 10 | DLE | Data Line Escape |
| 17 | 021 | 11 | DC1 | Device Control 1 (oft. XON) |
| 18 | 022 | 12 | DC2 | Device Control 2 |
| 19 | 023 | 13 | DC3 | Device Control 3 (oft. XOFF) |
| 20 | 024 | 14 | DC4 | Device Control 4 |
| 21 | 025 | 15 | NAK | Negative Acknowledgement |
| 22 | 026 | 16 | SYN | Synchronous Idle |
| 23 | 027 | 17 | ETB | End of Transmit Block |
| 24 | 030 | 18 | CAN | Cancel |
| 25 | 031 | 19 | EM | End of Medium |
| 26 | 032 | 1A | SUB | Substitute |
| 27 | 033 | 1B | ESC | Escape |
| 28 | 034 | 1C | FS | File Separator |
| 29 | 035 | 1D | GS | Group Separator |
| 30 | 036 | 1E | RS | Record Separator |
| 31 | 037 | 1F | US | Unit Separator |
Drugi dio tablice su kodovi od 32 do 127 u kojemu su sva slova abecede, brojevi, posebni znakovi i razni simboli.
| DEC | OCT | HEX | Symbol | Description |
| 32 | 040 | 20 | Space | |
| 33 | 041 | 21 | ! | Exclamation mark |
| 34 | 042 | 22 | ” | Double quotes (or speech marks) |
| 35 | 043 | 23 | # | Number |
| 36 | 044 | 24 | $ | Dollar |
| 37 | 045 | 25 | % | Percent |
| 38 | 046 | 26 | & | Ampersand |
| 39 | 047 | 27 | ' | Single quote |
| 40 | 050 | 28 | ( | Open parenthesis (or open bracket) |
| 41 | 051 | 29 | ) | Close parenthesis (or close bracket) |
| 42 | 052 | 2A | * | Asterisk |
| 43 | 053 | 2B | + | Plus |
| 44 | 054 | 2C | , | Comma |
| 45 | 055 | 2D | - | Hyphen |
| 46 | 056 | 2E | . | Period, dot or full stop |
| 47 | 057 | 2F | / | Slash or divide |
| 48 | 060 | 30 | 0 | Zero |
| 49 | 061 | 31 | 1 | One |
| 50 | 062 | 32 | 2 | Two |
| 51 | 063 | 33 | 3 | Three |
| 52 | 064 | 34 | 4 | Four |
| 53 | 065 | 35 | 5 | Five |
| 54 | 066 | 36 | 6 | Six |
| 55 | 067 | 37 | 7 | Seven |
| 56 | 070 | 38 | 8 | Eight |
| 57 | 071 | 39 | 9 | Nine |
| 58 | 072 | 3A | : | Colon |
| 59 | 073 | 3B | ; | Semicolon |
| 60 | 074 | 3C | < | Less than (or open angled bracket) |
| 61 | 075 | 3D | = | Equals |
| 62 | 076 | 3E | > | Greater than (or close angled bracket) |
| 63 | 077 | 3F | ? | Question mark |
| 64 | 100 | 40 | @ | At symbol |
| 65 | 101 | 41 | A | Uppercase A |
| 66 | 102 | 42 | B | Uppercase B |
| 67 | 103 | 43 | C | Uppercase C |
| 68 | 104 | 44 | D | Uppercase D |
| 69 | 105 | 45 | E | Uppercase E |
| 70 | 106 | 46 | F | Uppercase F |
| 71 | 107 | 47 | G | Uppercase G |
| 72 | 110 | 48 | H | Uppercase H |
| 73 | 111 | 49 | I | Uppercase I |
| 74 | 112 | 4A | J | Uppercase J |
| 75 | 113 | 4B | K | Uppercase K |
| 76 | 114 | 4C | L | Uppercase L |
| 77 | 115 | 4D | M | Uppercase M |
| 78 | 116 | 4E | N | Uppercase N |
| 79 | 117 | 4F | O | Uppercase O |
| 80 | 120 | 50 | P | Uppercase P |
| 81 | 121 | 51 | Q | Uppercase Q |
| 82 | 122 | 52 | R | Uppercase R |
| 83 | 123 | 53 | S | Uppercase S |
| 84 | 124 | 54 | T | Uppercase T |
| 85 | 125 | 55 | U | Uppercase U |
| 86 | 126 | 56 | V | Uppercase V |
| 87 | 127 | 57 | W | Uppercase W |
| 88 | 130 | 58 | X | Uppercase X |
| 89 | 131 | 59 | Y | Uppercase Y |
| 90 | 132 | 5A | Z | Uppercase Z |
| 91 | 133 | 5B | [ | Opening bracket |
| 92 | 134 | 5C | \ | Backslash |
| 93 | 135 | 5D | ] | Closing bracket |
| 94 | 136 | 5E | ^ | Caret - circumflex |
| 95 | 137 | 5F | _ | Underscore |
| 96 | 140 | 60 | ` | Grave accent |
| 97 | 141 | 61 | a | Lowercase a |
| 98 | 142 | 62 | b | Lowercase b |
| 99 | 143 | 63 | c | Lowercase c |
| 100 | 144 | 64 | d | Lowercase d |
| 101 | 145 | 65 | e | Lowercase e |
| 102 | 146 | 66 | f | Lowercase f |
| 103 | 147 | 67 | g | Lowercase g |
| 104 | 150 | 68 | h | Lowercase h |
| 105 | 151 | 69 | i | Lowercase i |
| 106 | 152 | 6A | j | Lowercase j |
| 107 | 153 | 6B | k | Lowercase k |
| 108 | 154 | 6C | l | Lowercase l |
| 109 | 155 | 6D | m | Lowercase m |
| 110 | 156 | 6E | n | Lowercase n |
| 111 | 157 | 6F | o | Lowercase o |
| 112 | 160 | 70 | p | Lowercase p |
| 113 | 161 | 71 | q | Lowercase q |
| 114 | 162 | 72 | r | Lowercase r |
| 115 | 163 | 73 | s | Lowercase s |
| 116 | 164 | 74 | t | Lowercase t |
| 117 | 165 | 75 | u | Lowercase u |
| 118 | 166 | 76 | v | Lowercase v |
| 119 | 167 | 77 | w | Lowercase w |
| 120 | 170 | 78 | x | Lowercase x |
| 121 | 171 | 79 | y | Lowercase y |
| 122 | 172 | 7A | z | Lowercase z |
| 123 | 173 | 7B | { | Opening brace |
| 124 | 174 | 7C | | | Vertical bar / Pipe |
| 125 | 175 | 7D | } | Closing brace |
| 126 | 176 | 7E | ~ | Equivalency sign - tilde |
| 127 | 177 | 7F | Delete |
Izvori informacija :
Online :
(1) https://www.opensource-osijek.org/wordpress/2016/02/16/switching-i-routing-jucer-danas-sutra/ : Izvorni članak autora
(2) https://en.wikipedia.org/wiki/Twisted_pair : TP kabeli
(3) https://en.wikipedia.org/wiki/Category_5_cable : Cat 5 kabeli
(4) https://en.wikipedia.org/wiki/Category_6_cable : Cat 6 kabeli
(5) https://en.wikipedia.org/wiki/Medium-dependent_interface : MDI, MDI-X i Auto MDI-X
(6) http://netoptimizer.blogspot.hr/2014/05/the-calculations-10gbits-wirespeed.html : Kernel network parameters
(7) http://networkengineering.stackexchange.com/questions/5057/what-is-the-actual-size-of-an-ethernet-mtu : MTU
(8) http://www.cisco.com/c/dam/global/da_dk/assets/docs/presentations/CVU-juni_X_S-series.pdf : Cisco 3750-X design
(9) https://ciscointerworking.wordpress.com/2015/06/14/asic-redundancy/ : Cisco ASIC and Design
(10) http://www.cisco.com/networkers/nw03/presos/docs/RST-2011.pdf : Cisco Design
(11) http://rabdoul.free.fr/PUBLIC/Cisco%20slides/QOS%202.3/BRKRST-3437-Marc%20Alonso.pdf : Cisco Arhitektura switcheva
(12) http://networking.ventrefamily.com/2010/08/asic-to-port-mappings.html : ASCI to Port - Cisco
(13) https://www.juniper.net/assets/us/en/local/pdf/whitepapers/2000599-en.pdf : Dizajn Juniper QFX 10000 switcheva
(14) http://www.cisco.com/assets/global/DK/seminarer/pdfs/Catalyst_Switching_Deep_Dive_Feb2016.pdf : Cisco Dizajn “snažnijih” kategorija switcheva
(15) https://calomel.org/freebsd_network_tuning.html : FreeBSD Network Tuning
(16) http://kb.pert.geant.net/PERTKB/MultiThreadDemux : Multi Thread Net
(17) https://github.com/gokzy/freebsd-rps/wiki/Receive-Packet-Steering-on-FreeBSD : RPS Tunning FreeBSD
(18) https://wiki.freebsd.org/201305DevSummit/NetworkReceivePerformance/ComparingMutiqueueSupportLinuxvsFreeBSD : RFS FreeBSD
(19) http://www.chelsio.com/wp-content/uploads/resources/T5-40Gb-FreeBSD-Netmap.pdf : Chelsio T5 + FreeBSD
(20) https://www.mjmwired.net/kernel/Documentation/networking/scaling.txt#308 : Scaling in the Linux Networking Stack
(21) https://conferences.oreilly.com/oscon/oscon-tx/public/schedule/detail/56727 : pfSense najave - Network optimizacija
(22) https://lwn.net/Articles/382428/ : Članak o RFS tehnologiji
(23) http://www.dell.com/downloads/global/power/1q04-her.pdf : Članak o TOE
(24) http://www.chelsio.com/wp-content/uploads/resources/T6-100G-DDP-FreeBSD.pdf : Chelsio i FreeBSD: 100Gbps Net i TOE (TCP Offload Engine)
(25) http://www.chelsio.com/wp-content/uploads/resources/T5-40Gb-FreeBSD-TOE-DDP.pdf : Chelsio 40Gbps, FreeBSD i TOE
(26) https://www.opensource-osijek.org/dokuwiki/wiki:knjige:uvod_u_linux#numa : Uvod u Linux - NUMA arhitektura
(27) https://calomel.org/network_performance.html : FreeBSD Network Performance Tuning
(28) https://en.wikipedia.org/wiki/PCI_Express : PCI Express sabirnica
(29) http://luca.ntop.org/10g.pdf : 10 Gbit/s Line Rate Packet Processing Using Commodity
Hardware
(30) https://pdfs.semanticscholar.org/cf0c/c4bdabc3e5f04221ee08ae31bc8714f2367d.pdf : netmap: Memory Mapped Access To Network Devices
(31) https://www.netgate.com/blog/building-a-behemoth-router.html : FreeBSD/pfSense 10Gbps Ethernet overview
(32) http://dpdk.org/ : DPDK biblioteke
(33) http://info.iet.unipi.it/~luigi/netmap/ : netmap Framework
(34) https://www.linux-kvm.org/images/c/c5/Kvm-forum-2013-High-Performance-IO-for-VMs.pdf : netmap + Linux QEMU/KVM
(35) https://pdos.csail.mit.edu/papers/click:tocs00/paper.pdf : Click Router - opis
(36) http://openvswitch.org/support/ovscon2014/18/1630-ovs-rizzo-talk.pdf : SW Data plane performance - QEMU, DPDK, OVS, netmap and VALE
(37) http://www.ntop.org/products/packet-capture/pf_ring/ : PF RING zadužen za brzo dohvaćanje, analizu i obradu mrežnih paketa
(38) https://en.wikipedia.org/wiki/TCP_offload_engine#Freed-up_CPU_cycles : Odnos: CPU ciklusi (Hz)/bitovi podataka na mreži (TCP/IP)
(39) http://www.nanogrids.org/jaidev/papers/ispass03.pdf : TCP/IP performanse
(40) https://lwn.net/Articles/551284/ : Linux Low-latency Ethernet device polling
(41) https://www.freebsd.org/cgi/man.cgi?query=polling&apropos=0&sektion=0&manpath=FreeBSD+11.0-stable&arch=default&format=html :FreeBSD Pooling
(42) http://www.science.unitn.it/~fiorella/guidelinux/tlk/node86.html : Pooling & Interrupts (IRQ)
(43) https://en.wikipedia.org/wiki/Interrupt_coalescing :Interrupt moderation
(44) https://en.wikipedia.org/wiki/Ethernet Ethernet Wiki
(45) https://en.wikipedia.org/wiki/Cut-through_switching Cut-through metoda
(46) https://en.wikipedia.org/wiki/Store_and_forward Store and forward metoda
(47) https://medium.com/speedtest-by-ookla/engineer-maximizes-internet-speed-story-c3ec0e86f37a
(48) https://www.pfsense.org/hardware/ : hardware sizing
(49) https://docs.opnsense.org/manual/hardware.html hardware sizing
(50) https://www.sophos.com/en-us/products/unified-threat-management/tech-specs.aspx#software : Sophos UTM hardware
(51) http://www.brocade.com/en/products-services/software-networking/network-functions-virtualization/vrouter.html Brocade Vyatta/vRouter
(52) https://www.netgate.com//products/sg-1000.html : pfSense Router na ARM arhitekturi
(53) http://www.androidauthority.com/arm-vs-x86-key-differences-explained-568718/
(53.1) https://www.firewallhardware.it/dimensionare_hardware_pfsense.html hardware sizing pfsense/opnsense
(53.2) https://www.ntop.org/products/packet-capture/pf_ring/ ntopng-pfring capture
(54) https://en.wikipedia.org/wiki/New_API: Linux NAPI (Network New API)
(55) https://software.intel.com/en-us/articles/how-intel-quickassist-technology-accelerates-nfv-use-cases Intel Quick Assist tehnologija
(55.1)http://ark.intel.com/products/77988/Intel-Atom-Processor-C2758-4M-Cache-2_40-GHz Intel Atom C 2758
(56) https://fd.io/news/announcement/2017/06/fast-data-fdio-project-issues-fourth-release-furthers-position-universal Fast Data IO Framework
(57) https://wondernetwork.com/pings/ World ping latencije
(58) http://www.dell.com/en-us/work/shop/productdetails/force10-s2410 Dell Force 10 S2410 preklopnik - specifikacije
(59) http://www.cisco.com/c/en/us/products/collateral/switches/nexus-5020-switch/white_paper_c11-465436.html Cisco Nexus 5020 preklopnik - specifikacije
(60) https://en.wikipedia.org/wiki/IEEE_802.1Q 802.1Q - VLANovi
(61) https://wiki.wireshark.org/MTU MTU - najčešće veličine
(62) https://en.wikipedia.org/wiki/Maximum_transmission_unit MTU - definicija
(63) http://bradhedlund.com/2008/12/19/how-to-calculate-tcp-throughput-for-long-distance-links/ Latencija, propusnost i veličina TCP prozora
(64) https://www.opensource-osijek.org/dokuwiki/wiki:knjige:uvod_u_linux#ip_adrese Knjiga: Uvod u Linux i Linux napredno - IP protokol
(65)http://en.wikipedia.org/wiki/List_of_Linux_adopters “Upotreba Linuxa”
(66)http://opensourceforamerica.org/category/case-studies/ “Upotreba Linuxa”
(67)http://www.comparebusinessproducts.com/fyi/50-places-linux-running-you-might-not-expect “Upotreba Linuxa”
(68)http://www.unterstein.net/su/docs/CathBaz.pdf “The Cathedral and the Bazaar” Autor : Eric Steven Raymond
(69)https://www.levenez.com/unix/ “History of Unix - Timeline”
(70)https://en.wikipedia.org/wiki/Motherboard “O matičnoj ploči”
(71)https://en.wikipedia.org/wiki/Central_processing_unit “O CPU”
(72)https://en.wikipedia.org/wiki/Computer_keyboard “O tipkovnici”
(73)https://en.wikipedia.org/wiki/Code_page “Kodne stranice”
(74)https://en.wikipedia.org/wiki/Code_page_437 “CP 437”
(75)https://en.wikipedia.org/wiki/Real-time_clock “RTC”
(76)https://en.wikipedia.org/wiki/System_time “Sistemsko vrijeme”
(77)http://tldp.org/HOWTO/Clock-2.html “Clock mini howto”
(78)https://en.wikipedia.org/wiki/Time_zone “Vremenske zone”
(79)https://wiki.archlinux.org/index.php/locale “Locale”
(80)http://www.cyberciti.biz/faq/how-to-set-locales-i18n-on-a-linux-unix/ “Regionalne postavke”
(81)https://en.wikipedia.org/wiki/Interrupt_request_%28PC_architecture%29 “Signali prekida (IRQ)”
(82)https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller “PIC (IRQ kontroler)”
(83)https://en.wikipedia.org/wiki/Interrupt_handler “Interrupt handler”
(84)https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-cpu-irq.html “O CPU”
(85)https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_MRG/1.3/html/Realtime_Tuning_Guide/sect-Realtime_Tuning_Guide-General_System_Tuning-Interrupt_and_Process_Binding.html
(86)https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Performance_Tuning_Guide/sect-Red_Hat_Enterprise_Linux-Performance_Tuning_Guide-Performance_Monitoring_Tools-irqbalance.html
(87)https://en.wikipedia.org/wiki/Direct_memory_access “O DMA”
(88)https://en.wikipedia.org/wiki/Linux_kernel “Linux kernel”
(89)https://www.ibm.com/developerworks/library/l-linux-kernel/ “Linux kernel”
(90)https://www.sics.se/~amir/files/download/device-driver/arch.pdf Autor: Amir Hossein Payberah
(91)http://tldp.org/HOWTO/Module-HOWTO/ “Linux Loadable Kernel Module HOWTO” Autor : Bryan Henderson
(92)https://en.wikipedia.org/wiki/Library_%28computing%29
(93)http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html “Program Library HOWTO” Autor : David A. Wheeler
(94)http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/x1712.htm “GNU-Linux-Tools-Summary”
(95)https://en.wikipedia.org/wiki/Unix_shell “Linux shell”
(96)https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29 “Bash shell”
(97)http://linux.about.com/library/cmd/blcmdl1_who.htm
(98)http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/GNU-Linux-Tools-Summary.pdf “GNU/Linux Command−Line Tools Summary” Autor : Gareth Anderson
(99)https://en.wikipedia.org/wiki/Dmesg “dmesg naredba”
(100)http://www.linfo.org/dmesg.html “dmesg naredba”
(101)http://linux.die.net/man/8/dmidecode “dmidecode naredba”
(102)http://linux.die.net/man/8/lspci “lspci naredba”
(103)http://www.tldp.org/LDP/tlk/fs/filesystem.html “O datotečnom sustavu”
(104)http://www.tldp.org/LDP/lpg/node15.html “Named Pipes”
(105)http://www.tldp.org/LDP/sag/html/dev-fs.html “Linux devices in /dev”
(106)http://www.linfo.org/path_env_var.html “Varijabla za putanju (PATH)”
(107)https://www.linux.com/learn/understanding-linux-file-permissions “O ovlastima (permissions)”
(108)https://wiki.archlinux.org/index.php/File_permissions_and_attributes “O ovlastima (permissions)”
(109)http://www.cyberciti.biz/faq/how-to-use-chmod-and-chown-command/ “How To Use chmod and chown Command” Autor : Vivek Gite
(110)http://www.unixtutorial.org/2014/07/difference-between-chmod-and-chown/ “O chmod i chown naredbama”
(111)http://www.tldp.org/LDP/tlk/kernel/processes.html “O Linux procesima”
(112)http://www.tldp.org/LDP/tlk/tlk-toc.html “O Linuxu i raznim detaljima - “Tlk-toc” ” Autor : David A Rusling
(113)info “O RAM memoriji”
(114)https://wiki.mikejung.biz/OS_Tuning#CPU_Overview “Pregled CPU-a”
(115)https://wiki.mikejung.biz/OS_Tuning#Viewing_NUMA_stats_with_numastat “CPU i NUMA”
(116)http://www.admin-magazine.com/Archive/2014/20/Best-practices-for-KVM-on-NUMA-servers “NUMA detaljnije”
(117)https://www.ibm.com/support/knowledgecenter/linuxonibm/liaai.hpctune/cpuandmemorybinding.htm “Veza CPU-RAM”
(118)http://www.glennklockwood.com/hpc-howtos/process-affinity.html “Pripadnost procesa CPU tj. NUMA arhitekturi”
(119)https://www.sqlskills.com/blogs/jonathan/understanding-non-uniform-memory-accessarchitectures-numa/ “O NUMA”
(120)https://wiki.mikejung.biz/OS_Tuning#CPU_Overview “NUMA i CPU arhitektura”
(121)https://wiki.mikejung.biz/OS_Tuning#Viewing_NUMA_stats_with_numastat “NUMA statistikei detalji”
(122)http://www.admin-magazine.com/Archive/2014/20/Best-practices-for-KVM-on-NUMA-servers “KVM i NUMA”
(123)https://www.ibm.com/support/knowledgecenter/linuxonibm/liaai.hpctune/cpuandmemorybinding.htm “NUMA i RAM”
(124)http://www.glennklockwood.com/hpc-howtos/process-affinity.html “Pripadnost procesa CPU tj. NUMA arhitekturi”
(125)https://www.kernel.org/doc/Documentation/vm/page_migration “Paging i NUMA”
(126)https://software.intel.com/en-us/articles/getting-high-performance-on-numa-based-nehalem-ex-system-with-mkl-without-controlling-numa “NUMA detalji i primjeri”
(127)http://h20564.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c03261871&lang=en-us&cc=us
(128)http://queue.acm.org/detail.cfm?id=2513149
(129)https://en.wikipedia.org/wiki/Unix_signal “Prioriteti i procesi”
(130)http://unix.stackexchange.com/questions/85364/how-can-i-check-what-signals-a-process-is-listening-to “Procesi i signali”
(131)http://www.thegeekstuff.com/2012/03/linux-signals-fundamentals/ “Linux signali”
(132)http://www.tldp.org/LDP/abs/html/parameter-substitution.html#PSUB2
(133)http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/subshells.html
(134)http://stackoverflow.com/questions/8748831/when-do-we-need-curly-braces-in-variables-using-bash
(135)http://linuxcommand.org/lc3_lts0080.php
(136)http://unix.stackexchange.com/questions/4899/var-vs-var-and-to-quote-or-not-to-quote
(137)https://en.wikipedia.org/wiki/Memory_management_unit “MMU”
(138)http://bashitout.com/2009/08/30/Linux-Compression-Comparison-GZIP-vs-BZIP2-vs-LZMA-vs-ZIP-vs-Compress.html
(139)https://administratosphere.wordpress.com/2008/05/23/sparse-files-what-why-and-how/
(140) https://hackaday.com/2017/12/28/34c3-hacking-into-a-cpus-microcode/
(141) https://en.wikipedia.org/wiki/Instruction_pipelining
(142) https://en.wikipedia.org/wiki/Machine_code
(143) https://en.m.wikipedia.org/wiki/Instruction_cycle
(144) https://cs.stackexchange.com/questions/21895/what-happens-at-the-decode-phase-of-the-instruction-cycle
(145)http://syssec.rub.de/media/emma/veroeffentlichungen/2017/08/16/usenix17-microcode.pdf
(146) https://www.pcsuggest.com/update-cpu-microcode-in-linux/
(147) https://www.debian.org/releases/stable/i386/ch02s02.html.en
(148) https://wiki.ubuntu.com/Kernel/Firmware
(149) https://wiki.centos.org/HowTos/Laptops/Wireless
… U IZRADI ….
Knjige :
“Unix Complete” : ISBN : 0-7821-2528-X
“The Design and Implementation of the FreeBSD Operating System (2nd Edition)” : ISBN : 0-3219-6897-2
“Data Center Fundamentals” : Cisco : ISBN : 1-5870-5023-4