User Tools

Site Tools


wiki:knjige:uvod_u_linux

Uvod u Linux i Linux napredno


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

http://softwarecity.hr/


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

LinkedIn info



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



Sadržaj




Uvod/Licenca

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


Predgovor

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.



Uvod


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


Na kojoj distribuciji Linuxa ćemo raditi ?


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:

  • Upravljanja sa servisima (daemonima) i
  • Radom s paketima (RPM)

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:

  • Upravljanja i rada s procesima, baziranim na tkzv. 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.


Koje su prednosti Linuxa i drugih sustava otvorenog koda

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 :

  • Kvaliteta :

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 :

  • Koliki postotak ukupnog vremena u razvoju svog programa ili sustava trošite na testiranje u širem smislu riječi ?.
  • Koliko vremena planirate za dokumentaciju vašeg programa i sustava ?
  • Sigurnost :

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 :

  • koliki postotak vremena u razvoju svog programa ili sustava trošite na sigurnost :
    • od faze dizajna,
    • preko implementacije do svih faza testiranja ?.
  • Fleksibilnost :

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:

  • kako će vam nametnuti potrebu da plaćate nove verzije programa i sustava ako vam je postojeći dobar ili čak odličan,
  • kako će vas natjerati da kupujete nadogradnje zbog novih funkcionalnosti, ali i sigurnosnih nadogradnji ili popravaka nekih (njihovih) grešaka,
  • kako će vas natjerati da kupite novi hardver (računalo) ako je postojeći ili novi program ili sustav brz i optimiziran.

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 :

  • Koliko je program ili sustav koji razvijate fleksibilan i koliko pazite da kôd bude moguće ponovno iskoristiti (engl. Code reuse).
  • Interoperabilnost :

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.

  • Podrška :

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:

  • Podršku za komercijalne programe i sustave pruža vam tvrtka koja je razvila taj sustav a njeni partneri zaduženi su samo za rješavanje određenih problema (kôd samog programa je i dalje u vlasništvu i dostupnosti samo tvrtke vlasnika ), pa ovdje često dolazi do razvlačenja odgovornosti (i gubljenja vremena za vas kao korisnika njihovog programa/sustava): tvrtka vlasnik programa/sustava ← › partnerska tvrtka
    • Za sve probleme koji traže angažman tvrtke vlasnika programa/sustava, pogotovo ako je to inozemna tvrtka, bez obzira da li ima predstavništvo u vašoj zemlji, ćete se prema raznim statistikama (i mom osobnom iskustvu) načekati a u dosta slučajeva, dobiti ćete rješenje problema koji ste prijavili uz cijeli niz novih problema .
  • Podršku za Open Source programe i sustave, uključujući mogućnost promjena samog kôda što uključuje : popravke grešaka, dodavanje novih funkcionalnosti, raznih optimizacija prema vašim željama i sl., može vam odraditi lokalna tvrtka (iz vašeg grada/županije/države). Što je još bitnije tih lokalnih tvrtki može biti nekoliko, što dovodi do zdrave konkurencije, pa će se svi boriti da pruže bolju i kvalitetniju uslugu za vas kao korisnika nekog Open Source programa i sustava (koji vjerojatno već koriste milijuni ljudi širom svijeta i za koji također postoji podrška od strane tisuća i tisuća tvrtki širom svijeta).
    • Za sve Open Source programe i sustave podršku možete dobiti i od zajednice (engl. community) koja je i razvila određeni program ili sustav ali vrlo često je iz te zajednice i izrasla i neka fondacija ili tvrtka kojoj/kojima također možete platiti još viši (i brži) nivo podrške.

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 :

Troškovi Open Source programa i sustava su nekada i višestruko manji od troškova komercijalnih programa i sustava :

  • Većina Linux operativnih sustava je besplatna ali kao što smo vidjeli, za većinu njih možete plaćati direktnu podršku (često zakladi [Fundation] ili tvrtki koja (uglavnom) stoji iza njih) ili naravno lokalnoj tvrtki. U slučaju da za kompletnu podršku plaćate lokalnu tvrtku, novac ostaje u vašem gradu/županiji/državi od poreza, prireza, plaća radnicima te tvrtke, …
  • Za Linux-e za koje se plaća (pr. RedHat, SuSe , … ) cijena je puno manja od drugih komercijalnih operativnih sustava, a uz tu cijenu dobivate i određenu osnovnu podršku, koja je prema mnogima [i meni],puno bolja,brža i kvalitetnija. Osim toga možete nadoplatiti i za dodatnu podršku ili jednostavno kupiti samo Linux uz osnovnu podršku a za sve ostalo, podršku platiti lokalnoj tvrtki.
  • Ostali programi su besplatni za osobnu i/ili komercijalnu upotrebu, za sve njih također možete plaćati podršku, po sličnom modelu kao i za Linux.
  • Troškovi potencijalnog školovanja ljudi u vašoj tvrtki zbog prelaska na Open Source programe i sustave i cjelokupne migracije na Open Source: kada se sve zbroji, moguće je nekoliko scenarija uz određene varijacije:
    • Troškove školovanja i migracije plaćate ili odrađujete sami, početni troškovi su manji a dugoročni troškovi su višestruko manji
    • Troškove školovanja i migracije plaćate (lokalnoj tvrtki), početni troškovi su isti ili približni a dugoročni troškovi su višestruko manji
    • Troškove školovanja i migracije plaćate (lokalnoj i/ili inozemnoj tvrtki), početni troškovi su isti ili zanemarivo veći a dugoročni troškovi su manji.

Lista nekih od Open Source programa i sustava, prema kategorijama, vidljiva je na našoj stranici: https://www.opensource-osijek.org/wordpress/najpoznatiji-projekti/

Tko sve koristi Linux i sustave otvorenog koda

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 :

  • Ministarstvo obrane Sjedinjenih Američkih Država (U.S. Department of Defense):
    • Koriste RedHat Linux, prema nekim izvorima ovdje je za RedHat Linux najveći broj instaliran računala unutar jedne tvrtke ili institucije
  • Mornarica Sjedinjenih Američkih Država : Flota nuklearnih podmornica (U.S. Navy Submarine Fleet):
    • Poznato je da koriste Linux baziran na Red Hat Linuxu
  • Federalni sudovi (U.S. Federal Courts) u Sjedinjenim Američkim Državama
  • Savezna uprava za civilno zrakoplovstvo (Federal Aviation Administration) Sjedinjenih Američkih Država
  • Francuski parlament:
    • Koriste Ubunut Linux sa OpenOffice paketom, instalirano je ~1.100 računala
  • Španjolska (većina državnih institucija i agencija)
    • Napravili su svoju distribuciju Linuxa, baziranu na Debian Linuxu, naziva : LinEx
  • Pošta Sjedinjenih Američkih Država (U.S. Postal Service):
    • Svi poslužitelji su migrirani na Linux : preko 900 Clustera sa Linux poslužiteljima, širom države
  • Češka pošta :
    • Koriste SuSe Linux sa 4.000 Poslužitelja i 12.000 računala
  • Njemačka : Grad Minhen, migrirao ~15.000 stolnih računala sa Microsoft Windows na Linux
  • Nizozemski sustav za Ministarstvo unutarnjih poslova (Internet Research and Investigation Network (iRN)) :
    • Koriste Ubuntu Linux na ~2.200 računala
  • Njemački nacionalni sustav za zapošljavanje (Bundesagentur für Arbeit)
    • Koriste OpenSuSe Linux na ~13.000 računala
  • NASA (National Aeronautics and Space Administration), od poslužitelja i stolnih računala do drugih sustava (pr. Space Shuttle misija STS-83 je koristila Linux za kontrolu eksperimenata).
  • Sustav napredne kontrole prometa u gradu San Francisco
  • Japanski vlakovi tkzv “Bullet Trains” tj. “Shinkansen” uz sustav kontrole i nadzora vlakova i cijelog sustava, koristi Linux

Školstvo :

  • Brazilsko školstvo:
    • Koriste Linux na : 520.000 Računala u 50.000 škola širom države
  • Njemačka Sveučilišta :
    • Koriste SuSe Linux za poslužitelje i desktop računala u 33 sveučilišta, za 560.000 studenata
  • Savezna Država Indiana (SAD), školski sustav :
    • Koriste Linux za 22.000+ studenata i učenika
  • Italija, regija Bolzano : školski sustav sa 16.000 studenata i učenika
  • Makedonija : školski sustav
    • Linux stolnih računala : 5.000 i 180.000 Ubuntu Thin Client računala
  • Rusija : cijeli školski sustav i sve državne institucije :
    • Plan je nabavka ~700.000 stolnih računala i ~300.000 poslužitelja upogonjenih Linuxom i Open Source programima, baziranih na Baikal CPU (inicijalni plan je bio ARM arhitektura bazirana na ARM Cortex-A57 ali je napravljen zaokret i odabrana je MIPS arhitektura bazirana na : MIPS Warrior P5600) (6.mj.2015).
  • Švicarska: pojedini kantonalni školski sustavi :
    • Koriste Linux s OpenOffice paketom : Ženevski kanton : ~9.000 računala

Neke od velikih tvrtki ili korporacija koje koriste Linux i OpenSource za poslovanje:

  • Google : na poslužiteljima i stolnim računalima
  • IBM : na poslužiteljima i stolnim računalima
  • Panasonic : na poslužiteljima i stolnim računalima
  • Cisco : na poslužiteljima i stolnim računalima
  • Amazon : za skoro svaku komponentu poslovnog sustava se koristi Linux, kako su i sami izjavili : “everything that happens in them is driven by Linux”
  • Virgin America : sustav za zabavu unutar zrakoplova “in-flight entertainment system”
  • Peugeot :
    • Koriste: 20.000 Novell Desktop Linuxa i 2.500 SuSe Linux Enterprise Server
  • Wikipedia
  • Burza u New York-u (New York Stock Exchange) :
    • Koriste Red Hat Enterprise Linux
  • Londonska burza
  • Toyota :
    • Odjeli prodaje koriste Linux za oko 30. različitih sustava: od sustava za naručivanje dijelova, garancije, popravke , ….
    • Komunikacijski sustav i sustav elektroničke zabave unutar vozila (In-Vehicle-infotainment (IVI) systems) koriste Linux
  • Facebook
  • Twitter
  • Siemens
  • McDonalds
  • Deutsche Bank
  • Bank of America
  • Bank of New York
  • DreamWorks
  • NTT Telekom grupa (Nippon Telegraph and Telephone Corporation) - vlasnik preko 30 telekom tvrtki širom svijeta
  • Morgan Stanley, Goldman Sachs,

Osim navedenog i većina najjačih superračunala u svijetu koristi Linux.


Tko još (pametan) razvija programe i sustave otvorenog koda

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

  • Uložio je nekoliko milijardi američkih dolara u servise i programe bazirane na Linuxu, kroz Linux Technology Center koji uključuje 300+ stalno zaposlenih Linux programera.
  • Donira 40 milijuna američkih dolara u Eclipse (http://www.eclipse.org) (12.5+ milijuna linija kôda).
  • Ulaže u “Open Source Initiative” (http://opensource.org).
  • Donira u razvoj “Java-base relational database management system” (RDBMS) Apache Derby (http://db.apache.org/derby).

SUN Microsystems

  • 1990. razvija programski jezik Java koji 1995.g. predstavlja javnosti te 2007.g. licencira pod GPL licencom (6.5 milijuna linija koda).
  • 1999. kupuje njemačku tvrtku StarDivision za 73.5 milijuna američkih dolara i između ostaloga, s njom “StarOffice” kojeg kasnije Sun objavljuje kao OpenOffice pod LGPL i SISSL licencama (~10. milijuna linija koda).
  • 2005. je razvio i pokrenuo GlassFish (aplikacijski server) kao open source projekt.
  • kasnije 2005 godine kupuju tvrtku “Storage Tek” za 4.1 milijarde US$ te 2008 objavljuje kôd “Sun Storage 7000 Unified Storage systems” koji je baza za razvoj ZFS-a koji je kombinacija datotečnog sustava i “volume nanagera”.
  • 2005. objavljuje izvorni kôd kernel i network dijela operativnog sustava Solaris, potom pokreće OpenSolaris s istim kodom pod CDDL licencom, kasnije uključuje i DTRACE, ZFS, Solaris Containers i druge tehnologije (2+ milijuna linija koda).
  • 2008. kupuje tvrtku MySQL AB sa MySQL bazom podataka za 1 milijardu američkih dolara. Kasnije izdaje MySQL pod GPL licencom.

Google

  • 2005. kupuje tvrtku Android Inc. te s njom dobiva Android operativni sustav.
  • 2007. izdaje Android pod Apache 2.0 licencom (10+ milijuna linija koda).
  • 2008. razvija Google Chrome web preglednik te isti izdaje pod nazivom Chromium u open source (2+ milijuna linja koda).
  • Razvija Chrome/Chromium OS.
  • Razvija Google Web Toolkit (300.000+ linija koda).
  • Google Summer of Code (GSoC) je godišnji događaj, prvi puta održan 2005. U njemu Google nagrađuje sa 5,000 američkih dolara (u 2013.) stotine studenata koji uspješno završe zadane open source projekte do kraja događanja.

RedHat

  • Praktično živi od Open Source filozofije.
  • Ukupni prihodi tvrtke :
    • U 2012 : 1.13 milijardi U$,
    • u 2014 : 1.53 milijardi U$,
    • u 2015 : 1.79 milijardi U$,
    • u 2016 : 2.05 milijardi U$
  • Red Hat Enterprise Linux (RHEL) je dostupan samo kroz pretplatu, koja uključuje pristup softveru (ISO image) i zakrpama te raznim nivoima tehničke podrške (ovisno o vrsti pretplate). Proizvod se sastoji većinom od programa koji se distribuiraju kroz open source licence.
  • Cijeli kôd za sve programske pakete RedHat Linuxa je javno dostupan: ⇒ CentOS Linux koristi isti taj kôd za izradu svoje distribucije Linuxa.
  • razvili su (i napisali) ~12% od cijelog Linux kernel kôda (prema broju linija koda), na kojem su bazirani svi Linuxi.
  • JBoss (aplikacijski Server) (2+ milijuna linija koda), izdan pod LGPL licencom.
  • Red Hat sponzorira Fedora projekt (community verziju Red Hat Enterprise Linux).

Microsoft

  • Microsoft je na 21. mjestu po sudjelovanju u razvoju Linux kernela (~1% udjela, prema broju linija koda).
  • Shvaća prednosti razvoja prema principima Open Source: http://opensource.mscommunity.hr :“Microsoft Hrvatska 5. lipnja 2013. organizira prvu Microsoft Open Source konferenciju u suradnji sa Sveučilištem u Zagrebu, koja je namijenjena upravo vama. Microsoft je kao tvrtka proširio svoju filozofiju i sve više pridonosi open source zajednicama tako da promiče developersku suradnju kako bi se lakše razvijala i održavala interoperabilna IT rješenja.”
  • Početkom 2015 objavljuje “.NET Core”, u open source-u. u to je uključeno:
    • C# i Visual Basic
    • Visual F# Tools
    • ASP .NET 5
  • Nekoliko mjeseci nakon otvaranja “.NET Core”-a, open source zajednica pronašla je i riješila na stotine bugova te razvila nove funkcionalnosti.

Apple

  • Sredinom (ljeto) 2015 objavljuje da će programski jezik “Swift” odnosno “Swift 2”, koji je nasljednik ili više zamjena “Objective-C” biti u potpunosti izdan kao open source. Programski jezik Swift će se koristiti za razvoj aplikacija za OS X i iOS, te će raditi na Linux OS-u. Ovo znači da će od sada biti moguće razvijati aplikacije za OS X ili iOS na Linux-u.

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

  • Pružanja tehničke podrške za kupce,
  • Razvoja i optimizacije prema potrebama klijenata (kupaca),
  • Razvoja zasebnih komercijalnih “Close Source” ili “Open Source” aplikacija za postojeći “Open Source” program ili sustav,
  • Integracija sustava kod kupca,

Filmovi i literatura koju preporučujemo

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 :

  • Richard M. Stallman (Programer, tvorac Free Software Movement i GNU projekta)
  • Linus Torvalds (tvorac Linux kernela)
  • Eric Steven Raymond (Programer UNIX programa, kasnije i GNU/LINUX i autor knjige “The Cathedral and the Bazaar” ,suosnivač “Open Source Initiative (OSI)”)
  • Bruce Perens (tvorac definicije Open Source, Programer i suosnivač Open Source Initiative (OSI))
  • Larry Augustin (Suvlasnik/Osnivač tvrke VA Linux Systems)
  • Michael Tiemann : suosnivač je tvrtke Cygnus Solutions koja je razvila i Cygwin, autor je GNU C++ prevoditelja (Engl. Compiler), GNU C prevoditelja i GNU Debuggera, bio je predsjednik Open Source Initiative, tehnički direktor u tvrtki RedHat, član savjetodavnog odbora za GNOME projekt, član je odbora za Embedded Linux Consortium , , …

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:

  • Net Hack (igra),
  • Razne komponente Emacsa,
  • xlife
  • kasnije je radio i na igri The Battle for Wesnoth,
  • ..

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.



Zašto Unix/Linux

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

  • Tisuće programa koji čine UNIX/Linux su također u vrlo dugoj upotrebi te su ispolirani, testirani i višestruko optimizirani u radu.


Povijest Unix-a


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:

  • x86
  • PowerPC
  • mips
  • SPARC
  • ARM

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:

  • BSD Unix (Berkeley Software Distribution) - razvijen u Kalifornijskom sveučilištu Berkeley
    • FreeBSD baziran na BSD Unixu
      • DragonFly BSD baziran na FreeBSDu
      • JunOS - baziran na FreeBSD, razvijen u tvrtki Juniper Networks
      • NeXTSTEP (kasnije Mac OS/IOS) - razvijen u tvrtki NeXT Computer, kasnije kupljen od tvrtke Apple
    • NetBSD baziran na BSD Unixu
    • OpenBSD baziran na BSD Unixu
    • TrueOS baziran na BSD Unixu
  • SUN OS (kasnije Solaris) - razvijen u tvrtki Sun Microsystems, sada u vlasništvu tvrtke Oracle
  • IRIX - razvijen u tvrtki Silicon Graphics
  • HP-UX - razvijen u tvrtki HP
  • AIX - razvijen u tvtki IBM
  • Digital UNIX - razvijen u tvrtki DEC (Digital Equipment Corporation), kasnije Compaq, danas HP
  • QNX - razvijen u tvrtki “Quantum Software Systems”, kasnije “QNX Software Systems”, potom “BlackBerry”
  • Minix (Nastao od riječi “mini-Unix”) - razvijen od strane “Andrew S. Tanenbaum


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

  • Kako podržava “Multitasking” odnosno izvršavanje više zadataka (programa) istovremeno,
  • Kako podržava višekorisnički rad – moguć je rad više korisnika istovremeno,
  • Kako je interaktivan, što znači da je izvođenje naredbi trenutno.

Što je specifično za sve UNIXoidne operacijske sustave ?

Svi Unixoidni operacijski sustavi imaju zajedničko nekoliko stvari:

  • koriste hijerarhijski datotečni sustav, sa definiranom i razrađenom strukturom direktorija
  • konfiguracijske datoteke za sve programe i komponente sustava su “obične” tekstualne datoteke
  • svi uređaji - od diskova (CD/DVD, tvrdih ili SSD), preko mrežnih, grafičkih i drugih kartica su također datoteke (doduše posebna vrsta). Stoga se komunikacija sa svim uređajima (hardverom) svodi na rad s datotekama (pisanjem ili čitanjem u ili iz njih). Čak se i komunikacija između procesa tj. IPC (inter-process communication) svodi na rad s datotekama.
  • bilo koji program se može pokrenuti u kombinaciji s drugim programima, na način u kojemu se obrađeni podaci koje nam daje prvi program mogu proslijediti drugom programu, a ono što je on obradio, može se poslati trećem i tako dalje, stvarajući nove mogućnosti. Bez potrebe za pisanjem novog programa, već kombinirajući funkcionalnosti postojećih programa. Ova mogućnost se zove Pipe ili cijev za komunikaciju te izgleda ovako :

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.


Povijest Open Source-a i Linux-a


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:

  • Debian
  • RedHat
  • Slackware

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



Distribucije bazirane na RedHat Linuxu, koji koristi .rpm format paketa te rpm package manager i pripadajuće frontend programe.

PlantUML Graph



Distribucije bazirane na Slackware Linuxu, koji koristi .txz format paketa te Tzv. pkgtools alate, kao i pripadajuće frontend programe.

PlantUML Graph



Pogledajmo i cijelo stablo najčešće korištenih i najrasprostranjenijih distribucija Linuxa:


PlantUML Graph



Lista gotovo svih distribucija Linuxa, nalazi se na : https://en.wikipedia.org/wiki/List_of_Linux_distributions.



Upoznajmo se s našim računalom


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.


Od čega se sastoji računalo


Svako računalo se sastoji od :

  • Centralnog procesora (CPU)
  • RAM memorije
  • Tvrdog diska (ili SSD diska)
  • Mrežne kartice (i drugih kartica)
  • Optičkog uređaja (CD/DVD-ROM) i
  • Vanjskih uređaja : Monitor, miš, Tipkovnica, pisač, skener i sl.

CPU odrađuje sve :

  • Aritmetičke operacije,

poput zbrajanja, oduzimanja, množenja, dijeljenja i drugih matematičkih operacija

  • Logičke operacije poput : I (AND), ILI (OR), NE (NOT) , NI (NAND) , NILI (NOR) , XILI (XOR) , XNILI (XNOR).
  • Kontrolne operacije - za koje je zadužen dio koji se zove “Control unit (CO)”) a koji na osnovi programskih instrukcija nalaže svim ostalim jedinicama (Aritmetičko-logičkoj, Ulazno/izlaznoj i Memoriji) što i kako da odrade.
  • Ulazno/Izlazne operacije,

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, CPU, "chipset" i sabirnica(e)


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:

  • CPUa (centralnog procesora)
  • RAM memorije
  • Disk kontrolera (obično ATA ili SATA tipa)
  • serijskih i paralelnih sučelja
  • USB kontrolera i USB sučelja
  • zvučna kartica
    • a ponekada su integrirani i :
      • grafička kartica
      • mrežna kartica

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.

  • Northbridge dio :
    • Ovaj dio chipseta, koji je izveden na zasebnom chipu i nalazi se najbliže procesoru, se naziva i Memory Controller Hub. On je zadužen za komunikaciju između procesora i memorije. Stoga se u njemu nalazi i memorijski kontroler. Osim toga on je zadužen za rad druge vrste sabirnice visoke propusnosti, koja se uglavnom koristi za potrebu spajanja grafičke kartice (u ovom slučaju je to PCI Express v.2.0 , x16), ili drugih kartica koje zahtjevaju vrlo veliku propusnost. Zadnja uloga ovog dijela chipseta je komunikacija s drugim chipsetom.
  • Southbridge dio, također izveden kao zaseban chip ili komponenta, komunicira s gore navedenim chipsetom, također preko posebne sabirnice. Ovaj dio chipseta se naziva i I/O controller Hub. Njegova namjena je trostruka:
    • Upravljanje i komunikacija s drugim sabirnicama, poput PCI ili PCI Express (ali x4 ili x1) koje su znatno sporije od sabirnice kojom upravlja Northbridge chipset.
    • Unutar njega se obično nalaze i disk kontroleri za ATA (poznat i kao PATA) ili SATA diskove,
    • mrežna kartica, USB kontroler a često i zvučna kartica.
    • Veza sa LPC (Low Pin Count) sabirnicom na koju su preko tkzv. Super I/O kontrolera spojeni uređaji koji za svoj rad trebaju vrlo male brzine komunikacije, popu serijskih ili paralelnih portova, PS/2 portova za spajanje miševa i tipkovnica, kao i BIOS (ROM) računala, koji također radi na vrlo maloj brzini pa mu nije potrebna brža sabirnica

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 :

Prednja strana CPUa:

Stražnja strana CPUa:

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
PCI33 MHz 32 bitna 1,064 Mb/sec
PCI33 MHz 64 bitna 2,128 Mb/sec
PCI66 MHz 32 bitna 2,128 Mb/sec
PCI66 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, kodne stranice (enkodiranje) i drugo


Tipkovnica


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:

  • poput funkcijskih tipki (F1 do F12)
  • tipke za prebacivanje između velikih i malih slova (Engl Caps lock)
  • tipki s posebnom funkcionalnošću kao što su : Shift, Ctrl, Alt , Alt Gr , Print Scrn , SysRq , ESC
  • te ostalih tipki poput : Insert, Delete, Home , Pause/Break, SysRq i drugih
  • i numeričkog dijela tipkovnice, s brojevima i osnovnim matematičkim operatorima,

Izgled 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


Od čega se sastoji tipkovnica ?

Tipkovnica se sastoji od :

  • tipki i pripadajućih prekidača (sklopki)
  • mikrokontrolera tipkovnice
  • utikača (PS/2, USB , …)

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.


Kako radi tipkovnica ?


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 PC
  • tu se još nalaze i MODEL=” “ 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 ? :

  • Recimo da smo stisnuli tipku a
  • Pročitan je “Scan code” stisnute tipke
  • Potom je zaprimljen taj “Scan code” - u ovom slučaju 1e 9e
  • Ovaj kod se prema tablici “Key code-a” i pripadajućeg seta karaktera (pr. ASCII seta ) mapira kao 30


Priča o kodnim stranicama odnosno "character set"-u


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 pristup

Svaka konzola kao i terminal moraju imati i odabrani Character set poput :

  • ASCII seta (pogledajte ASCII tablicu na kraju knjige)
  • UTF-8 ili nekog drugog.

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



Napredno: Tipke s posebnom funkcionalnošću


U narednom djelu objasniti ćemo nekoliko tipki koje imaju “posebnu” funkcionalnost a koju je potrebno razumjeti.


Alt Gr tipka


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 dobitiAlt 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 i Print Scrn tipka


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:

FunkcionalnostTipka/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 :

  • Uredno ugasimo sve procese/programe (e)
  • Pogasimo sve ostale koji su se zablokirali i ne reagiraju na prethodno uredno gašenje (i)
  • Sinkronizaciju podataka na disk (s) - da ne bi nešto izgubili te da datotečni sustav ne bi postao nekonzistentan
  • Sve datotečne sustave koji su spojeni na sustav (mountani) odvojimo i spojimo ali kao read-only - kako se na njih ne bi moglo ništa više zapisivati (kako nebi došlo do nekonzistencije podataka) (u)
  • Potom restart sustava (b).
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.


Rekonfiguracija tipkovice

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.



Postavke vremenske zone i sata te lokalne (regionalne) postavke


Regionalne postavke vezane su za :

  • tipkovnicu i kodne stranice
  • postavke monetarne valute (Pr. KN, U$ , € i sl.)
  • formata vremena (sata) i datuma ( Godina/mjesec/dan , Godina/dan/mjesec i sl.)
  • razne programe i biblioteke za njihov pravilan prikaz: teksta,

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.


...O hardverskom i sistemskom satu


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 → RTC

Moguć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 DAN
  • mmm je MJESEC
  • yyyy je GODINA
  • HH: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 1 NTP poslužitelji, pošto su spojeni na referentni sat (Atomski u konačnici) imaju očekivano odstupanje od samo nekoliko mikro sekundi.
  • Stratum 2 NTP poslužitelji imaju nešto veće kašnjenje ali se oni stoga mogu spajati (sinkronizirati) na više Stratum 1 poslužitelja istovremeno, kao i na više Stratum 2 poslužitelja da bi dobili točnije vrijeme.
  • Stratum 3 NTP poslužitelji imaju još malo veće kašnjenje ali se oni isto mogu spajati (sinkronizirati) na više Stratum 2 poslužitelja istovremeno, kao i na više Stratum 3 poslužitelja
  • Stratum 4 NTP poslužitelji imaju nešto još veće kašnjenje ali se i oni stoga mogu spajati (sinkronizirati) na više Stratum 3 poslužitelja istovremeno, kao i na više Stratum 4 poslužitelja i tako sve do Stratum 15 koji je zadnji mogući element u hijerarhiji.

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

  • Osijek : os.ntp.carnet.hr ( Stratum 2 )
  • Rijeka : ri.ntp.carnet.hr ( Stratum 2 )
  • Split : st.ntp.carnet.hr ( Stratum 2 )
  • Zagreb : zg1.ntp.carnet.hr ( Stratum 2 ) i zg2.ntp.carnet.hr (Stratum 2 )

Za sada toliko o NTP protokolu.


Vremenska zona


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:

Izvor slike: https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Standard_World_Time_Zones.png/1280px-Standard_World_Time_Zones.png


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


Rekonfiguracija vremenske zone


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.



Regionalne postavke odnosno "Locale"


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 :
    • “JEZIK” je definiran prema ISO 639-1 kodovima za jezik
    • “TERITORIJ” je definiran prema ISO 3166-1
    • “KODNA STRANICA” odnosno “ENKODIRANJE” prema definiciji kodne stranice ili standarda za kodove (Pr. UTF8)

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 :

  • ili kodnu stranicu ISO88592
  • ili UTF8 enkodiranje.

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:

  • AIX
  • HP-UX
  • IRIX
  • OS X (od 10.5 Leopard)
  • Solaris
  • Tru64
  • UnixWare
  • QNX Neutrino i joše neki drugi

Neke druge verzija UNIX-oidnih operacijskih susava su POSIX kompatibilni (svaki do neke točke), pogledajmo i neke od njih:

  • Android
  • Darwin
  • FreeBSD
  • Illumos
  • Linux
  • Minix
  • NetBSD
  • OpenBSD
  • VxWorks
  • Xenix
  • i mogi drugi

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 monetarne
  • LC_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



Napredno: IRQ (Interrupt request) i DMA (Direct Memory Access)


Napredno: IRQ (Interrupt request)


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 + LAPIC arhitektura:

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 :

  • Zahtjev prema MMU (Memory Management Unit ) drugog procesora. Ovo se događa kod dohvaćanja memorije koja ne pripada prvom već drugom procesoru (recimo CPU1 –> CPU2 ili obratno), prema njegovom MMUa. Ovo se događa u Tzv. NUMA arhitekturi.
  • Zahtjev za zaustavljanjem rada prema drugom procesoru -kada se gasi računalo.


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.



IRQ i Linux

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:

  • Prvi niz koristi I/O APIC (standardni interrupti)
  • Drugi niz koristi MSI (MSI tj. noviji interrupti).

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) - IRQ8
  • acpi je ACPI (Advanced Configuration and Power Interface) - Koristi se za “hardware discovery”, konfiguraciju hardvera, “power management”, monitoring itd. - IRQ 9
  • ata_piix je ATA kontroler na koji je spojen samo CD/DVD-ROM - IRQ 17
  • hpsa - HP Smart Array RAID kontroler na kojemu su sistemski diskovi u RAID 1 polju - IRQ 50
  • eth0 i eht1 su mrežne kartice - IRQ 54 i IRQ 55

Vidimo 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,


Napredno: DMA (Direct Memory Access)


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

  • Disk kontroler je poslao procesoru signal prekida,
  • Procesor pauzira trenutni proces,
  • Disk kontroler traži pristup disku te pomoću DMA kontrolera preko DMA kanala br.5 započinje prijenos podataka od ili prema RAM memoriji, bez posredovanja procesora.
  • U međuvremenu procesor odrađuje sve ostale aktivnosti potrebne da se ovaj proces odradi te čeka potvrdu od DMA kontrolera kako bi se prijenos podataka između diska i RAM memorije završio.
  • Potom se kreira novi signal prekida kojim se potvrđuje da je sve završeno te se procesor vraća na izvršavanje prijašnjeg procesa.

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:

  • Samih procesora - između jezgri procesora (Tzv. intra-chip data transfer) ili između fizičkih procesora (na poslužiteljskim sustavima s više fizičkih procesora),
  • Grafičkih kartica,
  • Disk kontrolera (ATA/SATA/SCSI/SAS/ …),
  • Mrežnih i drugih kartica.

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


Pooling i IRQ te Interrupt moderation


Pooling i IRQ


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:

  • izbjeglo se zagušenje cijelog sustava zbog generiranja prevelikog broja interrupta
  • paketi koji se povlače (poll) s mrežne kartice na obradu, mogu se dohvaćati u nizu
  • kod najgorih slučajeva, kada se tolika količina paketa ne može obraditi niti ovom metodom, sustav ih odmah odbacuje na samoj mrežnoj kartici, bez nepotrebnog dodatnog procesiranja od strane network stack dijela kernela operacijskog sustava

Osim toga, sam prijenos podataka od mrežne kartice prema CPU, može se odraditi na dva načina:

  • pomoću Programmed input/output metode u kojoj se CPU brine za svaki prijenos podataka od i prema mrežnoj kartici. Ovo naravno nije najbolja metoda jer se opterećuje CPU za svaku aktivnosz mrežne kartice
  • pomoću Direct memory access (DMA) metode, u kojoj mrežna kartica može preko DMA kanala pristupati direktno RAM memoriji, bez posredovanja CPUa. Ovo je danas standardna metoda komunikacije ali zahtjeva dodatnu logiku unutar mrežne kartice.



Interrupt moderation


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.




Napredno: CPU


Kao što smo naglasili, CPU odrađuje sve :

  • Aritmetičke operacije (zbrajanje, oduzimanje, množenje, dijeljenje i druge matematičke operacije),
  • Logičke operacije poput : I (AND), ILI (OR), NE (NOT) , NI (NAND) , NILI (NOR) , XILI (XOR) , XNILI (XNOR).
  • Kontrolne operacije - za koje je zadužen dio koji se zove “Control unit (CO)”) a koji na osnovi programskih instrukcija nalaže svim ostalim jedinicama (Aritmetičko-logičkoj, Ulazno/izlaznoj i Memoriji) što i kako da “odrade”.
  • Ulazno/Izlazne operacije,

Pogledajmo i blok dijagram modernih procesora:

Na svim novijim generacijama procesora (CPU) integrirane su i mnoge druge komponente, poput:

  • Grafičkog čipa
  • Memorijskog kontrolera
  • DMA kontrolera
  • IRQ kontrolera
  • Ali i cijeli niz dodatnih komponenti koje ubrzavaju određene operacije:
    • Od matematičkih operacija koje su integrirane u FPU (Engl Floating Point Unit) tj. dijelu koji odrađuje matematičke operacije s pomičnim zarezom (zbrajanje, oduzimanje, množenje, dijeljenje, korjenovanje, eksponencijalne funkcije, logaritme, trigonometrijske funkcije i sl.)
    • SIMD (Engl. Single instruction, multiple data) funkcionalnosti unutar kojih se nalazi i:
      • MMX niz instrukcija zaduženih za multimedijalne zadatke (obrade slika i zvuka i sl.) ali samo s cjelobrojnim operacijama (bez “pomičnog zareza”)
      • SSE (Engl. Streaming SIMD Extensions) instrukcije (njih oko 70), koje su zadužene za digitalnu obradu signala i obradu grafike. Uslijedile su i dodatne funkcionalnosti koje su uvedene sa SSE2, SSE3, SSSE3 i SSE4. SSE je uveo i računanje s “pomičnim zarezom” (decimalnim brojevima)
    • Podršku za virtualizaciju
    • Podršku za generator slučajnih brojeva (Engl. Random Number Generator) (RDRAND)
    • Podršku za kriptiranje/dekriptiranje upotrebom AES algoritma (AES-NI/AES)

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 funkcionalnostiFlag (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


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 procesoraBroj registara opće namjene, data i adresnih registara Broj Floating Point registara
16 bitni x8688
32 bitni x8688
64 bitni x861616
Intel Itanium128128
SPARC3132
Power arhitektura3232
32 bitni ARM14 varira do 32
64 bitni ARM3132
MIPS3132



Malo detaljnije o registrima


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 :

  • 16. bitni x86 (proizvode ih Intel ili AMD)
  • 32. bitni x86 (proizvode ih Intel ili AMD)
  • 64. bitni x86 (proizvode ih Intel ili AMD)
  • Itanium (proizvodi ga Intel)
  • Motorola 6800 (Motorola)
  • Motorola 68000 (Motorola)
  • SPARC (proizvode ga SUN/Oracle, Fujitsu)
  • IBM power (proizvodi ga IBM)
  • Power (otvorena arhitektura - proizvode ga IBM, Freescale, AppliedMicro. LSI , …)
  • ARM 32 ili 32/64.bitni (Licencira se dizajn a proizvode ga gotovo svi)
  • MIPS (Licencira se dizajn - MIPS technologies/Imagination Technologies)

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.



CPU Microcode


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)



CPU registri još detaljnije


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:

  • najbrža (i najmanja) Layer 1 memorija, podijeljene u dva dijela, jedna je za instrukcije (zvana i ITLB1) a druga za podatke (zvana i DTLB1)
  • malo sporija Layer 2 ali znatno veća memorija koja se dijeli između Layer 1 memorija
  • kod višejezgrenih procesora tu je i Layer 3 memorija koja se dijeli između svih jezgri, dok su Layer 1 iLayer 2 unutar svake jezgre.

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 udaljenoMemorija kojoj se pristupaKoliko je CPU ciklusa potrebnoKoliko 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 :

  • Prvo sam sustav mora nekako odreagirati kod primanja svakog mrežnog paketa. Dakle na samom početku dolazi do pozivanja određenog sistemskog poziva. Ovdje se radi o vremenu potrebnom kako bi se uopće odradio određeni sistemski poziv i pokrenula cijela procedura a nerijetko je ovo vrijeme u granicama između 40ns i 90ns.
  • pokušavaju se dohvatiti podaci priručne (cache) memorije procesora:
    • L1 cache: oko 5ns
    • L2 cache: oko 5-7ns
    • L3 cache: oko 7-9ns
  • U slučaju da podaci nisu u priručnoj memoriji procesora (CPU), dolazi do promašaja (cache miss), te se moraju ponovno dohvatiti: ova vremena mogu biti između 10ns i 40ns (i više). Primjerice za Intel Xeon E5-2650, ovo vrijeme je 32ns.
  • Dodatno za prebacivanje na određeni proces, događa se lock odnosno mutex operacija kojoj treba od 8ns do 17ns (trebamo dvije ovakve operacije za svaki paket) - recimo da je to ukupno 17ns.
  • I sada na kraju ide obrada jednog paketa te potom iskorištavanje onog drugog mutexa.
  • Dolazi nam drugi mrežni paket → sve iz početka


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 i NUMA



SMP

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 :



CPU Affinity


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 :

  • pokretanju procesa na određenoj jezgri procesora i potencijalnom prebacivanju procesa na druge jezgre procesora
  • prioritetima obrade podataka (Engl. Task scheduler priority & policy) na razini ispod svakog procesa/aplikacije prema CPU-u.


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:

  • za postavljanje “CPU afiniteta” već pokrenutog procesa
  • za pokretanje novog procesa s definiranim CPU afinitetom
  • za provjeru CPU afiniteta pokrenutih procesa

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


Process/Thread Affinity i CPU Affinity


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 nit

Ako 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

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:

  • dva memorijska kontrolera (MMU) (svaki CPU ima svoj MMU)
  • dvije memorijske sabirnice (svaki CPU ima svoju)
  • dva niza RAM memorije (svaki “niz” RAM memorije pripada pojedinom CPU)
  • Jednu dodatnu sabirnicu koja povezuje sve fizičke procesore, pri tome ugrubo imamo dva rješenja, AMD i Intel (i nekoliko podvarijanti):
    • AMD ovu sabirnicu (za NUMA odnosno multi CPU) zove HT (Engl. Hyper Transport Interconnects)
    • Intel ovu sabirnicu (za NUMA odnosno multi CPU) zove QPI (Engl. Quick Path Interconnect)



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 procesoraBroj QPI linkova koje podržavaKoliko se može skalirati
Xeon E5-2620 2 2S
Xeon E7-4830 v23S4S
Xeon E7-4830 v33S4S
Xeon E7-8860 4S8S
Xeon E7-8870 v34S8S

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:

  • dva procesorska (CPU) utora (S2S ili 2S)
  • četiri procesorska (CPU) utora (S4S) ili
  • osam procesorskih (CPU) utora (S8S)

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 ?

  • Linux KVM hypervisor i QEMU imaju podršku za NUMA ( i odličan NUMA scheduler). Noviji Qemu (v.3.4.+) ima riješen NUMA scheduler koji je u rangu Enterprise rješenja komercijalnih proizvođaća platformi za virtualizaciju.
  • Java 7 ima podršku za “NUMA-aware” alokaciju RAM memorije.


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:

  • prvom fizičkom procesoru ( node0 ), dostupne jezgre, koje Linux vidi kao :
    • 0 , 2 , 4 i 6
  • drugom fizičkom procesoru ( nodeq ), dostupne jezgre, koje Linux vidi kao :
    • 1 , 3 , 5 i 7

Također vidimo da :

  • prvi fizički procesor ( node0 ), ima :
    • 49141 MB RAM memorije dostupno
    • 7227 MB RAM memorije slobodno
  • drugi fizički procesor ( node1 ), ima :
    • 49151 MB RAM memorije dostupno
    • 7228 MB RAM memorije slobodno

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

  • serijskom vezom (direktna veza jednog CPU a drugim) -ako imamo 2 fizička procesora
  • u topologiji prsten - ako ih imamo 4 ili više
  • u “Mesh” topologiji (svaki sa svakim - ako ih imamo 4 ili više).

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 node
  • Naredba join povezuje statistike iz obije datoteke u jednu (pošto obije datoteke imaju istu strukturu - stupaca i redova a mijenjaju se samo “brojevi”).
  • Naredbom awk samo filtriramo ispis

Rezultat ć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



NUMA I/O topologija


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 :

  • Linux program ← NUMA I/O → Uređaj

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 :

  • 0:yy.z –> Sve PCI oznake koje počinju s 0
  • 3f:yy.z –> Sve PCI oznake koje počinju s 3f
  • 40:yy.z –> Sve PCI oznake koje počinju s 40
  • 7f:yy.z –> Sve PCI oznake koje počinju s 7f

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 :

  • na najnižoj razini provjeriti koji IRQ koristi uređaj čiji NUMA I/O optimiziramo - treba biti na istom NUMA NODE-u, tj CPU jezgri (ili jezgrama) unutar tog istog NUMA NODE-a
  • proces/program/aplikacija mora također biti na istom NUMA NODE-u kao i sam uređaj i njegov IRQ.



NUMA CPU i RAM affinity


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


NUMA Affinity Management Daemon (numad)


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.


Praćenje procesa i opterećenja CPU jezgri


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



Naredba ps


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) 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 nit


Za dodatne primjere upotrebe naredbe pogledajte poglavlje ”Procesi


Pogledajte i naredbu sar, u poglavlju Naredba "sar".



Naredba top


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



naredba htop


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 (NUMA ili SMP)


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 za CPU


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.



Od kojih komponenti se sastoji Unix / Linux

Linux se sastoji od sljedećih komponenti:

* Kernela odnosno jezgre operacijskog sustava, a koji sadrži:

  • podsustav za pokretanje operacijskog sustava (engl. boot code)
  • upravljačke programe (engl. device drivers) za sav hardver,
  • memorijski management i management za baratanje s datotekama i direktorijima te kontrolne i upravljačke mehanizme potrebne za rad svih aplikacija

* Razvojnog okruženja, koje se sastoji od:

  • Compilera, linkera, …
  • Sistemskih biblioteka (engl. System library), …
  • Programa za pronalaženje pogrešaka (Engl. Debugger) i drugih pomoćnih programa

* Korisničkog sučelja (Engl. User interface):

  • Naredbeni redak (Engl. Shell)
  • Grafičko sučelje
  • Ostali programi (GNU)
  • Dokumentacija

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.



Kernel


Linux kernel je jezgra operacijskog sustava Linux.

Linux kernel je zadužen za :

  • Pristup, kontrolu i upravljanje hardverom
    • upravljanje prekidima (IRQ)
  • upravljanje kernel modulima
  • Upravljanje i rad s memorijom
  • Pokretanje, kontrolu i rad cijelog operacijskog sustava:
    • pokretanje, upravljanje, rad i zaustavljanje svih procesa (programa/aplikacija),
    • upravljanje vremenom: osiguravanje vremenskih okvira za rad svih procesa (programa/aplikacija)
      • zamjenu između pokrenutih procesa ili niti (eng. context switch)
  • međuprocesnu komunikacija
  • upravljanje i rad datotečnim sustavom
  • upravljanje i rad s mrežom i mrežnim sustavom
  • sigurnost (kontrola prava pristupa) i drugo

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:

  • Od matične ploče i svih njenih dijelova,
  • disk kontrolera,
  • mrežne i grafičke kartice,
  • zvučne kartice i sl.

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 registrima
  • Virtual 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:

  • oni koji predstavljaju upravljačke programe za određeni hardver ili hardverske komponente
  • oni koji predstavljaju neke dodatne funkcionalnosti

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 CPUa
    • aesni-intel - daje nam (za Intel CPU) hardversku akceleraciju AES kriptografskih funkcija, koje su ugrađene u CPU
    • rng-core - - daje nam hardversku akceleraciju funkcija generiranja slučajnih brojeva, koja je ugrađena u CPU
  • Chipset - ovdje se nalaze razne komponente chipseta, poput
    • pcieport - upravljački program za PCI Express sabirnicu, ovaj modul je često unutar samog kernela
    • uhci_hcd i ehci_hcd - ovo su upravljački programi za USB kontrolere
    • agpgart-intel je upravljački program za AGP sabirnicu
    • i801_smbus je upravljački program za SMBUS (System Management Bus) sabirnicu
  • Disk 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 HP
    • megaraid_sas je upravljački program za Mega RAID SAS RAID kontrolere (1078/2108/2008/2208/…) tvrtke LSI
  • Mrežne kartice - u ovom dijelu su upravljački programi za razne mrežne kartice
    • e1000e je upravljački program za 1Gbps mrežne kartice (82571, 82572, 82573, 82574, 82583, ICH8, ICH9, ICH10, PCH, PCH2, I217, I218, I21) tvrtke Intel
    • tg3 je upravljački program za 1Gbps mrežne kartice (BCM 57xx) tvrtke Broadcom
    • igb je upravljački program za 1Gbps mrežne kartice (82575, 82576, 82580, I210, I211, I350, I354, DH89xx) tvrtke Intel

Druga 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 sustava
  • Datoteč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 funkcionalnosti
    • xfs je dio dio funkcionalnosti XFS datotečnog sustava, kao što je zfs dio funkcionalnosti ZFS datotečnog sustava
    • cifs 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 funkcionalnosti
    • ip_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 funkcionalnost
      • nf_conntrack - zadužen za napredne funkcionalnosti praćenja stanja svake mrežne konekcije
  • Druge funkcionalnosti - ovdje su navedene neke od drugih funkcionalnosti
    • edac_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)




Rad s kernelom


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


Koje su sve generacije Linux kernela u upotrebi


Danas su u upotrebi sljedeće generacije Linux kernela

  • 2.6.x
  • 3.x
  • 4.x

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 :

  • 2.6:
    • 2.6.32-x
  • 3.x
    • 3.10.x
    • 3.18.x
  • 4.x
    • 4.1.x


Kako saznati koju verziju Linux kernela imamo na računalu


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 :

  • Kernel verziju/generaciju (engl. Major version) 2.
  • Kernel niža verzija (engl. Minor) 6.
  • Podverziju 32 - podverzija 2.6.32 je označena kao verzija s produženom podrškom tj . LTS (Long Term Support)
  • 573.3.1 update/fix verzija
  • el6 označava “Enterprise Linux” v.6. odnosi se na RedHat Enterprise Linux generacije 6.x (ovo jeCEntOS 6.6. koji je baziran na RedHat Enterprise Linux 6.6)
  • x86 označava da je arhitektura procesora x86
  • 64 znači da je 64.bitan kernel (i sam Linux)


Napredno : Kako vidjeti koji kernel moduli su pokrenuti


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 firewall
  • parport je upravljački program za paralelni port na računalu
  • e1000e je upravljački program za intelovu Gigabitnu mrežnu karticu
  • ext4 je upravljački program koji donosi podršku za Linux ext4 dattotečni sustav
  • cdrom je upravljački program koji donosi podršku za CD/DVD-ROM uređaje
  • ata_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 karticu
  • video i output su upravljački programi koji koriste grafičke kartice - u ovom slučaju :Intel i915


Napredno : Rad s kernel modulima


Gdje se nalaze kernel moduli


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



Što je s kernel modulima u samom kernelu


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:

  • Unutar samog kernela
  • Kao (vanjski) kernel modul
  • ili uopće ne koristiti.

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 konkretnom kernel modulu


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

... ... ...



Kako se učitavaju kernel moduli


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.

Slika USB-LAN :

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.

  • kernel modul usbnet koristi kernel modul asix
  • kernel modul mii 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.


Parametri koje možemo poslati kernel modulima te automatsko učitavanje modula


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 interruptima
  • 1 - rad sa MSI interruptima
  • 2 - 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 :

  • započeti novi red s ključnom riječi: 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)

  • započeti novi red s ključnom riječi: 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 željenih kernel modula


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:

  1. Prvi red datoteke mora sadržavati: #!/bin/bash
  2. Svaki novi red u datoteci mora biti pisan kao da se radi o shell skripti, jer ovo i je shell skriptna datoteka
  3. Ova datoteka mora biti izvršna (mora imati postavljen x bit), primjerice sa:
cd /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.


Dodavanje novih kernel modula


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.


Uređaji ukratko (devices)


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:

  • character
  • block
  • te posebne vrste :
    • Pipe i Named Pipe
    • Socket
    • simbolićki link
  • posebne datoteke koje predstavljaju uređaje

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: PlantUML Graph

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 :

  • kao character datoteke, koje od i prema uređajima šalju ili primaju podatke u nizu charactera odnosno znakova ili
  • kao block 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.



Uređaji (devices) detaljnije


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:

  1. prvi broj se naziva Major odnosno značajniji broj (u našem slučaju je to broj 8 za oba uređaja)
  2. drugi broj se naziva Minor odnosno manje značajan (u našem slučaju disk sda ima broj 0 a disk sdb ima broj 16).

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đaju
  • character - 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:

  1. vršna razina, kojom upravlja sd komponenta, a koja se oslanja na upravljački program za disk kontroler (dolje)
  2. sam upravljački program za konkretan disk kontroler i u konačnici disk

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 brojTip (block/character)Vrsta uređajaMinor brojUređajOpis
1charMemorijski uređaji1/dev/mempredstavlja pristup memoriji
3/dev/nullpredstavlja prazan uređaj, koji može primati podatke (u prazno)
5/dev/zeropredstavlja generator nula
8/dev/randompredstavlja nedeterministički generator slučajnih brojeva
9/dev/urandompredstavlja jednostavni (brzi) generator slučajnih brojeva
1blockRAM disk0/dev/ram0prvi RAM disk
1/dev/ram1drugi RAM disk
3blockATA (IDE) disk0/dev/hdaMaster disk
64/dev/hdbSlave disk
1/dev/hd*1Prva particija bilo kojeg hd (ATA) diska
2/dev/hd*2Druga particija bilo kojeg hd (ATA) diska
4charTTY uređaji (terminali/konzole)0/dev/tty0Trenutna konzola za rad
1/dev/tty1Prva konzola/terminal
2/dev/tty2Druga konzola/terminal
5charDrugi TTY uređaji0/dev/ttyTrenutna konzola za rad
1/dev/consoleSistemska konzola
6charParalelni printeri0/dev/lp0Printer na prvom paralelnom portu
1/dev/lp1Printer na drugom paralelnom portu
7blockLoopback uređaji0/dev/loop0Prvi loop uređaj
1/dev/loop1Drugi loop uređaj
8blockSCSI disk uređaji0/dev/sdaPrvi SCSI/SAS/SATA disk (cijeli disk)
1/dev/sda1Prvi SCSI/SAS/SATA disk, prva particija na njemu
2/dev/sda2Prvi SCSI/SAS/SATA disk, druga particija na njemu
3/dev/sda3Prvi SCSI/SAS/SATA disk, treća particija na njemu
16/dev/sdbDrugi SCSI/SAS/SATA disk (cijeli disk)
32/dev/sdcTreći SCSI/SAS/SATA disk (cijeli disk)
9charSCSI tračni uređaji0/dev/st0Prvi SCSI/SAS/SATA tračni uređaj, mode 0
1/dev/st1Drugi SCSI/SAS/SATA tračni uređaj, mode0
32/dev/st0lPrvi SCSI/SAS/SATA tračni uređaj, mode 1
33/dev/st1lDrugi SCSI/SAS/SATA tračni uređaj, mode 1
9blockMetadiskovi (RAID)0/dev/md0Prva metadisk grupa
1/dev/md1Druga metadisk grupa
14charOpen Sound System (OSS)0/dev/mixerAudio mikser
1/dev/sequencerAudio sequencer
2/dev/midiPrvi audio MIDI port
3/dev/dspDigitalni audio
22blockDrugi ATA kanal0/dev/hdcMaster disk
64/dev/hddSlave disk
29charUniversal frame buffer0/dev/fb0Prvi frame buffer
1/dev/fb1Drugi frame buffer
81charVideo for Linux0/dev/video0Prvi video capture uređaj
1/dev/video1Drugi video capture uređaj
180charUSB uređaji0/dev/usb/lp0Prvi USB printer
48/dev/usb/scanner0Prvi USB scanner
188charUSB serijski uređaji0/dev/ttyUSB0Prvi USB serijski port
1/dev/ttyUSB1Drugi USB serijski port
203charCPU 0/dev/cpu/0/cpuidPrva jezgra CPUa - info
1/dev/cpu/1/cpuidDruga jezgra CPUa - info


Više detalja možete pronaći na http://elixir.free-electrons.com/linux/latest/source/Documentation/admin-guide/devices.txt.




Udev rules


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) tg3
  • eth1 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:

  • Za disk (pr. /dev/sdb) to možemo saznati:
udevadm info -a -n /dev/sdb
  • Za mrežnu karticu (pr. eth0), to možemo saznati pomoću naredbe:
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):

  • datoteka mora biti u direktoriju: /etc/udev/rules.d
  • datoteka mora imati ekstenziju: .rules
  • ime datoteke mora početi s rednim brojem, jer se sve datoteke unutar ovog direktorija učitavaju po redoslijedu, od manjeg prem većem broju

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



Nadogradnja firmwarea uređaja


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:

  1. ili instalirati pakete, unutar kojih se nalazi potreban firmware
  2. ili ručno kopirati firmware uređaja, sa stranica proizvođača

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:

  1. udev učitava driver (upravljački program) za hardver
  2. driver, ako mu je potreban firmware, to zatraži od sustava
  3. kernel kreira event prema udev servisu, u kojemu se traži firmware za konkretan uređaj
  4. udev 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 datoteku
  5. tu privremenu datoteku čita kernel i prosljeđuje ju upravljačkom programu konkretnog uređaja, za koji je namijenjen ovaj firmware
  6. upravljački program uređaja sada učitava firmware za uređaj

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

  • Broadcom: kernel moduli: tg3, bnx2 i bnx2x (deseci mrežnih kartica)
  • QLogic: deseci mrežnih kartica
  • Realtec: deseci mrežnih kartica (8192E/SU, 8105/6e, 8168/d/e/f/g/h, …)
  • Chelsio: kernel moduli: cxgb3, cxgb4 (niz mrežnih kartica: T3 i T4)
  • Myricom: kernel modul: myri10ge (niz 10Gbps mrežnih kartica)
  • Većina wireless mrežnih kartica


Izvori informacija: (147), (148), (149)




Sistemske biblioteke (Library(s))


Š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 (Engl. Static Libraries)

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.


Prednosti i mane dijeljenih i statičkih biblioteka


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.



Kako to radi

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:

  • /lib/
  • /lib64/
  • /usr/lib/
  • /usr/lib64/

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



Rad s dijeljenim bibliotekama


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.


Dodavanje novih direktorija za 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 :

  1. Kreiranje nove datoteke unutar direktorija /etc/ld.so.conf.d/
  2. Pokretanje naredbe ldconfig, kako bi se osvježila lista direktorija za biblioteke



Što još treba znati


Nakon što se pokrene naredba ldconfig, ona zapravo radi sljedeće:

  • Prvo provjerava konfiguracijsku datoteku /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
  • Potom se kreira lista svih dijeljenih biblioteka koje su pronađene iz svih navedenih putanja. Lista se generira u datoteku : /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
... ... ...
... ... ...



Koje dijeljene biblioteke su nam potrebne za koji program


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)


Napredno


Osim lokacije (putanje na disku) dijeljenih biblioteka, vidljive su još dvije stvari:

  • 1. linux-vdso.so.1 biblioteka nema svoju lokaciju na disku (odakle se onda učitala ?)
  • 2. Memorijske lokacije za iste dijeljene biblioteke su kod svakog pozivanja drugačije (zbog čega ?)

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


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:

  • Bourne shell ( sh )
  • Bourne-Again shell ( bash )
  • Z shell ( zsh )
  • C-shell ( csh )
  • T Shell ( tcsh )
  • Korn shell ( ksh )

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:

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

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.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 reda
  • CTRL e - skoči na kraj reda
  • CTRL c - prekini izvršavanje naredbe
  • CTRL d - odlogiraj se
  • CTRL d - još znači i pošalji End of File trenutnom procesu
  • CTRL ALT Fn - prebaci se na n-ti terminal (n=1…6) : pr CTRL ALT F1
  • CTRL z - privremeni prekid rada procesa (suspend)

Kako izgleda Shell (komandna linija):

root@Server1 :~$


Osnove


U ovom poglavlju upoznati ćemo se s osnovama rada u shellu

Logiranje / odlogiranje


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 :

  • Minimalna dužina imena accounta je 6 znakova (u pravilu)
  • Lozinka se mijenja naredbom : passwd
  • Izlaz iz sustava se ostvaruje sljedećim naredbama: exit , logout
    Ili kombinacijom tipki : CTRL d


Rad s korisničkim računom


Važno je znati kako svaki korisnički račun ima neke svoje specifičnosti:

  • svaki korisnički račun ima svoj ID (uid)
  • svaki korisnički račun pripada barem jednog grupi
  • svaka grupa ima svoj ID (gid)

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


Osnovne kontrolne naredbe


U radu sa shellom, možemo koristiti osnovne kontrolne naredbe, poput:

  • CTRL a - skoči na početak reda
  • CTRL e - skoči na kraj reda
  • CTRL c - prekini izvršavanje naredbe
  • CTRL d - odlogiraj se
  • CTRL d - još znači i pošalji End of File trenutnom procesu
  • CTRL ALT Fn - prebaci se na n-ti terminal (n=1…6)
  • CTRL z - privremeni prekid rada procesa (suspend)



Aliasi


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



Pamćenje izvršenih (starih) naredbi [ History ]


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:

  • pozvati ponovno
  • pretraživati

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 ls
  • CTRL r – pretraži history (ovo važi za bash shell) nakon ovog se upisuje pojam/naredba koja se traži iz historyja



Tko je sve logiran i što radi ?


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 pokrenuo
  • last prikazuje tko je sve bio logiran u sustav


Sada ćemo se upoznati s navedenim naredbama.


who


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 :

  • da je operativni sustav startan 31.07.2014 u 20:05.h.
  • da je trenutni Runlevel 3
  • da su logirani korisnici 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)


w


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



last


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:

  • U prvom stupcu je ime korisničkog računa koji se spojio na sustav
  • U drugom redu je terminal na koji se spojio (pts su virtualni terminali- remote pristup)
  • U trećem stupcu je IP adresa korisnikovog računala ako se radi o udaljenom pristupu
  • Četvrti do sedmog stupca označavaju datum i vrijeme od kada do kada je ta veza bila otvorena
  • Zadni stupac prikazuje točno vrijeme rada

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



Osnovna komunikacija između korisnika


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


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 poruku
  • tty 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


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 :

  • na standardni ulaz (stdin)
  • pisanjem poruke slično kao i sa naredbom 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.



Upoznajmo se s Linuxom


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.


Saznajmo nešto više o Linuxu i Linux naredbama

Na većini Unix i Linux sustava standardno su instalirane i detaljnije upute za svaku naredbu, koje je moguće i pretraživati .

man naredba


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 i apropos naredbe


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.


Osnovne naredbe vezane uz operativni sustav i komponente računala:


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 informacije
  • dmesg : ispiše sistemske poruke (HW Events)
  • dmidecode: ispiše DMI (SMBIOS) info ili sadržaj /proc/ direktorija
  • lspci : ispiše sve PCI uređaje

Pogledajmo š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 Linux
  • uciona01.inkubator.hr ovo je ime računala (Hostname)
  • 2.6.32.-23-pve ovo je verzije Linux kernela
  • SMP “Symmetric multi-processing” - podrška za više procesora (CPU) ili više jezgri
  • Tue Aug 6 07:04:06 CEST 2013 Datum kada je linux kernel compile-iran
  • x86_64 x86_64 Arhitektura za koju je kernel compile-iran
  • x86_64 Arhitektura ovog sustava
  • GNU/Linux OS : GNU tools / Linux kernel
dmesg

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 :

  • kada ubacite CD ili USB stick
  • o grešci neke komponente sustava i sl.
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:

  • bios
  • system
  • baseboard
  • chassis
  • processor
  • memory
  • cache
  • connector
  • slot

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


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:

  • Ne postoji fragmentacija podataka
  • Oni su transakcijski (journaling) datotečni sustavi
  • Podržavaju dodatne napredne mogućnosti


Od čega se sastoji UNIX/Linux file system


Unix/Linux Datotečni sustav se sastoji od :

  • direktorija,
  • datoteka i
  • I-node tablica

I-node tablica sadrži zapis za svaku datoteku i direktorij:

  • Vlasnika (owner),
  • Grupu (group),
  • Prava čitanja, pisanja i izvršavanja (r w x ),


Struktura datoteka i direktorija:


U samoj strukturi datoteka i direktorija, postoje određena pravila:

  • razlikuju se velika i mala slova
  • koristi se hijerarhijska struktura direktorija
  • struktura direktorija je u obliku stabla
  • osnovne grane su već definirane i rezervirane za operacijski sustav
  • imena direktorija i datoteka mogu biti dužine 255 znakova, mogu se koristiti svi znakovi osim:

! @ $ ^ & * , ; ‘ ` “( ){ } [ ] < > | / \ ? ~ razmak


Struktura sistemskih direktorija


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:

struktura_sistemskih_direktorija.jpg

Pogledajmo i malo detaljniju sliku hijerarhijskog stabla Unix/Linux direktorija:

PlantUML Graph

Š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-XY
  • initrd 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-XY
  • Config 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 sustava
    • passwd liste i definicije korisnika
    • shadow kriptiranih (zapravo hasheva) lozinki za sve korisnike
    • group definicije korisničkih grupa
    • hosts 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.



Direktoriji i datoteke


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 skripta

Te š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 datoteku

Osim 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 ]

Napredno


Named pipe


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:

  • named pipe postoji kao posebni uređaj (device) u datotečnom sustavu
  • Procesi različitih roditelja mogu dijeliti podatke kroz “named pipe”
  • Kada su sve I/O (ulazno/izlazne operacije) završile kroz “named pipe” on i dalje ostaje na datotečnom sustavu kao datoteka - za dalju odnosno ponovnu upotrebu prema potrebi.

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

PATH (Putanje)


Putanja do neke datoteke može biti:

  • Apsolutna (počinje od root direktorija / ) : pr datoteka messages.: /var/log/messages
  • Relativna (počinje od trenutnog direktorija) pr.: nalazimo se u /var pa je putanja do datoteke: log/messages

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



Ovlasti (permissions & modes)

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 :

  • Prema vlasniku (owner)
  • Prema grupi (group)
  • Prema svima ostalima (all other users)

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)
  • Pravo pisanja (Write)
  • Pravo izvršavanja/pokretanja (Execute)

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.


Što nam govore ovlasti

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 ]

  • Prvi niz od tri znaka (oktet) su za vlasnika (owner) [u ovom slučaju rwx ]
  • Drugi niz od tri znaka (oktet) su za grupu (group) [u ovom slučaju r-x ]
  • Treći niz od tri znaka (oktet) su za sve ostale (others) [u ovom slučaju 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 ]
  • sticky ( 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:

permissions.jpg

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

  • Za koga mijenjamo ovlasti
    • [ a ] svi (i vlasnik i grpa i svi ostali)
    • [ u ] vlasnik (owner : user)
    • [ g ] grupa (group)
    • [ o ] svi ostali (other)
  • Operator : dodajemo ili oduzimamo ovlasti
    • [ + ] dodajemo
    • [ - ] oduzimamo
  • Koje ovlasti mijenjamo
    • [ r ] čitanje (read)
    • [ w ] pisanje (write)
    • [ x ] izvršavanje/pokretanje (execute)
  • Posebne ovlasti
    • [ 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+x
  • 5 za grupu (group) - tj. r+x
  • 5 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 :

  • vlasnika (owner), da može čitati, zapisivati i izvršavati/pokretati: r+w+x (7)
  • grupu (group), da može samo čitati i pokretati: r+x (5)
  • za sve ostale (others), da mogu samo čitati i pokretati : r+x (5)
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)
421 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 GIDSticky bit + Set UIDSticky bit + Set GID Set UIDSet GIDSticky 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



Rad s direktorijima i datotekama


Sada ćemo vidjeti kako izgledaju ovlasti, te što je još vidljivo na razini datoteka i direktorija. Pogledajmo primjer izlistanja sadržaja direktorija:

rad-s-direktorijima-idatotekama.jpg

Što je ovdje vidljivo ?

  • (1) Ovlasti/permissions (objašnjeno nešto prije)
  • (2) Brojčana vrijednost :
    • Za datoteke broj hard linkova na tu datoteku (obično 1)
    • Za direktorije broj poddirektorija +2 (ako ih nema onda je 2 , ako sadrži 1 poddirektorij onda je vrijednost 3 , … )
  • (3) Tko je vlasnik (root)
  • (4) Kojoj grupi pripada (server)
  • (5) Veličina :
    • Za datoteke – veličina datoteke
    • Za direktorij – veličina za metapodatke za datoteke unutar tog direktorija (obično je to default veličina bloka datotečnog sustava [ext2/3/4/]) i može rasti
  • (6) Datum zadnje izmjene
  • (7) Ime datoteke/direktorija



umask

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:

  • Za direktorije : maksimalna. vrijednosti za direktorije je 777, računica je : 777 – 022 = 755
  • Za datoteke : maksimalna vrijednosti za datoteke je 666, računica je : 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



Osnovne Linux naredbe

Popis nekih od osnovnih Linux/Unix naredbi:


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 sata
  • cal - 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

... ... ...

Naredbe za rad s direktorijima


U radu s naredbama koje slijede malo ćemo se dublje upoznati s već naučenim naredbama te ćemo naučiti i neke nove

Naredbe : ''cd'', ''ls'', ''pwd'', ''mkdir'', ''mv'' i ''rmdir''


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 IME2
  • mv ime-datoteke ime-dir (move) prebaci datoteku u direktorij
  • mv staro-ime novo-ime (move) prebaci datoteku prvog imena u drugo ime
  • rmdir IME – obriši direktorij imena IME (remove directory):
    • ne može se brisati direktorij u kojem se nalazimo
    • ne može se brisati direktorij koji je pun :
      • Za rekurzivno brisanje punih direktorija koristiti rm -rf IME

Za 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 vrijednosti
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

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 direktorijaOpis
. Označava trenutni direktorij
.. Označava jedan direktorij ispred (prije ovoga u kojem se nalazimo)
lista.txt Datoteka imena lista.txt
popis-polaznika.txtDatoteka 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 upozorenja
rm -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).



Kreiranje datoteka


Za kreiranje datoteka, možemo koristiti slijedeće naredbe:

  • touch IME – kreiraj praznu datoteku imena IME
  • cat > 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 editorom
  • echo > IME – kreiraj praznu datoteku imena IME
  • dd - 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.

  1. Pogledajte poglavlje ”Named pipe
  2. Pogledajte i poglavlje “Diskovni IO sustav” - sparse files



Naredbe za ispis datoteka


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

........

Rad s datotekama


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)

  • cp izvor1 izvor2 odredište
  • cp -r izvor odredište - Rekurzivno kopiranje direktorija

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

Rad sa sadržajem datoteka

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 datoteci
  • uniq izbacivanje riječi koje se ponavljaju
  • sort sortiranje riječi (po abecedi, broju ili sl.)

grep

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đen

Primjeri

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.


cut

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

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
  • C (programski jezik)

awk je interpreterski programski jezik, što znači kako se direktno izvršava bez compile-iranja, a koristi se za :

  • procesiranje teksta,
  • izvlačenje podataka,
  • reporting,
  • provjeru i manipulacije s tekstom,

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
Varijable

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=)

Funkcije i for petlje

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



Uvjeti

Kao i svaki drugi programski jezik awk ima i uvjete, popis uvjeta koji su podržani je :

  • if-else
  • while
  • do-while
  • for
  • switch
  • break
  • continue
  • next
  • nextfile
  • exit

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 :

  • Dali su brojevi koji se kreiraju veći ili jednaki 5 ili manji ili jednaki 5

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
Polja (Array)

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


Pretraživanje

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
Aritmetičke operacije i operatori

awk nam omogućava upotrebu aritmetičkih operacija i operatora:

Operatori :

  • > Veće od
  • >= Veće ili jednako od
  • < Manje od
  • ⇐ Manje ili jednako od
  • == Jednako sa
  • != Različito od
  • && Oba izraza moraju biti istinit
  • || Bilo koji od izraza mora biti istinit

Aritmetičke operacije:

  • + Zbrajanje

- Oduzimanje

  • / Dijeljenje
  • * Množenje
  • ^ Potenciranje
  • % Modulo (pr. 16%6=4 ,16/6=2 , 2*6=12 , 16-12=4)

Popis unarnih operacija

  • + “Pozitiviranje” broja
  • - Negiranje broja
  • ++ Auto increment
  • – Auto decrement

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 :

https://www.gnu.org/software/gawk/manual/gawk.pdf

sed

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 linije

Primjeri.

Kreirati ćemo datoteku iena : ulaz.txt koja će sadržavati:

POCETAK
1
2
STARO
3
4
NOVO
5
KRAJ
Zamjena stringova

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
Brisanje stringova

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


tr


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

VrijednostOpis
[: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:

VrijednostOpis
\\backslash
\bbackspace
\nnewline
\hhorizontal tab
\vvertical 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 :

  • svako malo slovo “a” se mijenja sa velikim slovom “A”,
  • svako malo slovo “b” se mijenja velikim slovom “B”,
  • …. i tako do kraja.

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



Traženje datoteka

S vremena na vrijeme porebno nam je pronaći neku datoteku (ili naredbu), prema određenom kriteriju, u tu svrhu se koriste:

  • whereis
  • which
  • locate i updatedb
  • find
  • xargs



whereis

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

which

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

  • Kako se naredba ls nalazi u /bin/ direktoriju
  • Kako naredba ls ima alias koji presreće izvornu naredbu ls tj. poziva ju s određenim prekidaćem , tj. ovako : ls –color=auto

locate i updatedb

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.

find

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
xargs

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) i “Pipe”

Preusmjeravanje (redirekcija), radi se pomoću meta znakova « < > » . Pri tome se koriste:

  • Standardni ulaz, odnosno 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).
  • Standardni izlaz, odnosno stdout. On predstavlja izlaz podataka iz procesa ili programa. Ove poruke se obično šalju na “Monitor/Ekran” ili prema drugom programu.
  • Standardna greška, odnosno 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:

  • Kada je potrebno učitati podatke u program, koristi se stdin.
  • Kada program treba ispisati izlazne podatke “van”, oni se šalju na stdout
  • Kada program mora ispisati neke poruke o greškama u radu ili obradi podataka, ove poruke se šalju na stderr

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

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 :

* ? ! [ ] -

Značenje nekih meta znakova

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

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 :

  • vi
  • more
  • grep
  • sed
  • awk
  • notepad++

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 :

  • ako je prvi znak ovlasti - tada se radi o datoteci
  • ako je prvi znak ovlasti d tada se radi o direktoriju

Izlistajmo 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 ^$ .


Regularni izrazi i metaznakovi


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 (*).


Upotreba metaznaka za komentar #


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"



Upotreba navodnika (jednostruki, dvostruki i jednostruki kosi)

Pod posebne metaznakove spadaju i navodnici. Njih postoje tri vrste:

  • Jednostruki navodnici ‘ ’ isključuju interpretaciju svih meta znakova osim ! i \
  • Dvostruki navodnici “ “ isključuju interpretaciju svih metaznakova osim $ (koji služi za supstituciju varijabli) te ! i ` \
  • Jednostruki kosi navodnici ` ` - 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


Upotreba uglatih ''[ ]'' zagrada


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.


Upotreba vitičastih ''{ }'' zagrada


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



Procesi

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 :

  • Normalni proces: ovoj kategoriji pripada velika većina procesa
  • Real time: odnosno procesi koji moraju reagirati iznimno brzo na sve promijene ili događaje (Engl. Events ). Ovakvi procesi se obrađuju na drugačiji način od “normalnih” procesa


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 proces
  • STIME - vrijeme kada je proces pokrenut
  • TIME - vrijeme koliko je CPU radio na procesu
  • CMD - 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 prioritetom
  • N - proces s niskim prioritetom
  • L - proces ima označene i zaključane regije memorije (pages) (za realtime i I/O procese)
  • s - session leader
  • l - 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 :

  • PID 150 - udevd servis (daemon) - zadužen za prepoznavanje hardvera
  • PID 555 - syslog servis (daemon) - servis za logiranje poruka
  • PID 783 - ssh servis (daemon) - servis za udaljeni pristup preko SSH protokola

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:

  • za funkcionalnosti kernela, vezanih za procese i sistemske pozive, timere, signale prekida (interrupts), komunikaciju s I/O podkomponentama i slično, zadužen je kworker kernel proces/thread
  • za kontrolu pripadnosti CPU jezgri i memorije za pojedini proces: cpuset
  • za raspodjelu procesa na CPU jezgre:migration kernel proces/thread
  • od svih dijelova diskovnog podsustava, primjerice:
    • aio - zadužen za asinkroni pristup diskovnom podsustavu
    • kswapd - zadužen za swap funkcionalnosti
    • flush - zadužen za zapisivanje podataka iz disk cache memorije, periodički, na disk
    • kblocks - zadužen za kontrolu i pristup diskovnom sustavu na najnižoj razini
    • kintegrityd - zadužen za integritet podataka koji se spremaju prema diskovnom podsustavu
    • scsi_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.
  • sustava za baratanje softverskim signalima prekida (interruptima): ksoftirqd
  • sustava virtualne memorije, primjerice: kmalloc, khugepaged, ksmd
  • mrežnim sustavom, primjerice: bond - za agregaciju mrežnih kartica
  • … i cijeli niz drugih kernel thread procesa


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” – pokrenuto
  • D - “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



Prioriteti i procesi

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:

  • prvi prioriteta 90% a
  • drugi 10%

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: PlantUML Graph

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:

  • Svaki pokrenuti proces ima određeni prioritet
  • Standardni prioritet je često 0
  • Standardni prioritet korisničkih programa je 19
  • Prioriteti se kreću od -20 do 20 (19)
  • Najveći prioritet je -20 a najmanji 20


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.



Primjeri


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 :

ParametarOpis
priStvarni prioritet procesa
nice“Nice” odnosno podatak da li se mijenjao prioritet
pidProcess ID
ppidParent Process ID
cmdIzvrš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


Procesi i signali koje im možemo poslati

  • Svakom procesu koji je pokrenut možemo poslati određene signale (postoji ih na desetke), najkorišteniji su:
    • 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 proces
    • SIGTERM (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



Napredno: O procesima i signalima


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:

  • Signal može biti ignoriran (Engl. Ignored) (SigIgn). Ovo može biti zbog razloga što konkretni proces nema metodu s kojom bi znao kako obraditi konkretni signal. Ako je signal ignoriran to znači kako se slanjem tog konkretnog signala procesu - neće ništa dogoditi. Određeni signali se NE MOGU ignorirati, a to su signali : SIGKILL i SIGSTOP kao i hardverski posebni signali (Engl. Hardware Exceptions).
  • Signal može biti “uhvaćen” (Engl. Caught) (SigCgt). Tada proces registrira određenu funkciju (ovisno o konkretnom signalu) s Linux kernelom. Kada se taj signal poziva, tada Linux kernel poziva tu konkretnu funkciju. Ako signal nije 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.
  • Signal može biti blokiran (Engl. Blocked) (SigBlk) i tada neće nikada doći do konkretnog procesa. Ne mogu se blokirati signali 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 :

  • SigBlk: - za blokirane signale
  • SigIgn: - za ignorirane signale
  • SigCgt: - za signale koji se odrađuju

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 :

  • (1) SIGHUP
  • (2) SIGINT
  • (6) SIGABRT
  • (10) SIGUSR1
  • (11) SIGSEGV
  • (14) SIGALRM
  • (15) SIGTERM
  • (17) SIGCHLD
  • (30) SIGPWR
  • te signali koji nisu definirani u trenutnom kernelu : (32) i (33).




Napredno: Task scheduler


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:

  • I/O procesi : klasifikacija se radi za procese koji komuniciraju sa I/O podsustavom (Disk, CD/DVD, tipkovnica, miš, …). Ovakvi procesi najviše vremena šalju ili primaju zahtjeve (obično čitanje ili pisanje). Pkreću se vrlo često ali u vrlo kratkim vremenskim intervalima. Dakle u pravilo se razlikuju od drugih vrsta procesa.
  • Procesorski zahtjevni procesi : Oni koriste svoje vremenske okvire za izvršavanje koda i cilj im je da rade što duže unutar svog vremenskog okvira, dok ne postanu “preemptive” od strane “Task schedulera”.

Postoji i dodatna kategorizacija :

  • Interaktivni procesi : su vrste procesa koji dosta vremena troše čekajući na I/O zahtjeve poput unosa s tipkovnice ili miša. Scheduler mora biti u stanju vrlo brzo odgovoriti na zahtjev prema ovim procesima. Prosječno dozvoljeno kašnjenje je do oko 100 ms, a da korisniku ne postane usporeno i/ili neresponzivno.
  • Batch procesi : Ovi procesi se “vrte” u pozadini te ne moraju biti responzivni kao interaktivni procesi. Oni su u načelu nižeg prioriteta. Primjeri su analizatori log datoteka, programi za konverziju multimedijalnih podataka i sl.
  • Real-time procesi : ovi procesi ne smiju biti prekinuti od strane procesa nižeg prioriteta i task scheduler mora garantirati najbrža vremena odziva za ove procese.

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:

  • Modular Scheduler Core : sastoji se od dodatnih “scheduling” klasa. Klase predstavljaju različite “scheduling” metode (Scheduling Policy)
  • Completely Fair Scheduler : je sama jezgra scheduler-a i brine se o tome da svaki proces uvijek dobije “fair” segment procesorskog vremena.
  • Group scheduling : Zadužen je za grupiranje procesa u grupe ša se scheduling može odrađivati uvažavajući parametre za svaku grupu. Grupe mogu biza prema korisničkim računima (UID) ili prema internim kernel grupama.

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 :

  • SCHED_FIFO - koristi se za vremenski kritične procese/aplikacije. Koristi se First In-First Out scheduling algoritam (za I/O procese)
  • SCHED_BATCH - koristi se za CPU intenzivne procese/aplikacije (za Batch procese)
  • SCHED_IDLE - koristi se za procese vrlo niskog prioriteta
  • SCHED_OTHER - koristi se za većinu Linux procesa (on je negdje između)
  • SCHED_RR - sličan kao SCHED_FIFO ali koristi Round Robin scheduling algoritam

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_RR

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


Context switching

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 :

  • pošto je već neki drugi proces ili nit na obradi, prvo se svi registri CPUa privremeno spremaju (snimaju) u RAM memoriju (1), te se potom brišu registri (2), da oslobode mjesto za novi proces/nit odnosno cjelinu za obradu
  • zatim se učitavaju novi podaci u registre - od našeg programa (3)
  • potom kreće obrada našeg programa, koji odrađuje prve matematičke operacije (4)
  • sve se odrađuje unutar jedinice vremena koju smo dobili od task/proces schedulera (za naš proces/nit)
  • rezultat prve matematičke operacije se zapisuje u RAM memoriju (5)
  • Nakon toga se “task/process scheduler” prebacuje na drugi proces/nit odnosno ponavlja se prvi korak (1) ali za drugi program, pa drugi (2) i ponovno sve u krug.



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:

  • čekati na pristup nekom hardverskom uređaju
  • čekati na zapisivanje na disk, jer je diskovni podsustav preopterećen ili
  • čekanje podataka s mreže, jer se još uvijek čitaju podaci iz mrežnih međuspremnika a očekuju se novi “živi” podaci s mreže i slično.

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:

  • (1) uslijed context switcha procesor mora kopirati međurezultate u RAM memoriju (cca. 60 ns)
  • (2) potom prazniti registre (nekoliko ns) te prazniti TLB memoriju (nekoliko ns). Uslijed promašaja TLB, dodatno : 10 - 100 taktova CPUa (od nekoliko ns do par desetaka ns)
  • (3) te prazniti i/ili popunjavati/osvježavati TLB cache ili priručne: L1,L2 ili L3 memorije:
    • L1 : 1.2 - 2.1 ns
    • L2 : 3 - 5.3 ns
    • L3 : 12 - 21.4 ns lokalno odnosno kod dijeljenje s drugom CPU jezgrom: 19.5 - 34.8ns
      • L3 : s udaljeni pristup (NUMA) : 30 - 160.7 ns
  • (4) zatim dohvatiti podatke od novog programa/procesa (1), popuniti registre (2) kao i popuniti cache (3)
  • (5) te konačno početi obrađivati (procesirati) podatke/program/proces

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.

  • CPU: Intel E5520 (2.27GHz): 4500 ns (4.5 μs)
  • CPU: Intel 5150 (2.67GHz): 4300 ns (4.3 μs)
  • CPU: Intel E5440 (2.83GHz): 3600 ns (3.6 μs)
  • CPU: Intel E5-2620 (2Ghz): 3000 ns (3 μs)

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:

  • CPU: Intel E5520: 1400 ns (1.4 μs)
  • CPU: Intel 5150: 1900 ns (1.9 μs)
  • CPU: Intel E5440: 1300 ns (1.3 μs)
  • CPU: Intel E5-2620: 1600 ns (1.6 μs)

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:

  • Proces1 koji se obrađuje 1 μs
  • Proces2 koji se obrađuje 9 μs
  • te sam context switch (CtxSwitch) za koji smo uzeli srednju vrijednost od 3μs


PlantUML Graph 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 sekunde
  • cswch/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 :

  • cswch/s - Broj Voluntary context switches u sekundi
  • nvcswch/s - Broj Non voluntary context switches u sekundi

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



Jobs

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:

  • interaktivnom programu
  • shell skripti
  • ili nizu naredbi koje smo povezali sa pipeom ( | )

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 stanju
  • Terminated - 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):

  1. prvi je cat
  2. drugi je grep

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

  1. kreira se nova procesna grupa
  2. sve naredbe ili programi koji se izvršavaju u pipe nizu, se ubacuju u tu istu procesnu grupu.

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.



Shell skripte

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 )


Kako rade Shell 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 :

  • Svaka shell skripta može pokrenuti jedan ili više pod shell-ova
    • Svaki pod shell je jedan novi proces
  • Pod shell-ovi ne naslijeđuju standardne varijable (osim ako nisu export-ane )
    • Samim time je i djelovanje standardnih varijabli ograničeno na konkretni shell
  • Promjena radnog direktorija kao i korisnika (User ID) pod shella ne utječe na radni direktorij i korisnika vršnog (Engl. Parent) shella
  • Svaki shell, i vršni i svaki pod shell, mogu pokretati više procesa u paraleli. Pogledajte poglavlje Jobs te pokretanje procesa u pozadini, pomoću metaznaka & na kraju reda.


Pogledajte i poglavlje "Upotreba okruglih zagrada" jer se s njima također mogu pokretati posebne vrste pod shell-ova.


Varijable

Komandnolinjska ljuska (shell) omogućava nam upotrebu varijabli poput varijabli u nekom programskom jeziku.

Razlikujemo nekoliko vrsta varijabli:

  • Environment varijable
  • “Obične” shell varijable

Standardne ili obične varijable

“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 (Environment) varijable


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 logiran
  • SSH_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 prozor
  • LINES slično kao prethodan varijabla samo što nam govori koliko redova ima naš trenutni terminal
  • UID 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”)


Varijable polja (Array)

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

Brisanje polja ili elemenata polja

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

Operacije na varijablama

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



Rad s uzorcima od vrijednosti varijable


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:

  • znak # predstavlja prvi uzorak na koji će se naići od početka
  • znak ## 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:

  • znak % predstavlja prvi uzorak na koji će se naići od kraja prema početku
  • znak %% predstavlja zadnji uzorak na koji će se naići od kraja prema početku

Izostavimo 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


Izvlačenja dijela vrijednosti varijable

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


Parametri pozicije

Č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)
  • …itd.

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.


Upotreba "okruglih" zagrada ( )


U Shellu razlikujemo dvije upotrebe okruglih zagrada:

  • jednostruke okrugle zagrade ( ) i
  • dvostruke okrugle zagrade (( )) .


Jednostruke okrugle zagrade
Jednostruke okrugle zagrade imaju najčešću primjenu:

  • kod pozivanja (pokretanja) naredbi u posebnom pod shellu.
  • kod varijabli polja (pogledajte poglavlje "Varijable polja" )

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 :


Pripazite:

  • Sve naredbe koje se izvršavaju u nizu (unutar okruglih zagrada), biti će izvršene u posebnom pod shellu
  • Sve varijable koje ćete koristiti u tom pod shellu, ostaju lokalne za taj shell te se ne naslijeđuju u vršni shell. Dakle kada se taj pod shell zatvori, gube se i njegove varijable.


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



Uvjeti

Bash shell nam omogućava korištenje uvjeta, neki od češće korištenih su :

  • if - else
  • case

Postoje 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 STRING2
  • STRING1!=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 BROJ2
  • BROJ1 -ne BROJ2 BROJ1 nije jednak (non equal) broju BROJ2
  • BROJ1 -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

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čan
  • until petlja se vrti u krug sve dok je uvjet netočan

Za 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ši
  • continue 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

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

  • naredba 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



While petlja

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


Until petlja

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" i "continue" unutar "for", "while" i "until" petlji

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

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



Funkcije

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 broj
  • broj2 ovo će biti naš drugi broj
  • operacija 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

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:

  • insert način rada : za upisivanje teksta
  • naredbeni način rada : za izvršavanje naredbi nad tekstom

Upoznajmo osnovne naredbe, podijeljene u logičke cjeline:

Insert i append naredbe

  • i (insert) – ubaci tekst ispred
  • a (append) – ubaci tekst iza
  • o – otvori novi red ispod
  • O – otvori novi red iznad
  • I – ubaci tekst na početak reda
  • A – ubaci tekst na kraj reda
  • ESC - vraća u naredbeni mode

Ako ne rade kursorske tipke:

  • h (lijevo)
  • l (desno)
  • j (dolje)
  • k (gore)
  • ESC - vraća u naredbeni mode

Brisanje:

  • 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 datoteke
  • 50G skoči na 50-ti red u datoteci
  • G skoči na kraj datoteke

Snimanje

  • :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)


Diskovi i particije

Vrste tvrdih diskova i standardi


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.

Podjela prema vrsti diskova

Osnovna podjela tvrdih diskova prema vrsti sučelja za povezivanje :

Ime sučeljaOpisBroj pinova (nožica) na tvrdom diskuBroj žila na kabeluMaksimalan broj diskova koji se može spojiti na jedan kabel/kanal
(P)ATAParalelni ATA (engl. AT Attachment )40 (44 za 2.5” diskove) 40, 44 ili 802
SATASerijski ATA (engl. Serial ATA)771
SCSIengl. Small Computer System Interface ili tkzv. Paralelni SCSI50, 68 ili 8050, 68 ili 8015
SASSerijski SCSI (engl. Serial SCSI)771


Pogledajmo i osnovne karakteristike raznih diskovnih sučelja i generacija/vrsta diskova koji se spajaju na njih:

ATA Standard

SučeljeStandardMaksimalna brzina prijenosa podataka i novi standardi
(P)ATAATA-1PIO-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)ATAATA-2PIO-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)ATAATA-3Nadogradnja na ATA-2 i vode se S.M.A.R.T. i “Security Feature Set”
(P)ATAATA/ATAPI-4Uvodi 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)ATAATA/ATAPI-5Uvode se: Ultra DMA 4: 66,6 MB/s , UDMA 3: 44,4 MB/s
Uvodi se 80 žilni (P)ATA kabel
(P)ATAATA/ATAPI-6Uvodi se Ultra-DMA-100 :100 MB/s
Uvodi se 48.bitna LBA shema adresiranja diskova (LBA-48)
Uvodi se “Automatic Acoustic Management” (AAM)
(P)ATAATA/ATAPI-7ATA se sada službeno zove PATA, jer se pojavljue SATA kao standard
Uvodi se UltraDMA 6 : 133 MB/s (ATA/133)
PATAATA/ATAPI-8Uvode se nove kozmetičke promjene

Ukratko :

StandardATA-1ATA-2ATA-3ATA-4ATA-5ATA-6ATA-7
Maksimalna brzina8.3MB/s16.6MB/s16.6MB/s33.3MB/s66.6MB/s100MB/s133MB/s


SATA Standard

Službeni naziv standardaNeslužbeni nazivBrzina prijenosa podataka
Serial ATA 1.5 GbpsSATA I1.2Gbps (150MB/s)
Serial ATA 3 Gbps, SATA Revision 2.xSATA II, SATA 3002.4Gbps (300MB/s)
Serial ATA 6 Gbps, SATA Revision 3.xSATA III, SATA 6004.8Gbps (600MB/s)
SATA Express 8 16 Gbps, SATA Revision 3.2 15.8Gbps (1975 MB/s)


SCSI Standard

StandardBrzina prijenosa podatakaVrsta kabela (broj žila/pinova)
SCSI (SCSI-1)5 MB/s50
Wide SCSI (SCSI-2)10 MB/s68
Fast SCSI (SCSI-2)10 MB/s50
Fast Wide SCSI (SCSI-2)20 MB/s68
Ultra SCSI (SCSI-3)20 MB/s68
Ultra Wide SCSI (SCSI-3)40 MB/s68
Ultra 2 SCSI 40 MB/s50
Ultra 2 Wide SCSI 80 MB/s68 ili 80
Ultra 3 - Ultra 160 SCSI 160 MB/s68 ili 80
Ultra 4 - Ultra 320 SCSI 320 MB/s68 ili 80
Ultra 5 - Ultra 640 SCSI 640 MB/s68 ili 80


Koje su razlike i sličnosti navedenih sučelja i standarda:

  • SCSI diskovi su se koristili (i još uvijek se koriste) uglavnom za poslužitelje, postoeje razne verzije brzina i sučelja. SUćelja su uglavnom sa 50 pinova (starije varijante) te sa 68 ili 80 pinova (novije varijante). Na svaki SCSI kabel (kanal) je moguće spojiti do 15 diskova (zbog toga i logika o paralelnom SCSI-ju).
  • SAS (serijski SCSI) - mijenja “stari” SCSI standard. SAS diskovi imaju isti konektor kao i SATA diskovi te se na jedan kabel spaja samo jedan disk (odatle naziv serijski). SAS osim standardnog konektora (SFF-8492) koji je isti kao i SATA, podržava još nekoliko vrsta konektora (SFF-8484,8485,8470,8087,8088).
  • ATA diskovi su se koristili za “obična” računala. Koristili su se kabeli sa 40, 44 ili 80 žila ali konektori na samom disku su ili sa 40 ili sa 44 pin-a (za 2.5” diskove). Na jedan ATA kabel, moguće je spojiti do dva diska, prema Master i Slave principu. Moguće je imati više ATA kanala za spajanje više ATA kabela na disk kontroler. Prioritet kod podizanja sustava ima primarni kanal, potom sekundarni itd. Ovaj tip povezivanja je prema tome isto paralelni.
  • SATA je nasljedio odnosno zamjenio ATA standard. Na jedan kabel se može spojiti samo jedan disk. Kao što je rečeno konektor je isti i za SATA i za SCSI ali to ne znači da ćete moći SAS disk spojiti na SATA kontroler i obratno, ako to nije podržano od strane disk kontrolera.

Način označavanja odnosno mapiranja diskova u linuxu:

Vrsta diska/konektoraNaziv 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:

  • 2.5“ ATA (44 pin) disk
  • 2.5” SATA (7 pin) disk
  • 3.5“ ATA (40 pin) disk
  • 3.5” SATA (7 pin) disk
  • 3.5“ SCSI (80 pin) disk
  • 3.5” SCSI (50 pin) disk


Podjela prema namjeni diskova


Diskove prema namjeni možemo u grubo podijeliti u dvije grupe:

  • Diskovi za profesionalnu upotrebu - za poslužitelje ili namjenu 24/7 (365 dana godišnje)
  • Diskovi za “kućnu” upotrebu

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:

  • 5400 o/min (Engl. rpm (Rounds Per Minute))
  • 7200 o/min
  • 10000 o/min
  • 15000 o/min

Š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 diskaWD Black (FZEX ili FAEX)WD RE (FYYZ ili FSYZ)WD SE (F9YZ)
MTBF (sati) Nedefinirano1 200 0001 000 000 - 1 200 000
Load unload Cycles 300 000600 000300 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 % Nedefinirano0.73Nedefinirano
TLER NEDADA
Zaštita od vibracija Stable Trac, VCTStable Trac, VCT, RAAFStable 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.


Stvarne statistike kvara diskova


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:

  • Statistike tvrtke “Google” koje spominjemo se odnose na razdoblje od 2005 do 2006 te se ovdje radi o starijim geeracijama različitih diskova, koji su proizvedeni od 2001, nadalje radi se o “Desktop” i “Server” varijantama diskova. Za dugoročnije statoistike su korištene starije google-ova statistike.
  • Statistike tvrtke “Backblaze” se odnose na razdoblje od 2013 do trećeg kvartala 2015.g te su u statistiku uključeni i nešto stariji ali i najnoviji diskovi. Ovdje se u statistikama koriste također i “Desktop” i “Server” varijante diskova (statistika je vidljiva prema točnom modelu diska)

Ako sumariziramo oba izvještaja, možemo zaključiti :

  • Povišena radna temperatura diska ne utjeće na njegovo kvarenje. Ne spominju se točne razlike ali se pretpostavlja kako se radi o relativno malim povečanjima temperature. S druge strane snižavanje radne temperature dosta ispod preporučene počinje povećavati broj pogrešaka.
  • Prosjek kvarova prema mjesecima ili godinama upotrebe nam govori kako se ukupno pokvarilo (Google statistika do 2007.g.):
    • oko 3% diskova već unutar prva tri mjeseca upotrebe,
    • oko 2% diskova unutar prve godine upotrebe,
    • oko 8% diskova unutar dvije godine upotrebe,
    • oko 9% diskova unutar tri godine upotrebe,
    • oko 6% diskova unutar četiri godine upotrebe,
    • oko 7% diskova unutar pet godine upotrebe,
  • Ukupno, prosjek kvarova diskova prema “Google” statistikama za pet godina je 6.4%.
    • Statistika kvara diskova od (uključujuči)2013 do 2015.g., tvrtke “Backblaze” govori o prosjećnom postotku kvarova diskova od 4.81% za sve tri godine statistike
    • Prosjek za više godina upotrebe je dakle negdje oko 5.6 %. U svakom slučaju to je drastično više od specifikacije koje daju proizvođaći kao “AFR rate” koji je u prosjeku između 0.5% i 0.8% godišnje. Ako pogledamo najpovoljiji postotak od 2% godišnje (to je AFR) to je odnos od 3 puta. Dakle tri puta je veća vjerojatnost da će se neki disk pokvariti u odnosu na ono što proizvođać piše (garantira).
  • Nakon što se pojavi prva greška na disku, tokom skeniranja diska, vjerojatnost da će se disk pokvariti unutar 60 dana je 39 puta veća nego na disku na kojemu se greške nisu pojavile. Dakle ako vam se pojavi i najmanja greška na disku : kupite novi i zamjenite stari pod hitno.
  • Diskovi na kojima je počelo dolaziti do realokacije neispravnih sektora na nove pozicije (statistika vidljiva preko S.M.A.R.T. kao “Reallocated Sector Count” ) imaju 14 puta veću vjerojatnost da će se pokvariti o odnosu na diskove koji nisu imali ovaj problem,
  • Diskovi na kojima je počelo dolaziti do tkzv. “Offline reallocation” (ako imaju takvu statistiku) imaju 21 puta veću vjerojatnost da će se pokvariti u odnosu na diskove koji nisu imali ove greške.
  • Sveukupno, za sve diskove koji su imali bilo kakvu S.M.A.R.T. scan grešku, za njih je vjerojatnost da će se pokvariti unutar 60 dana veća 10 puta od diskova koji nisu imali nikakve S.M.A.R.T scan greške.
  • Diskovi koji su iz kategorije “Serverski” su se ipak pokazali nešto pouzadniji od “običnih” diskova (ovisno o proizvođaču i točnom modelu).
  • A sada i nešto što traži dublju analizu:
    • 56% diskova koji su se pokvarili nisu imali nikakve “Strong” S.M.A.R.T greške (očite, osnovne greške koje se prate preko S.M.A.R.T.-a).
    • U slučajevima kada su s pratile sve statistike iz S.M.A.R.T-a odnosno kada su se redovito pokretali “Full” S.M.A.R.T testovi, 36% diskova koji nisu imali nikakve greške su se ipak pokvarili.


Izvori podataka :


Geometrija diskova

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:

  • Upravljačke elektronike
  • Servo motora
  • Ploča
  • Glava za čitanje i pisanje
  • Kučišta


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.

  • Starije metode su koristile CHS mapiranje (Cilinder Head Sector) odnosno adresiranje tj. identifikaciju svakog individualnog sektora na disku prema njegovoj poziciji unutar trake (staze). Pri tome je traka (staza) bila određena prema (logičkoj) glavi (engl. Head) i broju cilindra. CHS zbog svog načina mapiranja i ograničenosti koje donosi, može adresirati tvrde diskove do veličine od 504 MB.
  • Novije metode koriste tkzv. LBA (engl. Logical block addressing) metodu koja logički adresira sektore, odnosno mapira CHS adrese u LBA adrese. Ranije verzije su imale ograničenje do maksimalne veličine tvrdog diska od 2.1GB a novije do 8.4 GB. Standard se proširivao pa je sljedeća granica bila 137 GB i dalje sve do 2TB granice.

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 particijeVeličina klastera
64 MB1 KB
128 MB2 KB
256 MB4 KB
512 MB8 KB
1 GB 16 KB
2 GB 32 KB
4 GB 64 KB


FAT32

Maksimalna veličina particijeVeličina klastera
128 MB1 KB
256 MB2 KB
8 GB4 KB
16 GB 8 KB
32 GB 16 KB


NTFS

Maksimalna veličina particijeVeličina klastera
16 TB4 KB
32 TB8 KB
64 TB16 KB
128 TB 32 KB
256 TB 64 KB


ext3/ext4

Maksimalna veličina particijeVeličina klastera (Block size)
4 TB1 KB
8 TB2 KB
16 TB4 KB
32 TB8 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.

  • Ako trebamo zapisati datoteku veličine 4KB to znači da će se podaci zapisati točno u jedan klaster.
  • Ako trebamo zapisati datoteku veličine 7KB to znači da će se iskoristiti 2 klastera od 4KB (ukupno 8KB), i u ostatak od 7KB do 8KB će ostati neiskorišten jer se podaci mogu zapisivati samo do nivoa klastera, bez obzira koliko če biti popunjen ili ne.



Drugi parametri rada mehaničkih diskova


Pogledajmo neke od važnijih parametara rada mehaničkih diskova


Vrijeme pristupa (Access time)


Na vrijeme pristupa disku, odnosno brzinu prijenosa podataka od i prema diska, utječe nekoliko parametara, od kojih ćemo spomenuti samo:

  • Seek time odnosno vrijeme traženja i pozicioniranja glava za čitanje i pisanje
  • Rotational latency odnosno rotacijska latencija odnosno kašnjenje
  • Data transfer rate odnosno brzina prijenosa podataka
  • Effect of file system odnosno utjecaj datotečnog sustava
  • Input/output operations per second (IOPS) - broj ulazno izlaznih operacija prema i od diska

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.


Seek time


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


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



Data transfer rate


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:

  • sekvencijalno (u nizu) ili
  • nasumično (random)

Pogledajmo kako to izgleda:




Efekt datotečnog sustava


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.



IOPS


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:

  1. potrebno je pročitati 10 datoteka, svaka veličine 1GB
  2. potrebno je pročitati 10000 datoteka od 1MB

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 diskovi


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:

  • SLC - vrsta Flash memorije pohranjuje podatke u zasebnim memorijskim čelijama (memory cell), od kojih svaka može imati samo dva stanja 0 i 1. Dakle u svaku čeliju se može pohraniti samo jedan bit podataka. Ova vrsta memorije ima iznimno veliku brzinu zapisivanja i čitanja, malu potrošnju energije te najduži vijek trajanja, odnosno najveći broj pisanja i brisanja. Zbog toga što svaka čelija može pohraniti samo jedan bit podataka, ona je i najskuplja. Zbog visoke pouzdanosti i performansi, kao i cjene, koristi se samo za “enterprise” sustave.
  • MLC - ova vrsta memorije u jednu memorijsku čeliju može pohraniti dva bita podataka, pa je stoga i znatno jeftinija, i većeg kapaciteta. Njenu nešto veću nepouzdanost, danas riješava memorijski kontroler, pomoću ECC mehanizama. Drugi njen problem je nešto veća sporost i manji vijek trajanja odnosno znatno manji broj zapisivanja u odnosu na SLC vrstu memorije.
  • TLC - ova vrsta memorije u stanju je u jednoj čeliji pohraniti tri bita podataka, uz još manju brzinu, i još manji vijek trajanja, odnosno broj zapisivanja. Njena prednost je još veći kapacitet i znatno manja cijena.

Osim ovih karakteristika, postoji još jedna gruba podjela, a to su SSD drive uređaji za :

  • kućnu ili uredsku upotrebu
  • poslužitelje

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:

  • Intel DC S3610
  • Intel DC S3500

Pogledajmo i logičku shemu SSD diska:



SSD detaljnije

  • Micro controler je procesor unutar kontrolera, koji je zadužen za dohvaćanje (čitanje) i zapisivanja podataka, na samu NAND flash memoriju, a koji u radu koristi pripadajuću mu vrlo brzu međumemoriju (buffer) odnosno znatno veću DRAM memoriju unutar SSD diska.
  • Flash interface modules (FIMs) povezuje mikrokontroler unutar samog kontrolera s NAND flash memorijom. Dodatnim povećanjem broja FIM elemenata, pošto svaki od njih može istovremeno komunicirati sa pripadajućom mu NAND flash memorijom, povećava se i ukupna brzina komunikacije s NAND flash memorijom.
  • ECC (Error Correction Code) komponenta unutar kontrolera, zadužena je za sve operacije korekcije grešaka
  • Buffer je memorijski međuspremnik, za baratanje s podacima unutar kontrolera, prema i od DRAM memorije samog SSD uređaja

Dodatno, SSD kontroleri, koji su zaduženi za rad cijelog SSD drivea, nisu svi isti, niti brzinom niti funkcionalnostima.


Rad SSD diskova



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


overprovisioning

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


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:

  1. read
  2. erase
  3. modify
  4. write


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.



Karakteristike SSD diskova


Pogledajmo osnovne karakteristike SSD diskova

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



Fragmentacija


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.


Pristup i adresiranje prostora na SSD diskovima


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.




Logička shema 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:

  • Unutar MBR zapisa, nalaze se popisane particije kao i početni i završni sektor, svake particije. Ovaj prostor, koji služi za adresiranje svake particije je 32-bitni broj. Dakle maksimalna veličina particija prema MBR shemi je, prema tome 232 za 512bytea (veličina sektora) = 2 TB. Detaljnije radi se o adresiranju koje se zove LBA (Logical Block Addressing). Uglavnom, to znači da ne možemo imati particiju veću od 2TB. Netko se može zapitati: što ako imamo noviji tvrdi disk, kojemu veličina sektora nije 512 bytea nego 4096 (što je slučaj sa svim najnovijim (velikim) diskovima). Odgovor je MBR podržava samo 512 bytene sektore.
  • MBR podržava maksimalno 4 primarne particije. Veći broj particije je moguće imati ako na mjestu primarne particije napravimo Tzv. extended odnosno proširenu particiju, unutar koje je moguće kreirati više logičkih particija

GPT je noviji sustav, koji za sada nema ograničenja:

  • Maksimalni broj particija je toliki da praktično nećete imati ograničenja na njihov broj (do 128 primarnih particija).
  • Maksimalna veličina pojedine particije je sada 64 bitni broj. Dakle za 512 bytene sektore je to 264 bytea, za adresiranje tj. 9.4 ZB (Zetta Bytea). A za 4096 bytene sektore (tj. 4KB) je to 272 bytea za adresiranje tj. 19 YB (Yotta Bytea). To znači da limitirajući faktor postaje datotečni sustav.
  • Veličina sektora može biti i 512 bytea i 4096 bytea.
  • GPT zapis se snima na prvi i na zadnji sektor na disku (za svaki slučaj)
  • GPT zapis sadrži i CRC (Checksum) - zbog vlastite konzistencije


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čne

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

  1. Particioniranje (kreiranje minimalno jedne particije na disku)
  2. Formatiranje (instaliranje datotečnog sustava, na određenu particiju)

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:

  • NTFS - za Windows operativne sustave (prepoznaje ih i Linux)
  • ext2, ext3, ext4, XFS, ZFS - za Linux operativne sustave

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:

  • 1kB = 1 000 Bytea
  • 1MB = 1 000 000 Bytea = 1 000 kB
  • 1GB = 1 000 MB
  • 1TB = 1 000 GB

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:

  • 1kB = 1024 Bytea
  • 1MB = 1024 kB
  • 1GB = 1024 MB
  • 1TB = 1024 GB

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:

  1. Particioniranje
  2. Formatiranje


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


Napredno : MBR Detaljnije


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 :

  • Particija 1 :
    • Tip partcije je 0x83 što označava Linux vrstu particije
    • ona je aktivna (active) što znači kako se s nje može pokretati sustav
    • vidimo i na kojem sektoru počinje (startsector) i na kojemu završava (sectors)
  • Particija 2 :
    • Tip partcije je 0x82 što označava Linux swap vrstu particije
    • vidimo i na kojem sektoru počinje (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 )


Block Device

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 :

  • Tvrdi disk
  • SSD Disk
  • Određeni mrežni protokoli (pr. : iSCSI, DRBD, …)
  • CD/DVD

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”

Kako se mapiraju ( mount-aju) particije u direktorije i zašto?.

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 X
    • master:X - mount je (slave) peer grupi X
    • propagate_from:X - mount je (slave) te prima propagacije iz peer grupe X
    • unbindable - 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



Kako mount-ati CD/DVD-ROM ?.

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



Kako mountati CD/DVD-ROM iz ISO datoteke


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




Što je /etc/fstab

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.


root ( / ) particija

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


Swap particija


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.

Što je Swap ?

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:

  • Ako sustav ima do 1GB RAM, kreirati swap particiju 2 x RAM
  • Ako sustav ima preko 2 GB RAM , kreirati swap particiju iste veličine kao RAM.


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.

Malo više detalja o swap particiji


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.

  • prvi kvm troši oko 3.8 GB swap
  • drugi kvm troši oko 1.7 GB swap
  • treći kvm troši oko 1.2 GB swap
  • četvrti kvm troši oko 1.1 GB swap

Rješenje ovog problema je povećanje dostupne RAM memorije virtualnim računalima, kako ne bi bila primorana koristiti swap disk (memoriju).



Posebne particije (/proc, /sys i /tmpfs)


Osim root / particije, na kojoj se nalazi cijeli operacijski sustav, kod podizanja sustava, mountaju se i posebni pseudo datotečni sustavi za posebne namjene.


/proc


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 memorije
        • 2 - za pražnjenje slab cache memorije
        • 3 - 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/…



/sys


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


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.



Rad s particijama

Kreiranje particija

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) ili
  • cgdisk (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:

  1. Da li je particija primarna [PRIMARY] ili logička [LOGICAL] = odabiremo Primarnu
  2. Koju veličinu particije želimo (mi želimo sav rasploživ prostor pa nećemo ništa mijenjati) samo ENTER


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.

Formatiranje particije

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


RAID polja diskova

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 :

  • Softverski (na nivou operativnog sustava ili drivera) i
  • Hardverski (za što je potreban RAID kontroler).

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:

  • (A) SCSI disk kontoler (AIC-7892B)
  • (B) CPU i RAID ASIC a koji (RAID ASIC) je zadužen za kreiranje RAID polja i druge operacije potrebne za RAID
  • (C) RAM Memorija za cache podataka (u gornjem dijelu kartice) (32MB PC-100 ECC - proširivo)
  • (D) 68pin-ski SCSI konektor za spajanje SCSI tvrdih diskova


Hardverski RAID


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:

  • CPU i specijalizirani CPU za RAID
  • RAM memoriju
  • Disk kontroler za spajanje svih diskova
  • Flash (ROM) memoriju
  • Neku varijantu operacijskog sustava


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:

  • one koje dozvoljavaju grešku na bilo kojem bitu memorije u bilo kojem memorijskom “chipu” ili
  • one koje dozvoljavaju ispad (kvar) bilo kojeg memorijskog “chipa”.

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:



Pogled na nižu razinu diska


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.







Softverski RAID


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 :

  • Mogućnost dodavanja i vađenja diskova u radu (ako to podržava hardver),
  • Povećavanje veličine bilo kojeg logičkog diska (engl. resize),
  • Izrada sigurnosne kopije (engl. Backup) cijelog logičkog diska u radu, bez zaustavljanja, korištenjem tkzv. “Snapshot” metode,


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


Koja su najčešća RAID polja u upotrebi i koje su im prednosti i mane?


Danas u upotrebi imamo nekoliko RAID polja od kojih svako ima neke prednosti i neke mane.

Standardna RAID polja


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



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:

  • prvih 64kB će biti zapisano na prvi disk (A1)
  • drugih 64kB na drugi disk (A2)
  • trećih 64kB na prvi disk (A3)
  • četvrtih 64kB na drugi disk (A4)
  • petih 64kB na prvi disk (A5)
  • šestih 64kB na drugi disk (A6)


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


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:

  1. prvih 64kB se zapisuje na prvi i drugi disk (A1)
  2. u drugom koraku se drugih 64kB zapisuje na prvi i drugi disk (B1)
  3. u trećem koraku se trećih 64kB zapisuje na prvi i drugi disk (C1)

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.






RAID 5

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:

  • prvih 64kB na prvi disk (A1)
  • drugih 64kB na drugi disk (A2)
  • trećih 64kB na treći disk (A3)
  • Potom se radi logička XOR operacija prvih, drugih i trećih 64kB podataka i dobija se rezultat (engl. Parity), koji je veličine 64 kB i zapisuje se na četvrti disk (A P).

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 AUlaz BXOR rezultat
000
011
101
110


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 1Disk 2Disk 3Disk 4
1011111001100011


…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 1Disk 2Disk 3Disk 4
1011_ _ _ _01100011


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.


RAID 6


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

  1. prvih 64kB se zapisuje na prvi disk (A1)
  2. drugih 64kB se zapisuje na drugi disk (A2)
  3. trećih 64kB se zapisuje na treći disk (A3)
  4. prvi paritet od 64kB se zapisuje na četvrti disk (A P)
  5. drugi paritet od 64kB se zapisuje na peti disk (A Q)

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.




Ugnježđena RAID polja


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


RAID 0+1


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



RAID 10


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:

  • u prvom koraku se prva 64kB kopiraju i paralelno zapisuju na oba diska u prvom RAID 1 polju (A1 i A1)
  • u drugom koraku se druga 64kB kopiraju i paralelno zapisuju na oba diska u drugom RAID 1 polju (B1 i B1) jer je ovo drugo RAID 1 polje zapravo Stripe odnosno RAID 0 polje, prvom RAID 1 polju.
  • u trećem koraku se treća 64kB kopiraju i paralelno zapisuju na oba diska u prvom RAID 1 polju (C1 i C1)
  • u četvrtom koraku se četvrta 64kB kopiraju i paralelno zapisuju na oba diska u drugom RAID 1 polju (D1 i D1) jer je ovo drugo RAID 1 polje zapravo Stripe odnosno RAID 0 polje, prvom RAID 1 polju.
  • … i tako redom dok se ne zapišu svi podaci






Osim navedenih ugniježđenih RAID polja, moguća su i polja RAID 100, RAID 50 i RAID 60




LVM2


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 :

  • /dev/sdb
  • /dev/sdc


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

  • /dev/sdb1
  • /dev/sdc1

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 :

  • RAID0 - naziva se i “Stripe” (definira se prekidačem -ix [x=broj fizičkih diskova na koji se proteže “Stripe”])
  • Linearni RAID0 (podaci se popunjavaju linearno u nizu [kada se popuni prvi disk popunjava se drugi]) - ovo je standardni odabir ako nije ništa navedeno
  • RAID1 (raid1) ili “Mirror”


Moguće je i kreirati ekvivalente klasičnih RAID polja.

  • RAID5 (raid5)
  • RAID6 (raid6)
  • RAID10 (raid10)

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



Napredno: Diskovni (I/O) podsustav


I/O

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

  • Programi odnosno aplikacije koje se inače nalaze o posebnom user space prostoru kernela (ovo je normalan rad/izvršavanje programa), pristupaju VFS podsustavu (Virtual File system), kada žele nešto čitati ili zapisivati na disk. Ova komponenta, potom sve zapisuje na Page cache (RAM cache) sloj ili pokušava s njega dohvatiti podatke.

Standardni scenarij

  • Prvo se provjerava da li se traženi podaci nalaze u međuspremniku (Page cache).
  • Ako podaci nisu u međuspremniku zahtjev se prosljeđuje na blok sloj (Block Layer)


Što se događa na Page cache sloju ?

Page cache ubrzava pristup datotekama:

  • u slučajevima kada neka aplikacija prvo pročita podatke s diska, a koji se prvo spremaju u ovu cache memoriju te potom ponovno mora dohvatiti iste podatke (ili ista aili bilo koja druga aplikacija)
  • u slučajevima kada se podaci trebaju zapisati na disk, oni prvo završe u page cache memoriji i drže se u njoj neko vrijeme, te se šalju dalje prema nižim slojevima i disku, na zapisivanje. Ovi podaci, koji se nalaze u procesu zapisivanja na disk, a nalaze se u page cache memoriji se označavaju kao dirty pages, ako još nisu stvarno zapisani na površinu diska. U međuvremenu, ako je neka aplikacija trebala pročitati ove podatke, ona ih može pročitati iz ove međumemorije, bez čekanja na prvo zapisivanje a potom i čitanje istih podataka s diska. Sadržaj ovih dirty pages se periodički zapisuje prema površini diska, a prema potrebi moguće je narediti operacijskom sustavu da ih snimi na površinu diska, prioritetno, odnosno da se stanje RAM memorije koja se koristi kao write page cache, snimi na površinu diska. Ovo se može postići i ručno s naredbom 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

  • Direct IO - je druga metoda - koju koriste visoko optimizirane baze podataka i drugi specifični programi koji ne žele koristiti međuspremnike kojima barata operacijski sustav već imaju svoju specifičnu implementaciju međuspremnika i mehanizama za dohvaćanje i snimanje podataka prema diskovnom sustavu. Korištenjem Direct IO, moguće je direktno doći do datotečnog sustava (File system), izbjegavajući page cache memoriju.
  • Sync IO (sinkrono zapisivanje) je samo dodatna metoda pristupa diskovima (kao opcija), pri kojoj se može naložiti nižim slojevima, da se kod operacija zapisivanja na disk, čeka na potvrdu da su podaci stvarno prošli sve slojeve diskovnog podsustava te su stvarno i zapisani na površinu diska. Tek potom aplikacija, koja je zatražila sinkrono zapisivanja, može poslati slijedeći blok podataka na zapisivanje.

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 :

  • direktan pristup na Virtual Block Layer. Ovdje Zahtjevi idu na opcionalni logički block device sloj koji se u pravilu koristi za softverske RAID uređaje (takozvane volume managere), poput LVM2 sustava, DRBD ili drugih. Volume manageri odrađuju sve operacije nad logičkim diskovima, poput kreiranja virtualnih RAID polja i slično. Direktan pristup ovom sloju se događa primjerice kod kreiranja ovakvih polja diskova ili operacija nad njima ili u još posebnijim slučajevima baza podataka, koje žele direktno koristiti disk ili particiju koja se nalazi unutar ovakvih logičkih diskova (softverskih RAID polja), kako bi ju formatirali sa svojim posebno optimiziranim datotečnim sustavom.
  • direktan pristup na Generic Block Layer događa se kada zahtjevi idu direktno na blok sloj. To se događa kod direktnog pristupa particijama ili samim diskovima, u trenutku kreiranja samih particija i slično. Ovaj sloj sve zahtjeve prosljeđuje dalje na IO Scheduler. U ovom sloju se rade i sve statistike. I ovdje je u stvarno posebnim namjenama, isto moguće da određeni program, ponovno najčešće visoko optimizirane baze podataka, koriste ovakav pristup kako bi na particijama diska, na ovom sloju kreirale svoj datotečni sustav, optimiziran za ovakav rad.

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:

  • Linux LVM2 volume managera
  • DRBD (Distributed Replicated Block Device) i drugih sličnih sustava

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:

  • Prva volume grupa: VolGroup-lv_swap je aktivna (State: ACTIVE) i ima Major i Minor brojeve: 253,1
  • Druga volume grupa: VolGroup-lv_root je aktivna (State: ACTIVE) i ima Major i Minor brojeve: 253,0


Za više detalja o Linux LVM2 pogledajte poglavlje: LVM2.



Dolazimo do nižih slojeva

  • IO Scheduler: Ovisno o odabranom IO scheduleru podaci se grupiraju na određeni način, stavljaju u određene nizove i sl. sve ovisno o tome što se želi postići: varijable su propusnost ili brzina odziva.
    • 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.
      • Određena mjerenja pokazuju kako 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.


  • Block Device Driver: Na kraju se sve prosljeđuje upravljačkom programu (Block device driver/kernel modulu) koji u konačnici šalje sve na disk kontroler i na kraju na sami disk.

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

  • na prvom sloju se nalazi SCSI srednji sloj, koji je vidljiv kao neki od disk uređaja (/dev/sda primjerice)
  • na drugom sloju se nalazi generički sloj 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.



Sinkroni i asinkroni I/O


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

Optimizacija "Filesystem" sloja


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/datotekaOpis
aio-max-nrOvo 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-nrInformacija o tome koliko je trenutno aktivnih asinkronih I/O operacija
dentry-stateDaje 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_dquotsPrikazuje broj alociranih disk kvota (quota) odnosno ograničenja (može ih biti više zbog toga se broji njihov broj).
/quota/free_dquotsBroj slobodnih disk kvota
file-maxOznač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-nrPrikazuje 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

Optimizacija "Generic Block Layer" i "Scheduler"-a


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/opcijaZnač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_kbMaksimalna veličina pojedinog (svakog) I/O zahtjeva (block size) u kilobajtima
nr_requestsKoliko 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_sizeAko nije postavljeno na 0 sam “storage” uređaj može postaviti svoju preporučenu vrijednost.
read_ahead_kbDefinirano 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.
rotationalAko 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/opcijaZnačenje/opis
fifo_expire_asyncBroj milisekundi koje asinkroni I/O zahtjev može/smije ostati neposlužen (neobrađen)
fifo_expire_syncBroj 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
quantumBroj 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_idleVremenski 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/opcijaZnačenje/opis
fifo_batchBroj 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_expireVremenski okvir u milisekundama unutar kojeg se svaka operacija čitanja mora odraditi (standardno je 500 ms.)
write_expireVremenski okvir u milisekundama unutar kojeg se svaka operacije zapisivanja mora odraditi (standardno je 5000 ms.)
writes_starvedBroj 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


Disk I/O Primjeri


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 :

  • 1 read I/Os requests Ukupan broj uspješnih I/O operacija čitanja
  • 2 read 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)
  • 3 read sectors sectors Ukupan broj sektora koji su uspješno pročitani.
  • 4 read ticks milliseconds Vrijeme potrebno kako bi se pročitao pojedini sektor. Ovo vrijeme je kumulativno (povećava se za svaki pročitani sektor)
  • 5 write I/Os requests Ukupan broj uspješnih I/O operacija pisanja.
  • 6 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)
  • 7 write sectors Ukupan broj sektora koji su uspješno zapisani.
  • 8 write ticks Vrijeme (u ms) potrebno kako bi se zapisao pojedini sektor. Ovo vrijeme je kumulativno (povećava se za svaki zapisani sektor)
  • 9 in_flight Trenutni broj I/O operacija u sekundi (tkzv. IOPS )
  • 10 io_ticks Vrijeme (u ms) potrebno za I/O operacije (vrijeme je isto kumulativno).
  • 11 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 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 !.



Praćenje performansi I/O sustava


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 intervalima
    • sa2 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 statistike
  • mpstat kreira CPU statistike
  • pidstat kreira statistike za pokrenute procese ili pojedini proces (prema proces ID-u (PID)).
  • nfsiostat kreira I/O statistike za NFS mrežni datotečni sustav
  • cifsiostat 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.


Primjeri


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 :

  • tps – Broj transakcija u sekundi - ovo se naziva i IOPS (uključuje i “read” i “write” operacije)
  • rtps – Broj “Read” transakcija u sekundi
  • wtps – Broj “Write” transakcija u sekundi
  • bread/s – Byte-a pročitanih u sekundi
  • bwrtn/s – Byte-a zapisanih u sekundi

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

  • pgpgin/s - Ukupan broj kB koje je sustav “povukao” (iz engl. page cache) s diska u svakoj sekundi. Pod “page” se smatra povlačenje podataka s diskovnog I/O sustava, iz priručne memorije i u konačnici s diska.
  • pgpgout/s - Ukupan broj kB koje je sustav “poslao” (iz engl. page cache) na disk (na zapisivanje) u svakoj sekundi. Pod “page” se smatra slanje podataka na diskovni I/O sustav, prema priručnoj memoriji i u konačnici na disk.
  • fault/s - (Minor Fault) - broj standardnih “page fault” grešaka u dohvačanju podataka prema sustavu virtualne memorije u sekundi. Također je mogući uzrok ovih grešaka dostupnost “page”-a u virtualnoj memoriji ali u tom trenutku nije alociran u adresni prostor procesa/programa/aplikacije. Ovo ne označava upit prema diskovnom I/O sustavu jer se večina ovih grešaka odnosi na pristup sustavu virtualne memorije za koje ionako nije potreban disk I/O.
  • majflt/s - (Major Fault) - broj grešaka kod čitanja (read) koje se događaju kada se pristupa virtualnom memorijskom adresnom prostoru koji nije učitan u “page” memoriju te se mora ići prema diskovnom I/O sustavu . Ako se ovdje krenu pojavljivati greške to ukazuje da procesi koji pristupaju diskovnom I/O sustavu pre često moraju ići prema diskovnom I/O sustavu. Ovo može ukazivati i na problem sa nedostatkom slobodne RAM memorije.
    • Teži se da ove vrijednosti budu što manje (ili nula).

Dodatne opcije koje su važne za dublje razumjevanje i analizu I/O sustava

  • pgscank/s - Broj stranica (pages) skeniranih od strane 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).
  • pgscand/s - Broj stranica (pages) skeniranih od strane samog sustava (ovdje se traže oslobođene memorijske lokacije) te se indirektno i oslobađa RAM memorija koja je oslobođena pr. od strane samog procesa/programa/aplikacije jer više nije u upotrebi.
  • pgsteal/s - Broj stranica (pages) koje je sustav uzeo iy priručne memorije (“pagecache” i/ili “swapcache”) u sekundi. Dakle sustav koristi što veću količinu memorije za “page cache” da bi ubrzao operacije prema diskovnom I/O sustavu, kada cijeli sustav padne ispod neke granice, s dostupnom (slobodnom) RAM memorijom on pokreće ovaj proces u kojemu uzima ili bolje reći “otima” RAM memoriju za svoj rad ili za nove procese.
  • %vmeff - računa se kao pgsteal/pgscand, ovaj parametar je i metrika koja govori o efikasnosti pgsteal mehanizma. Možemo ga promatrati ovako:
    • Ako je 100% to znači da je svaka stranica (page) koja je slobodna (ili u stanju inactive) uspješno i oslobođena,
    • Ako je ispod 30% %) tada postoje neki problemi ili procesi koji usporavaju ovu proceduru,
    • Ako je vrijednost 0% to znači da u trenutku vremena kada se prikupljala statistike nije bilo uopće procesa skeniranja ili oduzimanja (steal).

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 :

  • Disk za operacijski sustav (/dev/sda)
  • Disk za podatke (/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 :

  • avgrq-sz Označava prosječnu veličinu u sektorima podjeljen sa brojem I/O operacija u sekundi koje se traže (obrađuju) prema disku
  • avgqu-sz Označava prosječan broj I/O operacija koje su još uvijek na obradi (average queue length).

Ono što je sada zanimljivo su opcije pred kraj:

  • await Označava ukupno vrijeme za sve I/O operacije (sumarizirano) te podjeljeno s ukupnim brojem I/O operacija koje su uspješno odrađene. Dakle ovo je vrijeme koje govori koliko je I/O operacija obrađivana unutar IO Scheduler-a (od ulaska u IO scheduler do njene obrade).
    • Dobra vremena trebaju biti što manja - ispod ili oko jedne milisekunde za disk , i za do nekoliko milisekundi za vanjske ili sporije diskove.
  • svctm Prosječno vrijeme obrade (u milisekundama) za I/O zahtjeve prema diskovima. Dakle ovo vrijeme govori koliko je vremena bilo potrebno za svaku I/O operaciju prema disku. Odnosno koliko je disku trebalo vremena da ih odradi.
    • Očekivana vremena se kreću ispod ili oko jedne milisekunde. NAPOMENA: Ova opcija se više neće koristiti u budućnosti !!
  • util postotak CPU vremena za obradu tokom kojeg su I/O zahtjevi poslani prema uređajima (diskovima). Veliki postotak znači da CPU čeka na diskovni sustav koji je zbog nekog razloga usporen, pa CPU troši više vremena na čekanje prema disku nego na stvarnu obradu podataka.

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 :

  • MB_read Ukupno MB/s pročitano s diska
  • MB_wrtn Ukupno MB/s snimljeno na disk

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 :

  • kB_rd/s - kB/s za operacije čitanja
  • kB_wr/s - kB/s za operacije zapisivanja
  • kB_ccwr/s - kB/s za operacije zapisivanja za koje je proces/program/aplikacija odustala od zapisivanja. Ovo je isti parametar kao “cancelled_write_bytes” opisana dalje u tekstu. Uglavnom želimo da je ova vrijednost nula (0)

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:

  • rchar Broj byte-a čiji zahtjev je proslijeđen diskovnom I/O sustavu za operacije čitanja.Ova vrijednost se povečava (zbraja). Ovo se odnosi na čitanje iz VFS sloja (Virtual File System) te se tok dohvačanja podataka ne prati dublje od tog sloja.
  • wchar Broj byte-a čiji zahtjev je proslijeđen diskovnom I/O sustavu za operacije zapisivanja.Ova vrijednost se isto povečava (zbraja). Ovo se odnosi na čitanje iz VFS sloja (Virtual File System) te se tok dohvačanja podataka ne prati dublje od tog sloja..
  • syscr Brojač operacija čitanja prema diskovnom I/O sustavu (IOPS za operacije čitanja)
  • syscw Brojač operacija zapisivanja prema diskovnom I/O sustavu (IOPS za operacije zapisivanja)
  • read_bytes Broj pročitanih byte-a sa diskovnog podsustava iz sloja “Block Layer”
  • write_bytes Broj zapisanih byte-a sa diskovnog podsustava iz sloja “Block Layer”
  • cancelled_write_bytes Količina podataka (u byte-ima) koja je prvo zapisana pa onda obrisana te se stvarna transakcija nije stvrano dogodila na tvrdi disk već je bila odrađena u višim slojevima diskovnog podsustava. Pr. Ako se u nekom trenutku zapisuje 1MB podataka, on prvo završi u “page cache” priručnoj memoriji u višim slojevima diskovnog sustava a ako se nakon nekog vremena tih istih 1MB podataka briše a oni su još u priručnoj memoriji i nisu se niti počeli proslijeđivati nižim slojevima niti u konačnici na disk, onda se ti podaci vrišu samo iz priručne memorije i zapisuju se u ovu statistiku.

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).
    • Da bi se ubrzale operacije pristupa često korištenim direktorijima “VFS” ima priručnu memoriju za direktorije u kojoj drži unose s direktorijima. To radi tako da kada datotečni sustav prvi puta pristupa nekom direktoriju ili datotekama unutar njega, datotečni sustav šalje VFS-u sve podatke o tom direktoiju, koje on stavlja u ovu priručnu memoriju. Sljedeći puta kada netko pristupa tom istom direktoriju ili datotekama unutar njega, svi potrebni podaci se čitaju iz ove brze priručne (RAM) memorije.
  • 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.



Ekspertno : Još detaljnije praćenje I/O sustava


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 :

  • blktrace - za praćenje I/O sustava i pripremu izvještaja
  • blkparse - za analizu snimljenih izvještaja od gore navedenog programa
  • btt - za parsanje i prikaz analize iz gornjeg programa

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:

  • 1 stupac je Device major,minor (u našem slučaju 202,96) - ovo označava disk na najnižoj razini, na kojemu se radi određena I/O operacija(u /dev/ direktoriju):
ls -alh /dev/ | grep "202,  96"

brw-rw----   1 root disk     202,  96 Nov 19 05:01 sdb
  • 2 stupac pokazuje broj CPU-a koji odrađuje IO zadatak,
  • 3 stupac pokazuje sequence number,
  • 4 stupac je vrijeme,
  • 5 stupac je PID procesa koji je zatražio I/O
  • 6 stupac označava tip događaja :
    • 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”
    • … za ostalo - pogledajte “ACTION IDENTIFIERS” dio za blkparse man stranicu.
  • 7 stupac je:
    • R (Read),
    • W (Write),
    • D (block),
    • B (Barrier operation).
  • 8 stupac je I/O scheduler (pr. cfq) + “block number” uz koji slijedi + blok koji se traži
  • 9 stupac - vrijednost između zagrada “[ ]” je ime procesa koji radi/traži I/O.

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ši
  • M2D — 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:

PlantUML Graph


File System detaljnije

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:

  • Dijela s podacima “Data”: - ovaj dio je asociran s I-node unosom u I-node tablici.
  • Dijela s imenom datoteke “Filename (1)”


Dakle ovako izgleda datoteka na Linux File Sistemu (pr. ext/3/4 ) ili na Unix file sustavu (pr. UFS):

files_1.jpg

Hard Linkovi


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:


hard_links.jpg

Prednosti i mane Hard Linkova:

Mogu se kreirati samo unutar jedne particije jer i-node tablica postoji za svaki file
system/particiju zasebno

  • Brisanjem izvorne datoteke podaci ostaju sve dok postoji barem jedan hard link
  • Mogu se linkati samo datoteke, ne i direktoriji uz iznimku:
    • Kada se kreira svaki novi direktorij ( mkdir ) kreira se hard link:
      • Jedan za roditeljski (parent) ( .. ) = ima isti inode broj kao parent
      • Jedan za trenutni direktorij ( . ) = ima novi inode broj
    • Teže ih je primjetiti i pratiti jer se mora gledati broj linkova i i-node broj

Primjeri:

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

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:

softlinks.jpg

Prednosti i mane Soft Linkova

  • Fleksibilniji su jer pokazuju na putanju (path) do datoteke ili direktorija
  • Mogu se koristiti i između file sustava (diskova ili particija)

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

Timestamps (oznake vremena)

Za svaki direktorij i datoteku zapisuju se i oznake vremena:

  • modify : kada je kreiran ili mijenjan
  • access : kada mu je pristupano
  • change : 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:

  • promijeniti ćemo: access (-a) i modify (-m) vrijeme u :

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 Descriptors


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.


Napredno: File Descriptors


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 :

  • Log datoteka
  • biblioteka (library)
  • /dev/ datoteka (hardver ili posebne datoteke)
  • Unix/Network Socket datoteka
  • Drugih programa i njihovih datoteka

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"


Ulimit


Naredba ulimit daje nam mogućnost definiranja sistemskih ograničenja od :

  • Ograničenja broja procesa koji određeni korisnik može pokrenuti,
  • preko ograničenja broja otvorenih datoteka i drugih ograničenja


Ograničenja File Descriptora

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)



Ograničenja procesa


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:

  • 1184 alociranih file handelova (oni predstavljaju file deskriptore) u Kernel memoriji
  • 0 nekorištenih ali alociranih (težimo da je 0)
  • 9897041 maksimalni broj file handlera (file deskriptora) za cijeli sustav (koliko kernel uopće može alocirati).

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

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


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 prikazu
  • F otvorena datoteka za zapisivanje (write), slovo f se obično ne prikazuje u standardnom prikazu
  • r root direktorij
  • m 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 :

  • HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS


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.


Provjera diskova, particija i direktorija

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.

lsblk

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

df

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

du

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/


RAM memorija


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


Što se događa kod pokretanja računala (boot process)

Nakon uključivanja (pokretanja) računala:

  • Inicijalizira se BIOS (Basic Input Output System) “ugrađen” u matičnu ploču računala.
  • BIOS pronalazi tvrdi disk s kojeg pokreće učitavanje boot loader-a,
  • “Boot loader” učitava linux kernel
  • Linux kernel učitava i druge pomočne programe i biblioteke te “mount”-a datotečni sustav,
  • Linux kernel potom pokreće osnovne servise,
  • Učitavaju se i drugi servisi i na kraju se učitavaju razni programi

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.


Koje vrste RAM memorija postoje i u čemu su razlike


SDRAM vrsta memorije


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)
PC6666
PC100100
PC133133

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 najčešće koriste


RAM memorije koje se danas koriste su : DDR4 ili DDR3 memorije.

Pogledajmo izmjerene stvarne brzine prijenosa podataka RAM memorija :

Vrsta RAM Memorije i radni taktBrzina GB/s
DDR4 - 3200 MHz51
DDR4 - 2400 MHz38
DDR4 - 2133 MHz34
DDR3 - 1866 MHz30
DDR3 - 1600 MHz25
DDR3 - 1333 MHz21
DDR3 - 1066 MHz17
DDR2 - 667 MHz10
DDR2 - 533 MHz8


Dual in-line Memory Module (DIMM)


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 pinovaNamjena
72SO-DIMM (manji format) - za FPM DRAM i EDO DRAM
100za printere
144SO-DIM SDR SDRAM (manji format - za laptope i sl.)
168SDR SDRAM
172Micro DIMM - DDR SDRAM
184DDR SDRAM
200SO-DIMM (manji format - za laptope i sl.) - DDR SDRAM i DDR2 SDRAM
204SO-DIMM (manji format - za laptope i sl.) - DDR3 SDRAM
214SO-DIMM (manji format - za laptope i sl.) - DDR2 SDRAM
240Micro DIMM - DDR2 SDRAM, DDR3 SDRAM, i FB-DIMM DRAM
244Mini DIMM - DDR2 SDRAM
260Mini DIMM - DDR4 SDRAM
260SO-DIMM (manji format - za laptope i sl.) - DDR4 SDRAM
260SO-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
288DDR4 SDRAM


Podvrste Memorija


Postoji i nekoliko podvrsta memorija, koje se koriste uglavnom za poslužitelje ili posebne namjene. Pogledajmo koje su to podvrste memorija.


ECC Memorije


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” {edac_core kernel module] komponente i
  • EDAC drivera, koji je specifičan za vaš memorijski kontroler/CPU tj. EDAC (chip) [ sb_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 te
  • sb_edac koji je kernel modul za naš CPU/memorijski kontroler

Provjerimo 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*/:

  • ce_count : The total count of correctable errors that have occurred on this csrow (attribute file).
  • ch0_ce_count : The total count of correctable errors on this DIMM in channel 0 (attribute file).
  • ch0_dimm_label : The control file that labels this DIMM. This can be very useful for panic events to isolate the cause of the uncorrectable error. Note that DIMM labels must be assigned after booting, with information that correctly identifies the physical slot with its silk screen label on the board itself.
  • dev_type : An attribute file that will display the type of DRAM device being used on this DIMM. Typically this is x1 , x2 , x4 , or x8 .
  • edac_mode : An attribute file that displays the type of error detection and correction being utilized.
  • mem_type : An attribute file that displays the type of memory currently on a csrow.
  • size_mb : An attribute file that contains the size (MB) of memory a csrow contains.
  • ue_count : An attribute file that contains the total number of uncorrectable errors that have occurred on a csrow.


"Registered" memorija (RDIMM)


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

600


Buffered Memory i Fully Buffered Memory


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)


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


32. bitno ili 64. bitno adresiranje memorije

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 u Linuxu


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



Virtualna memorija


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:


Paging


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.


Paging i dijeljenje memorije (Shared Memory)

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:

  1. SHMMAX je maksimalna veličina jednog (bilo kojeg) segmenta dijeljene memorije
  2. SHMALL je zbroj svih segmenata dijeljene memorije za cijeli operacijski sustav.

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.


Uloga "Page Table"-a


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


Proces translacije adresa

“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 ?

  1. L1 (DTLB1): 64 unosa za “Page” veličine 4KB (standardna veličina) i 32 unosa za Page veličine 2 ili 4 MB (o ovim veličinama u naprednom dijelu)
  2. L1 (ITLB1): 128 unosa za “Page” veličine 4KB (standardna veličina) i 14 unosa za Page veličine 2 ili 4 MB (o ovim veličinama u naprednom dijelu)
  3. L2 (DTLB) : 512 unosa za “Page” veličine 4KB (standardna veličina)

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 :

  1. Hardverski - korištenjem registara procesora (CPU) CR3 registar na x86 arhitekturi] - CPU odrađuje pretraživanje, ostalo Operacijski sustav
  2. Softverski - Operacijski sustav odrađuje sve (od popunjavanja TLB-a, pretraživanja (page walk) i sl).

Prosječne performanse TLB-a :

  • Vrijeme dohvata unosa : 0.5 - 1 takt procesora (engl. clock cycle)
  • Promašaj : 10 - 100 taktova procesora (engl. clock cycles)
  • Prosječni postotak promašaja 0.01 -1 %

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 (Kernel same-page merging)


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:

  • počevši od kernela operacijskog sustava,
  • Upravljačkih programa,
  • sistemskih servisa (daemoni u Linux terminologiji), itd …

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 :

  • koliko dobivamo više slobodne RAM memorije zbog ovog procesa,
  • a koliko koristimo (zagušujemo ) CPU-a.

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.

Izvor informacija


Moja osobna iskustva su iz područja upotrebe KSM mehanizama za virtualizaciju, gdje su pokazala solidne rezultate, bez vidljivih usporavanja sustava.

Test:

  • Proxmox VE v.3.4.x
  • 2 x Xeon E5-2650 (NUMA) : 32 Core
  • 128GB RAM
  • oko 20 Virtualnih računala Linux (CentOS ili RedHat 6.x) :svakome je dodjeljeno između 4 i 16 GB RAM
  • Virtualizacija Linux KVM + QEMU

Slika prikazuje statistiku zauzeća RAM memorije i upotrebu KSM memorije:

Iz slike je vidljivo da je:

  • stvarno zauzeće RAM memorije oko 39.7 GB
  • KSM odrađuje oko 70.7 GB RAM

To znači da bi zauzeće RAM-a bez KSM-a bilo 70.7GB a s njim je samo 39.7GB.



Upoznajmo se s osnovnim naredbama vezanim za provjeru stanja memorije


Naredba ''free''


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 :

  • (Shared): 25 MB - za djeljenje
  • (Buffers): 160 MB
  • (Cached): 1050 - Disk cache, ova memorija se automatski oslobađa za pokretanje novih procesa (aplikacija), prema potrebi
  • (-/+ buffers/cache) prikazuje koliko memorije je stvarno dostupno iz perspektive preocesa (aplikacija)
  • (Swap) prikazuje da li i koliko se koristi Swap na tvrdi disk - cilj je da upotreba (Used) bude na 0 jer ako je on u upotrebi to je znak da nam je ponestalo RAM memorije te kako se umijesto nje počeo koristiti tvrdi disk, odnosno swap particija, kao proširenje RAM memorije (koje je užasno sporo u odnosu na RAM memoriju).

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.


Sadržaj ''/proc/meminfo'' datoteke


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:

  • MemTotal — Ukupna dostupna RAM memorija, (u kilobajtima (kB)).
  • MemFree — Ukupna dostupna RAM memorija, (u kB), neiskorištena od strane sustava (slobodna)
  • Buffers — Ukupna dostupna RAM memorija, (u kB), iskorištena za “buffer”-e.
  • Cached — Ukupna dostupna RAM memorija, (u kB) , iskorištena kao “cache memory”.
  • SwapCached — Količina “Swap” memorije, (u kB), koja se koristi kao “cache memory”.
  • Active — ukupna količina “buffer” ili “page cache memory” (u kB), koja je u aktivnoj upotrebi.
  • Inactive — ukupna količina “buffer” ili “page cache memory” (u kB), koja je slobodna i dostupna
  • SwapTotal — Ukupna količina “Swap” memorije (u kB).
  • SwapFree — Ukupna količina “Swap” memorije (u kB) koja je još slobodna.
  • Dirty — Ukupna količina memorije (u kB), koja čeka kako bi se snimila na disk
  • Writeback — Ukupna količina memorije (u kB),koja je aktivno snimljena na disk.
  • Mapped — Ukupna količina memorije (u kB), koja se koristi za mapiranje uređaja, datoteka, ili biblioteka korištenjem mmap sistemske naredbe.
  • Slab — Ukupna količina memorije (u kB), u upotrebi od strane kernela za “cache” podatkovnih struktura (za internu upotrebu).
  • PageTables — Ukupna količina memorije (u kB),rezervirana za “Page” tablicu.
  • VMallocTotal — Ukupna količina memorije (u kB),odnosno cjelokupni adresni prostor za virtualnu memoriju.
  • VMallocUsed — Ukupna količina memorije (u kB),iskorištenog adresnog prostora za virtualnu memoriju.
  • VMallocChunk — Največa količina kontinuiranog bloka memorija (u kB) od dostupnog virtualnog adresnog prostora.
  • HugePages_Total — Ukupni broj tkzv. “Huge pages” stranica, dostupnih za računalo.
  • HugePages_Free — Ukupni broj tkzv. “Huge pages” stranica, slobodnih za upotrebu.
  • Hugepagesize — Veličina za svaki blok “Huge page”-a. Standardna veličina je 2MB.


Naredba ''ps''


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 :

  • min_flt - ispiši broj “minor” “page fault”-a (objašnjeni su ranije)
  • maj_flt - ispiši broj “major” “page fault”-a (objašnjeni su ranije)
  • cmd - ispiši naredbu odnosno ime procesa

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


Naredba vmstat daje nam informacije o:

  • Memoriji,
  • Disku i aktivnosti diska,
  • Aktivnosti procesora (CPU),
  • Blok uređajima.

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:

  • pages paged in - količina memorije u “stranicama” (engl. in pages) pročitanih s diska u “page cache buffer” . (Standardna veličina stranice je 4KB). Ovo je praktično količina podataka koji se u konačnici čitaju s diska (preko “page cache” memorije). Znatniji promet ovdje znači kako se traženi podaci ne nalaze u “page cache” memoriji te se moraju čitati s diska. Ovdje se isto teži da ima što manje prometa. Ovo nisu vrijednosti vezane za Disk I/O već za virtualnu memoriju !!.
  • pages paged out - količina memorije u “stranicama” (engl. in pages) koje se trebaju zapisivati na disk tj. u “page cache buffer” . (Standardna veličina stranice , a page is 4KB). Ovo je praktično količina podataka koji se u konačnici zapisuju na disk (preko “page cache” memorije). Ovo nisu vrijednosti vezane za Disk I/O već za virtualnu memoriju !!.
  • pages swapped in i pages swapped out se odnose na “stranice” koje se čitaju ili zapisuju na Swap disk. Ovdje težimo nuli na oba mijesta jer ne želimo da dođe do toga kako bi se morala početi koristiti swap memorija.

Ova naredbe se inače najčešće koristi i za statistike rada diska, ili statistike od pojedine particije diska.


Naredba ''sar''


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 kB
  • kbmemused 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.



Naredba ''dmidecode''


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 bita
  • Maximum Capacity: 192 GB : maksimalan kapacitet RAM memorije koju podržava ovaj poslužitelj je 192 GB
  • Dalje vidimo podatke za svaki memorijski utor : pr. : Total Width: 72 bits : prvi memorijski modul je 72. bit-an , što je zbog ECC-a
  • Dalje vidimo podatke za svaki memorijski utor : pr. : Data 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).
  • Dalje vidimo podatke za svaki memorijski utor : pr. : Size: 8192 MB : Veličina je 8GB
  • Dalje vidimo podatke za svaki memorijski utor : pr. : Type: DDR3 : Tip memorije je DDR3
  • Dalje vidimo podatke za svaki memorijski utor : pr. : Speed: 1333 MHz : Brzina je 1333 MHz
  • Dalje vidimo podatke za svaki memorijski utor : pr. : Locator: 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)).
  • itd.


Zbog čega toliko priče o "Page Table"-u


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


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:

  • Private file mapping i
  • Shared file mapping

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 :

  1. Otvaranje datoteke (open) da bi se dobio File decriptor.
  2. Operacija u kojoj se treba dobiti veličina memorije za korištenje (fstat) pomoću tog File decriptora.
  3. Alociranje datoteke (mmap), korištenjem File decriptora koji smo dobili u prvom koraku pomoću operacije open.
  4. Kasnije slijedi zatvaranje (close) tog File decriptora.
  5. Te dolazi na red i rad sa ovom File mapped datotekom.

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:

  • Private Anonymous mapping i
  • Shared Anonymous mapping

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.



Huge Pages


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:

  1. Pronaći sve procese koji koriste THP, stopirati ih i ponovno pokrenuti
  2. Napraviti trajnu promjenu kako bi se THP isključio od trenutka podizanja operacijskog sustava.
  3. Napraviti skriptu u kojoj će se isključivati upotreba THPa , nakon podizanja operacijskog sustava. Ovo bi moglo zahtjevati naknadne promjene kao pod točkom 1. jer ovisi kojim redoslijedom će se izvršiti naša skripta. Točnije da li će se prije ili poslije naše skripte pokretati određeni servisi ili programi.

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.



Napredno : Zone RAM memorije


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 memorije

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

  • prvih 64 GB RAM, preko prvog CPUa (node 0) te
  • drugih 64 GB preko drugog CPUa (node 1), što čini ukupno 128GB RAM.

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 i
  • DMA32 te prvi dio od
  • Normal (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.

  • prvi stupac označava broj slobodnih (dostupnih) stranica memorije standardne veličine (4kB)
  • drugi stupac označava broj slobodnih (dostupnih) blokova stranica memorije (od 4kB), pri tome je veličina bloka veličine 8kB (blok od 2 x 4kB stranica)
  • treći stupac označava broj slobodnih (dostupnih) blokova stranica memorije (od 4kB), pri tome je veličina bloka veličine 16kB (blok od 4 x 4kB stranica)
  • četvrti stupac označava broj slobodnih (dostupnih) blokova stranica memorije (od 4kB), pri tome je veličina bloka veličine 32kB (blok od 8 x 4kB stranica)
  • … i u našem slučaju, tako sve do slobodih blokova veličine od 4096 kB (1024 x 4kB stranica)


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:

  1. pages_low - ostalo je vrlo malo slobodnog prostora za adresiranje (memory pages)
  2. pages_min - ostalo je malo prostora za adresiranje (memory pages)
  3. 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.


Napredno : VM - Slabs


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:

  1. u datoteci /proc/slabinfo
  2. u datoteci /proc/meminfo red Slab: cat /proc/meminfo | grep -i slab - prikazuje ukupno zauzeće slab memorije
  3. u realnom vremenu, s naredbom slabtop, koja se ponaša poput naredbe top

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

  • disk cache memorija: kao inode cache, filesystem (ext3/4/xfs/…) inode cache
  • ostale vrste cache memorija : files_cache, TCP ili UDP, blkdev_requests, kmalloc (proces za samo alociranje memorije za aplikacije), …

Dakle ukupno zauzeće RAM memorije je podijeljeno u dvije logičke cjeline (unutar sustava virtualne memorije):

  • standardno alocirane memorije
  • slab alocirane memorije, za posebne namjene (uglavnom za neku cache namjenu)

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 objakata
    • b - broju objekata slab memorije
    • c - veličini cache memorije
    • s - veličini objakata
    • u - 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 koristi
  • USE je odnos između OBJS i ACTIVE
  • OBJ SIZE je veličina pojedinog objekta (ovisi o funkciji koja ih treba)
  • SLABS - broj slab blokova
  • OBJ/SLAB - broj objekata koji mogu stati u jedan slab blok
  • CACHE SIZE je količina RAM memorija koja je alocirana za pojedinu funkcionalnost kernela
  • NAME je ime kernel funkcionalnosti koja koristi slab/cache memoriju

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





Administracija Linux sustava

Za administraciju Linux sustava, potrebno je biti root korisnik (administrator) :

  • root korisnik ima User ID 0 (UID)

Drugi korisnici mogu dobiti root ovlasti (ako znaju root lozinku), upotrebom naredbe su (Substitute User)

Rad s korisničkima računima, grupama i lozinkama

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

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

/etc/shadow

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

etc-shadow.jpg

Napredno

Pogledajmo samo dio kriptirane lozinke “Kriptirani password” dio sa slike, ali uvećan:

encrypted-passwd-part.jpg

Š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

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

etc-group.jpg

Standardne sigurnosne postavke


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/shadow
    • SHA512 - SHA512 - u /etc/shadow će biti vidljivo kao $6$
  • Vezano za korisničke grupe (i naredbe : 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će
    • GID_MAX : kod kreiranja novih korisničkih grupa (koje se zapisuju u /etc/group), do kojeg GID (Group ID) broja se mogu kreirati grupe
  • Vezano za ID korisnika (i naredbe: useradd 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)
  • … i još cijeli niz osnovnih mogućnosti (pogledajte Linux login.defs manual)


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 …



Osnovne naredbe za rad s korisničkim računima i grupama

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 pripada
  • groups ispiši kojim korisničkim grupama pripada trenutni korisnik
  • groupadd dodaj/kreiraj novu korisničku grupu
  • groupdel obriši korisničku grupu
  • groupmod modifikacije nad korisničkim grupama
  • useradd dodavanje novog korisnika
  • userdel brisanje postojećeg korisnika
  • usermod modifikacije nad korisničkim računom

U 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



Runlevels

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:

  • Za poslužitelje (servere) se primjerice često podiže 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,
  • S druge strane za desktop računala se obično podiže 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.
  • Osim toga za posebne namjene se koriste i ostali runleveli:
    • 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 ugase
    • runlevel 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:

runlevels.jpg

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.

Kako to radi (sistemski dio)


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

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:

  • prvi niz brojeva ( 2345 u ovom slučaju) znači u kojim runlevel-ima će se pokretati ova skripta
  • drugi broj ( 55 u ovom primjeru) je prioritet kod startanja ( S* broj)
  • treći 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) i
  • 6 (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

Package Management

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:

  • CentOS Linux
  • SUSE Linux
  • Open SUSE Linux
  • Fedora Linux
  • Oracle Linux

Ekstenzija paketa je .rpm .

RPM Package manager

RPM Package manager nam omogućava:

  • instalaciju paketa
  • deinstalaciju paketa
  • provjeru ispravnosti (checksum) paketa
  • pretraživanje paketa
  • update paketa

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:

  • GPG (GNU Privacy Guard) – alternativa PGP i
  • MD5

Vratimo se paketima i onome što se nalazi unutar svakog paketa:

  • Header – informacije o samom paketu: verzija, arhitektura, opis, listu datoteka, …
  • Payload – arhiva samih datoteka obično u cpio formatu ( koja je komprimirana sa gzip-om, noviji formati podržavaju i druge kompresije)
  • Signature (potpis) – koji osigurava integritet paketa [GPG ili MD5]

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 :

  • Owner,
  • Group,
  • Mode,
  • MD5 checksum,
  • Size,
  • Major and Minor Version number,
  • Symlink,
  • Modification time

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:

  • normal – Datoteka je instalirana,
  • not installed – datoteka iz paketa nije instalirana
  • replaced – datoteka je zamijenjena

I na kraju o nedostacima rpm paketa i samog managera paketa:

  • Ne može riješiti ovisnosti o nekom drugom paketu (dependencies)


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 Package Management

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

Kako se instaliraju paketi pomoću YUM-a ?

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.

Koji su osnovni prekidači YUM-a ?

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

Izvršavanje naredbi u zadano vrijeme

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/daemon
    • anacron - 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/daemon
  • at - 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

Crontab se koristi za automatsko pokretanje programa u točno određeno vrijeme.

  • postoji crontab konfiguracija za cijeli operacijski sustav
  • svaki pojedini korisnik može imati svoje crontab unose

Format crontab unosa je opisan na slici:

crontab.jpg

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


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 zadatka
  • SKRIPTA 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.



at naredba

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


Arhiviranje i komprimiranje/dekomprimiranje podataka

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

Arhiviranje, komprimiranje i dekomprimiranje

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žaj
  • f – sljedeći argument je naziv datoteke
  • z – 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.

Komprimiranje i dekomprimiranje

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

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.



dd i gzip


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 kopirati
  • count 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 particiji

Primjeri:

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.




zcat

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



zless

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

... ... ...




zip

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

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

bzcat

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

rsync


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
      • primjer: - -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

  1. Kopiranje odnosno sinkronizacija datoteka i direktorija iz jednog direktorija na drugi (na istom računalu)
  2. Kopiranje odnosno sinkronizacija datoteka i direktorija s jednog računala na drugo računalo, korištenjem rsync metode za kopiranje preko mreže
  3. Kopiranje odnosno sinkronizacija datoteka i direktorija s jednog računala na drugo računalo, korištenjem metode za kopiranje preko SSH 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 :

  • ovlasti (-p)
  • rekurzivno kopiranje sadržaja direktorija (-r) i sve direktorije (-d)
  • “soft” linkove (-l) te
  • vlasnika i pripadajuću grupu (-o i -g )kojoj pripadaju datoteke i
  • vremenske oznake (-t)
  • kopira sve “device-e” odnosno posebne vrste datoteka (-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:

  • ovlasti (Engl. Permissions) - sve što je u upotrebi s prekidačem -a te dodatno
  • proširene ovlast (Engl Extended atributes/SELinux) -X
  • ACL -A
  • hard linkove -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:

  • ovlasti (Engl. Permissions) - sve što je u upotrebi s prekidačem -a te dodatno
  • proširene ovlast (Engl Extended atributes/SELinux) -X
  • ACL -A
  • hard linkove -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.




Rad s tračnim uređajima

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:

  • Podaci se na trake zapisuju serijski (u nizu)
  • Mogu spremiti velike količine podataka (pr. LTO 6 : 2.5TB, tj. plan za LTO 8 je 12.8 TB po traci)
  • Najjeftiniji su pouzdani medij za pohranu velike količine podataka
  • I danas se koriste za pohranu podataka (backup) koja se obično negdje pohranjuje na određeno (duže) vrijeme

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 :

  • Trake su izdržljive:
    • Omougučavaju do nekoliko tisuća ubacivanja i izbacivanja iz tračnog uređaja
    • Omogučavaju nekoliko stotina prepisivanja cijele trake

Slika (1) pokazuje kako izgleda jedan (DDS4) tračni uređaj i same trake za pohranu podataka:

tapes-and-drives.jpg

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četak
  • retension – premotaj na kraj pa na početak (zbog izjednačavanja napetosti trake)
  • status – ispiši status
  • reserve – rezerviraj – i nakon završetka snimanja
  • release – oslobodi traku za drugi rad
  • erase – obriši cijelu traku
  • offline – 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


Mrežni sustav

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.


Topologija mreže

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čke

Slika prikazuje navedene tipove mrežnih topologija:


Mrežni pojmovi


Mreže u globalu dijelimo na LAN (Local Area Network) i WAN (Wide Area Network) mreže.

  • LAN - Lokalna mreža je primjerice mreža unutar jedne zgrade – kao što je mreža unutar neke tvrtke.
  • WAN - mreža je mreža koja povezuje više LAN mreža između udaljenih lokacija (pr. dvije lokacije tvrtke ili vašu tvrku s internetom).

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.


Mrežne kartice

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:

  • TCP Offload (Checksum/Large send), UDP
  • 802.1Q
  • 802.1p (QoS)
  • 802.3ad, Fast Ether Channel i Gigabit EC
  • 802.3* (z, ab, u ,x) - flow controll
  • Kriptiranje/Dekriptiranje
  • I/O Virtualizaciju (u kombinaciji sa SR-IOV), …

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

  • pomoću Polling mehanizma, kod kojega CPU provjerava status mrežne kartice - kada provjerava da li je nešto zaprimila
  • pomoću Interrupt (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)



Logička shema mrežne kartice


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 :

  • bakar: električni signali i načini modulacije i slanja/primanja signala
  • optika: ovisno za koje vlakno (single/multi mode) i koje valne duljine i sl.

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 :

  • U cijeni
  • Brzini
  • Podržanim funkcionalnostima
  • Upravljačkim programima (driverima) i njihovoj stabilnosti i brzini (loš driver = loša mreža)
  • Podršci
  • Dokumentaciji

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:

  • RJ-45 (bakar)
  • LC (optika)
  • SC (optika)
  • ST (optika)
  • i drugi

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
  • multi mode

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 :

  • 100 Mbps
  • 1.000 Mbps (1 Gbps)
  • 10.000 Mbps (10 Gbps)
  • 25.000 Mbps (25 Gbps)
  • 40.000 Mbps (40 Gbps)
  • 50.000 Mbps (50 Gbps)
  • 100.000 Mbps (100 Gbps)



Brzina mreže


Kod brzina mreža potrebno je razlikovati bandwidth od throughput-a.

Bandwidth

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

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 Mbps1.28 MBps
100 Mbps12.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:

  • kvaliteti veza
  • mrežnoj opremi
  • izvorišnoj i odredišnoj točki komunikacije
  • kontrolnim podacima, koje unose mrežni protokoli

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

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

Half Duplex

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.

Full Duplex

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


Auto Negotiation


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 :

  • Brzinu rada : 10 Mbps, 100 Mbps, 1 000 Mbps (1Gbps) ili 10 000 Mbps (10 Gbps)
  • Duplex način rada : od 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.


PlantUML Graph


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 Nasljeđe prošlosti


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


Metode komunikacije


Različiti mrežni protokoli koriste različite metode odnosno načine komunikacije. Najčešće razlikujemo tri osnovne metode komunikacije:

  • Unicast
  • Broadcast
  • Multicast


Unicast


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


Broadcast


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


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:

  • Aplikacijski : ovdje se sama aplikacija brine o multicast grupama (prima i šalje sve na i od multicast grupa)
  • Na mrežnom nivou (kada mrežni uređaji odrađuju sve vezano za multicast grupe):

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 i TCP/IP model

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/UDP Portovi

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
20FTP Data File Transfer Protocol za podatke
21FTP File Transfer Protocol za kontrolu
22SSH, SFTP i SCP Secure Shell : udaljeni pristup shell-u i Secure File Transfer Protocol te Secure Copy Protocol
23TELNET Telnet udaljeni pristup
25SMTP Simple Mail Transport Protocol
53DNS Domain Naime Server protokol
67BOOTP/DHCP BOOTP i DHCP Protokoli
69TFTP Trivial FTP Protokol
80HTTP Hyper Text Transfer Protocol
123NTP 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

Transportni protokoli, zaduženi su za prijenos podataka preko mreže, prema TCP/IP protokolu. Postoje ih dvije vrste :

  • Pouzdani, odnosno oni koji se brinu o tome da li je svaki poslani paket i primljen na odredištu
  • i oni manje pouzdani, koji se brinu samo o tome da je svaki paket uredno poslan, bez informacije o tome da li je na odredištu i uredno zaprimljen.



TCP


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.


PlantUML Graph


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.

PlantUML Graph


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.

PlantUML Graph



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.


PlantUML Graph


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:

  • strana A → strana B
  • strana B → strana A

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



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.



Enkapsulacija

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


Ostali pojmovi


  • MAC adresa (Media Access Control) je jedinstvena adresa, ugrađena u svaku mrežnu karticu, od strane proizvođača odnosno u svaki port na switchu (ili bilo kojem mrežnom uređaju). MAC adresa je 48 bitna, označava se sa 12 heksadecimalnih brojeva, grupiranih po 2 i obično odvojenih sa : ili -. Prvih 6. hexa brojeva označava proizvođača a ostalih 6 su redni brojevi.

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

  • IP adresa je jedinstvena adresa, te ju ne može imati niti jedno drugo računalo na mreži. IP adresa (Ipv4) je 32bitni binarni broj razlomljen u seriju dekadskih brojeva odvojenih točkom (.). Prvo se cijeli binarni broj razdjeli u 4 grupe od 8 binarnih brojeva, tada se svaka grupa od 8 bitova pretvara u decimalni broj. IPv4 može adresirati 4×8 bitova= 32b (bita) = 232 IP adresa. Osim IPv4 postoji i IPv6. IPv6 se sastoji od 8 heksteta tj (8 x 4 bajta) tj 8 puta po 4 heksadecimalna broja odvojena točkom (.) Dakle IPv6 može adresirati: 8 x 16 bitova = 128b (bita)=2128 IP adresa.
  • Network IP adresa (adresa mreže) je adresa koja definira samu mrežu. To je prvaadresa u mrežnom segmentu ili prva adresa u subnetu.
  • Broadcast IP adresa ovisi o tome da li je mreža subnetirana ili nije. Univerzalna broadcast adresa je: 255.255.255.255. inače ovisi o kojoj se mreži radi i u pravilu je to zadnja adresa unutar opsega mreže ili zadnja adresa u subnetu. Sve što se pošalje na broadcast adresu, primiti će svi unutar te mreže, a u slučaju univerzalnog broadcasta svi na svim mrežama. (Routeri po defaultu ne propuštaju broadcast poruke).
  • ARP (Adress Resolution Protocol). Pošto u TCP/IP mrežama svaki paket mora sadržavati Source i Destination IP i MAC adrese, potrebna je i upotreba ARP protokola. On je zadužen za pronalaženje MAC adrese od određene IP adrese (pridjeljuje MAC adresu IP adresi). Kada računalo A želi pristupiti računalu B (kojemu još nije pristupalo), ono provjeri da li zna njegovu MAC adresu (pošto mu je poznata IP adresa). Ako mu nije poznata njegova MAC adresa, računalo šalje ARP zahtjev te potom kada primi ARP odgovor, pomoću njega saznaje ispravnu MAC adresu od pripadajuće IP adrese. (Više detalja o ARP protokolu dalje u tekstu).


Kako radi mreža (Layer2)


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.

PlantUML Graph


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

  • Source i Destination MAC adrese i
  • Source i Destination IP adrese.

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.


Upoznajmo se detaljnije s ARP protokolom


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.

PlantUML Graph


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


PlantUML Graph


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.


Vratimo se na switcheve i Layer 2 komunikaciju


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.


Sumarizirajmo mogućnosti Layer 2 switchinga


  • Bridge-ing brzinom hardvera “Hardware based bridging” tj “Wire Speed performance”
  • Kolizijska domena je na nivou porta , odnosno upotrebom Full Duplex moda ne postoji
  • Nema mrežnog prometa između VLAN-ova,
  • Broadcast domena se proteže na sve portove (interface-e) i sve međusobno spojene Layer 2 switcheve


Bacimo pogled na klasične Routere (usmjerivače), koji rade na Layer 3 i 4


  • Broadcast domena ja unutar jednog porta (interface-a)
  • Layer 3 procesiranje je od strane CPU-a i samim time je više kašnjenje (latency) od Layer 2 switchinga :(Routeri s mrežnim paketima rade u miliskundama , switchevi i mikrosekundama [1.000 puta brže])
  • Visoka cijena prema broju portova (interface-a)


Što su Multilayer switchevi ?


Osim Standardnih Layer 2 switcheva, postoje i tkzv. Multilayer switchevi, odnosno switchevi koji rade na:

  • Layer 2 (switching)
  • Layer3 (routing/switching) i
  • Layer 4 (routing/switchinga) i to uz vrlo nisku latenciju koja je oko 1.000 puta manja od Routera.

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”):

  • Layer 2 : sve se odrađuje na osnovi MAC adresa, brzinom hardvera (tkzv. “Wire Speed”)
  • Layer 3 : sve operacije preklapanja tj, ovdje govorimo o routing-u (usmjeravanju) se odrađuju na osnovi IP adresa , sve se odrađuje brzinom hardvera (za razliku od Routera-a kod kojih CPU sve odrađuje)
  • Layer 4 : Dodaje se mogućnost rada na Transportnom sloju (TCP/UDP portovi) – možemo reći da je ovaj sloj “Application aware” – svjestan aplikacija.


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:

  • primiti,
  • obraditi i
  • proslijediti svaki mrežni paket.


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 :

  • Baratanja s VLAN-ovima i interVLAN Routing,
  • Agregaciji (Etherchannel/Bonding: pr. : LACP), i sl.

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

  • CAM memorije (tablice) za Layer 2 funkcionalnosti
  • TCAM memorije (tablice) za Layer 3 funkcionalnosti,

Zbog gore navedenih karakteristika, standardno ASIC (Cisco 3750 ili jači modeli) omogućava obradu sljedećih funkcija, hardverskom brzinom :

  • Traffic forwarding (obrada i prosljeđivanje paketa)
  • QoS (Quality of Service)
  • ACL lookup (Access Liste)
  • Route Processing (Obrada Routing funkcionalnosti)
  • STP (Spanning Tree protokol)


Slika prikazuje logičku shemu Cisco 3750 Multilayer (Layer: 2,3 i 4) switcha:


Broadcast domena


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


IP adrese


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


Klase IP adresa

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


Mreže


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:

  • IP adresu (adresu mreže)
  • opseg (range) IP adresa za upotrebu
  • Broadcast IP adresu
  • Netmask

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 :

  • Prvo računalo šalje promet na drugo i obratno [ pošto uz polazišnu i odredišnu MAC adresu (Source i Destination MAC) znaju svoju IP adresu i IP adresu računala s kojim komuniciraju ]

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:

  • Naravno Uz IP adresu mora biti definiran i Netmask (o tome u sljedećem poglavlju)
  • Mora biti definiran i Default Gateway tj. uređaj koji spaja našu mrežu s drugim mrežama


Što se dalje dešava, vidjeti ćemo kada naučimo još nekoliko pojmova !.




Netmask


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:

  • opseg IP adresa (ip range) za upotrebu
  • IP adresu mreže (network IP)
  • Broadcast IP adresu (broadcast IP)
  • Netmask


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:

  • mrežnog djela (network dio) - lijevo (plavo)
  • djela za računala ( host dio ) - desni dio

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 :

  • Ona je iz klase C - spada u opseg IP adresa, od 192.0.0.0 do 223.255.255.255
  • Prema tablici gore za C klasu mreže vidimo da host dio u 4-tom oktetu čine nule - gledano s desna na lijevo.
  • Njena maska mreže, će prema tome biti : 255.255.255.0 → Pogledajte mrežni dio na tablici gore.

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:

  • prema definiciji klasa mreža ili
  • prema potrebama naše mreže
  • prema potrebama podmreže (subnet) ili nadmreže (supernet) - samo ako ih koristimo


Pogledajmo to ovako - mrežni dio maske mreže se kreće:

  • od klase A mreže - od 255.0.0.0 : binarno : 11111111.00000000.00000000.00000000
    • dakle prve podmreže kreću od : 11111111.10000000.00000000.00000000
    • te ih možemo povećavati, dodavanjem 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.
  • potom dolazimo do klase B koja kreće od 255.255.0.0 : binarno : 11111111.11111111.00000000.00000000
    • a koja se proširuje na isti način s jedinicama
  • do klase C mreže - od 255.255.255.0 : binarno : 11111111.11111111.11111111.00000000
  • i dalje do realno iskoristive maske : 255.255.255.248 : binarno: 11111111.11111111.11111111.11111000

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 :

  • Prva moguća IP adresa je rezervirana za mrežu (IP adresa mreže)
  • Zadnja moguća IP adresa je rezervirana za Broadcast IP adresu


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

netmask.jpg



Podmreže (Subnets)


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:

  • IP adresu mreže
  • Opseg IP adresa za upotrebu
  • Broadcast IP adresu


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 :

  • Koliko subneta želimo unutar pojedine mreže,
  • Koliko hostova (računala) želimo unutar svakog subneta.


Potom se izračunava subnet koji nam odgovara.

Kada smo odredili subnet, potrebno je za svaki subnet zapisati :

  • Adresu mreže subneta
  • Broadcast adresu subneta
  • Opseg iskoristivih IP adresa unutar subneta


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že (Supernetting)

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 (Routing)



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
  • protokole za usmjeravanje (routing protokole)

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 :

  • Distance vector protokoli (RIP, RIP v.2, IGRP, …)
  • Link-state protokoli (OSPF, IS-IS, …)
  • Hibridni protokoli, koji su kombinacija gornja dva (BGP, EIGRP, …)


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:

  • izvorišna IP adresa (Source IP)
  • odredišna IP adresa (Destination IP)
  • provjerni zbroj (Checksum)
  • ukupna duljina paketa (i IP zaglavlja i podataka)
  • TTL (Time to Live) odnosno vrijeme dozvoljenog života paketa
  • deseci drugih opcija i zastavica

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" protokoli


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

  • RIP - Routing Information Protocol (v.1 i v2.),
  • IGRP - Interior Gateway Routing Protocol,
  • EIGRP - Enhanced IGRP, …



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

  • Mogućnost slanja podataka samo ako je došlo do promjena na nekoj od mreža
  • Uzimanja cijele topologije mreže kao bitne za odluke kod usmjeravanja (routinga)

Neki od protokola koji spadaju u ovu kategoriju su :

  • OSPF - Open Shortest Path First,
  • IS-IS - Intermediate System to Intermediate System.


Kako radi mreža (Layer2 + Layer3)


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:

  • Source (izvor) i Destination (odredište) IP adrese i
  • Source (izvor) i Destination (odredište) MAC adrese


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

  • Ako ju već ima, formira paket i šalje ga
  • Ako ju nema ide u ARP zahtjev da sazna MAC adresu od IP adrese 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.


Popis (i opis) osnovnih mrežnih servisa


Zbog potrebe za razumjevanjem rada mreža, potrebno je okvirno shvatiti način rada osnovnih mrežnih servisa odnosno protokola.


TFTP i FTP


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.


TFTP


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.


FTP


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

Slika: Aktivni mod rada:


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.


Bootp


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.


DHCP


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

  • IP adresu Default Gateway-a
  • IP adrese DNS poslužitelja
  • Ime domene(Domain name)
  • Time Server

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:


DNS


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 :

  • kada je odgovor od strane poslužitelja veći od 512 bytea ili
  • kada se radi takozvani “zone transfer” ili
  • kada DNS klijent koji inače komunicira s DNS poslužiteljem preko UDP protokola, nije dobio odgovor, za nekoliko sekundi (ovisi o implementaciji: 3-5 s.), on mora ponoviti DNS upit, korištenjem TCP protokola.


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.

Kako to logički izgleda:


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:

  • od vršnih domena : .com .net .org …
  • kao i za vršne domene za države: .hr .us .de .uk …

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:

  • najdesnija oznaka (.com) prenosi vršnu domenu
  • svaka oznaka od desno prema lijevo predstavlja poddomenu. Ovdje je oznaka redhat poddomena, domene .com
  • i www je poddomena, domene redhat


Postoje i određena ograničenja i pravila DNS standarda:

  • svaka oznaka može imati 63 znaka
  • potpuno domensko ime ne može prelaziti 253 znaka u svojem tekstualnom prikazu (u unutarnjem binarnom DNS prikazu maksimalna dužina zahtijeva 253 okteta)
  • DNS imena tehnički se mogu sastojati od bilo kojeg znaka koji se može predstaviti oktetom. Kakogod, dopuštena formulacija domenskih imena u DNS korijenskoj zoni,te u većini ostalih poddomena, koristi željen oblik i skup znakova. Znakovi dopušteni u oznakama su podskup ASCII skupa znakova te uključuju znakove a pa sve do z, A do Z, 0 do 9, te minus. ovo pravilo je poznato kao LDH pravilo (letter, digits, hyphen). Domenska imena su protumačena kao neovisna o veličini znaka. Oznake ne mogu započeti ili završiti crticom (minusom). Postoji i dodatno pravilo da u biti vršne domene ne smiju biti samo brojčani znakovi
  • Ime računala (hostname) je ime koje ima pridruženu barem jednu IP adresu . Na primjer, domenska imena www.redhat.com i redhat.com su također imena računala, ali com domena nije.


Telnet i SSH


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.

Telnet


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


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:

  • poboljšanja u procesu kriptiranja (engl. Diffie–Hellman key exchange),
  • nove algoritme kriptiranja (AES 128, 192 , …),
  • poboljšanu provjeru integriteta podataka
  • podršku za PKI certifikate


Konfiguracija mreže u Linuxu


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>



Linux mrežni model


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:


PlantUML Graph

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.


Nazivi mrežnih kartica u Linuxu


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

  • Agregiranih (engl. bonding) kartica : koje služe za agregaciju više fizičkih mrežnih kartica (eth0 , eth1, ethN) u jednu logičku mrežnu karticu (Cisco terminologija je Ether Channel).
  • Bridge mrežnih kartica : one služe za spajanje više mrežnih kartica u jedan “Bridge” tj. Layer2 uređaj, koji propušta sva promet s jedne kartice na drugu i obratno (ponaša se poput poput switcha: - jedna mrežna kartica = jedan port na switchu).
  • Ostalih specifičnih tipova.


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:

  • “on-board” (na matičnoj ploči)
  • ili kao PCI/PCI-Express, …

Nazivi ovih mrežnih kartica su (čisto informativno):

Ime mrežne karticeOpis
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).



Konfiguracija mrežnih kartica


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:

  • IP adrese
  • Netmaska
  • Network IP adrese
  • Broadcast IP adrese
  • Default Gatewaya

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


Statička konfiguracija može biti privremena (do sljedećeg restarta) ili trajna (permanentna).


Privremena statička konfiguracija

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 :

  • ifconfig
  • route
  • arp
  • netstat
  • iptunnel
  • ipmaddr
  • tunctl
  • brctl

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-toolsiproute2
Stara naredbaNova naredba
ifconfigip addr ili ip link
ifconfig (interface status)ip -s link
routeip route
arpip neigh
netstatss
netstat -gip maddr
netstat -rip route
iptunnelip tunnel
ipmaddrip maddr
tunctlip tuntap
brtclbridge

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 :

NaredbaOpis
ip addr showIspiši konfiguraciju svih mrežnih kartica koje su aktivne
ip addr show ethxIspiši konfiguraciju mrežne kartice ethx (pr. eth0)
ip link showIspiš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:

  • IP adresa: 172.17.100.1
  • Netmask: 255.255.255.0
  • Broadcast IP: 172.17.100.255

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



Trajna (permanentna) ručna konfiguracija mreže


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

ParametarVrijednostOpis
DEVICE=etho Naziv mrežne kartice (eth0 ili eth1 ili eth2 , ….)
BOOTPROTO=none ili bootp ili dhcpTip protokola koji se koristi za dodjeljivanje IP parametara mreže
IPADDR=IP adresaIP adresa ove mrežne kartice (pr.: 192.168.1.10)
NETMASK=NetmaskNetmask adresa (pr.: 255.255.255.0)
ONBOOT=yes ili noDa li ova mrežn akartica treba biti aktivna kod podizanja sustava
USERCTL=yes ili noyes= svi korisnici imaju pravo kontroliranja rada kartice , no=samo root korisnik ima sva prava
NM_CONTROLLED=yes ili noDa 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 :

  • IP adresa : 192.168.1.10
  • Netmask : 255.255.255.0

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:

ParametarVrijednostOpis
nameserverIP adresa DNS poslužiteljaPr.: 195.29.150.3
domain Ime domenePr.: mojadomena.com - dodaje se ako hostname upišemo bez domene (FQDN)
search Ime dodatnih domanaPr.: 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:

ParametarVrijednostOpis
NETWORKING=yes ili noDali 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-aPr.: 192.168.1.1

Primjer

Dodajemo sljedeće parametre :

  • Ime računala (engl. Hostname): server1
  • Default Gateway : 192.168.1.1
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.



Dinamička konfiguracija korištenjem DHCP poslužitelja


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 :

  • IP/Netmask: 192.168.1.10/255.255.255.0 te će mu poslati i ostale parametre, koje će DHCP klijent postaviti na svoje računalo.

Naše računalo sada ima ispravno konfigurirane IP parametre :

  • IP/Netmask : 192.168.1.10/255.255.255.0
  • Default Gateway : 192.168.1.1
  • DNS POslužitelji : 158.225.15.16 i 158.226.15.17

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.


Privremena konfiguracija korištenjem DHCP poslužitelja


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:

ParametarOpis
-r(engl. Release) - oslobodi dodjeljenu IP adresu (zahtjev prema DHCP poslužitelju)
-RPošalji listu opcija koje DHCP klijent traži od DHCP poslužitelja
-HPošalji DHCP poslužitelju Hostname ovog računala (klijenta)
-FPoš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 :

  • IP adrese i Netmaska
  • Default Gateway-a
  • DNS Poslužitelja, …


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.


Trajna konfiguracija korištenjem DHCP poslužitelja


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.


Konfiguracija route-a

Privremena konfiguracija statičkih route-a s naredbama route i ip route


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


Trajna konfiguracija statičkih route-a


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.



Osnovni mrežni alati


Nabrojati ćemo i objasniti neke od osnovnih alata za provjeru dostupnosti i ispravnosti rada mreže i mrežnih servisa.


ping


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:

  • Koliko je paketa poslano a koliko primljeno (koliki je postotak uspješnosti)
  • Koja su prosječna vremena od slanja do primanja paketa (minimalno, srednje i maksimalno vrijeme)

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 :

  • Unutar države do ~100 ms (internet) tj. do ~50ms ako imate zakupljene linkove (između dva grada unutar tvrtke ili sl.)
  • Do drugih susjednih država i dalje ~200 ms
  • Sve puno dalje i nešto više od +200 ms


traceroute


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


nslookup


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


netstat


Naredba netstat (engl. Network Statistics) prikazuje nam razne parametre rada mreže :

  • IP konfiguraciju mrežnih kartica,
  • Routing tablice,
  • Mrežne konekcije,
  • Statistike vezane za mrežne protokole , ….

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



ntstat


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.



List open files (lsof)


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 :

  • prvi po redu (onaj s PID 13414) je ostvarena konekcija (ESTABLISHED) između našeg servera : 192.168.100.1 , port je ssh (standardno je to port 22) a druga strana ssh tunela/konekcije je IP : 93.137.225.169 , na remote portu 60010.
  • slijedeći je (PID 22746 ) sam SSH Daemon (sshd) za koji vidimo da sluša na svim IP adresama lokalnog servera (*:ssh označava sve lokalne IP, port ssh tj. 22) stanje “LISTEN” što znači da osluškuje nove veze.


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 :

  • cwd trenutni radni direktorij
  • rtd root direktorij
  • txt program text (kod i podaci)
  • mem “memory-mapped” datoteka

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:

  • r za prava čitanja ( read access )
  • w za prava pisanja ( write access )
  • u za prava čitanja i pisanja ( read and write )


Stupac “TYPE”
Stupac “TYPE” definira vrstu datoteke i njenu identifikaciju. Moguće vrijednosti su:

  • DIR – Direktorij
  • REG – obična (standardna) datoteka
  • CHR – “Character” vrsta posebne datoteke
  • FIFO – “First In First Out” vrsta posebne datoteke



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 :

  • ESTABLISHED
  • LISTEN

Uz dodatna stanja:

  • SYN_SENT
  • SYN_RECEIVED
  • FIN_WAIT_1
  • TIME_WAIT
  • CLOSE_WAIT
  • FIN_WAIT_2
  • LAST_ACK
  • CLOSING

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 - posebna mrežna sučelja


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) 


Socket Statistics (ss)


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 -aIspiši sve
ss -nInterpretiraj sve protokole brojčano bez prepoznavanja imena protokola
ss -sIspiši listu svih otvorenih socketa
ss -lIspiši listu svih otvorenih portova
ss -pIspiši i procese koji su otvorili portove/sockete
ss -tIspiši samo TCP
ss -uIspiš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:

StanjeOpis
establishedOstvarene konekcije
syn-sentTCP syn paket poslan
syn-recvTCP syn paket primljen
fin-wait-1TCP je u stanju zatvaranja i čeka se FIN ACK paket s druge strane
fin-wait-2TCP Socket je zatvoren ali se čeka potvrda FIN ACK s druge strane
time-waitTCP FIN Timeout još nije istekao te je veza u stanju čekanja da se zatvori
closedZatvoreno
close-waitProgram koji je otvorio TCP socket je još aktivan i nije još zatvorio TCP socket
last-ackStanje, trenutak prije urednog zatvaranja TCP konekcije
closingU stanju zatvaranja
all Sva stanja od gore
connectedKonekcija je ostvarena
synchronized Sva stanja osim syn-sent
bucketStanja, 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


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.


Network Manager


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 :

  • Ethernet,
  • Wireless,
  • Mobilnih kartica (3G, 4G),
  • DSL i PPPoE.

Što se tiće konfiguracije mrežnih kartica, u njemu je moguće definirati sve IP parametre :

  • Statički ili dinamički (DHCP):
    • IP adresu i Netmask,
    • Default Gateway,
    • DNS poslužitelje
  • VPN konekcije
  • Druge parametre rada mrežnih kartica

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.


SSH, SFTP i SCP


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.


Instalacija i pokretanje


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.


Napredna konfiguracija


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.


Spajanje


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 :

PlantUML Graph

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


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)


TFTP


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


Instalacija


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.


Konfiguracija


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 sigurnosti
  • server_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

Upotreba i primjeri


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 imena
  • put ime datoteke - upload (na TFTP poslužitelj) datoteke točno definiranog imena

Nije moguće izlistavati datoteke koje se nalaze na TFTP poslužitelju, kao kod FTP protokola, već je potrebno znati točno ime datoteke.


HTTP


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.


Instalacija


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


Konfiguracija i pokretanje


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 pokrenuti
  • MaxClients 256 označava ogranićenje broja spojenih klijenata na svaki pojedini HTTP poslužiteljski daemon

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

  • Samo root korisnik ima pravo na sustavo otvarati portove koji su ispod 1023
  • Ovaj proces koji je pokrenuo root 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.
  • Ovaj proces zapravo samo proslijeđuje promet na pod procese koji ga i obrađuju.

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.


Firewall


Š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):

  • Proslijediti ga dalje
  • Odbaciti ga,
  • Blokirati ili
  • Napraviti neku dodatnu akciju

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.

Kako koristiti firewall

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


Kako radi Linux Firewall

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 :

  • Raw
  • Mangle
  • NAT i
  • Filter

Operacije tj. filteri ili nizovi (engl. chains) su podjeljeni u nekoliko grupa:

  • PREROUTING : koriste se za Raw, Mangle i NAT tablice
  • INPUT : koriste se za : Mangle i Filter tablice
  • FORWARD : koriste se za : Mangle i Filter tablice
  • OUTPUT : koriste se za : Raw, Mangle, NAT i Filter tablice
  • POSTROUTING : koriste se za Mangle i NAT tablice

Za sada ćemo se fokusirati na Filter tablice. Filter tablica može koristiti tri operacije/filtera/niza (engl. chain) :

  • INPUT : je za sve pakete namjenjene ovom računalu
  • OUTPUT : je za sve pakete koji izlaze iz ovog računala
  • FORWARD : je za sve pakete koji su primljeni ali nisu namjenjeni ovom računalu već bi ih ovo računalo trebalo proslijediti (engl. Forward) negdje dalje (nekom drugom računalu na mrežu)

Sada svaki paket mora proći kroz provjeru pravila (engl. rules) odnosno kriterija koji mogu biti :

  • ACCEPT : paket je prihvaćen i ide dalje prema aplikaciji
  • DROP : paket se odbacuje i nikakve informacije se ne šalju pošiljaocu paketa
  • REJECT : paket se odbacuje ali se pošiljaocu paketa šalje poruka o grešci
  • LOG : detalji o paketu se šalju na centralno mjesto za logiranje (obično syslog servis)
  • DNAT : prepisuje se “Destination IP” paketa
  • SNAT : prepisuje se “Source IP” paketa


Pogledajmo logički dijagram toka Linux firewall-a i to samo dijela Filter tablice:


PlantUML Graph


Potrebni su nam i prekidači kojima definiramo radnju za određeno pravilo:

  • -j (engl. Jump) : podržava jednu od četiri naredbe : ACCEPT , REJECT , DROP ili LOG
  • -m (engl. Match) : provjerava da li su zadovoljeni daljnji uvjeti (ima ih veći broj) - oni rade detaljniju provjeru stanja paketa, limite i sl.

Osim gore navedene provjere postoje i dodatni kriteriji provjere :

  • -p <protocol>: dodatna definicija protokola : tcp, udp, icmp i all
  • -s <ip_addr>: provjerava “Source IP”
  • -d <ip_addr>: provjerava “Destination IP”
  • - -sport <port>: Provjerava “Source port”
  • - -dport <port>: Provjerava “Destination port”
  • -i <interface>: Provjerava mrežni interface s kojeg je paket došao
  • -o <interface>: Provjerava mrežni interface s kojeg je paket otišao

Sada kada znamo osnove, potrebno je razumjeti i načine dodavanja, brisanja i mjenjanja pravila Firewall-a:

  • -A : (engl. Append) - nadodaj na postojeći
  • -D : (engl. Delete) - obriši
  • -I : (engl. Insert) - dodaj/ubaci
  • -R : (engl. Replace) - zamjeni
  • -L : (engl. List) - izlistaj/ispiši
    • - -line-numbers - kod izlistavanja ispiši i redni broj “rule”-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.


Primjeri

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


Napredno

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


PlantUML Graph


Pogledajmo sada samo dio “Netfilter podsustava”


PlantUML Graph


Napredne mrežne tehnologije


Ukratko ćemo se upoznati s naprednim mrežnim tehnologijama i objasniti ćemu one služe.


VLAN-ovi

  • VLAN čini logičku grupu ili cjelinu raznih mrežnih komponenti (računala, mrežnih uređaja i sl.). VLAN-ovi se obično grupiraju prema nekim logičkim podjelama mreže: pr. prema odjelu tvrtke, prema specifičnim zahtjevima korisnika, poslužitelja i sl. Switch-evi i bridge-vi propuštaju unicast, multicast i broadcast promet samo unutar VLAN-a unutar kojega se nalaze. Dakle komunikacija je moguća samo između svih mrežnih uređaja i računala unutar jednog VLAN-a.

Promet između VLAN-ova nije moguć bez Layer 3 uređaja (dakle bez routera ili Multilayer Switcheva).

  • VLAN TRUNK

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:

  • Cisco ISL
  • IEEE 802.1Q

Kako to radi na pojednostavljenom modelu, vidljivo je na slici.


Bonding (Agregacija/Etherchannel)


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

  • Konfigurira se svaka fizička mrežna kartica koja če biti povezana u “bond”, te kartice postaju tkzv. “engl. slave” kartice,
  • Od ovog trenutka “IP parametri” fizičkih mrežnih kartica postaju nepotrebni jer se sve konfigurira u sljedećem koraku,
  • Konfiguriraju se parametri “bond” logičke mrežne kartice ,
  • Konfiguriraju se “IP parametri” bonding mrežne kartice (IP adresa/Netmask , …),
  • Pokreće se Linux Bonding kernel modul (bonding),
  • Kreira se posebna logička mrežna kartica (engl. Channel Bonding Interface) imena bondx (pr. bond0, bond1 , …)

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:


Bonding modovi rada

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.


Network Namespaces


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 :

  • Mrežni uređaji,
  • IP adrese,
  • portovi
  • Route-a
  • Firewall itd.

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:

  • Svaki “Namespace” ima svoj loopback uređaj,
  • Virtualni ili fizički mrežni uređaji se mogu dodavati u bilo koji Namespace te im se može dodjeljivati IP adresa,
  • Network Namespace dijeli isti datotečni sustav s fizičkom instancom Linuxa unutar kojeg se koristi,


Mrežni uređaji

Kratak (p)opis mrežnih uređaja i pojmova o kojima smo pričali:


HUB

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

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.


Switch

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


Router

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


Multilayer Switch


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.


Firewall

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

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žitelj

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

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:

  • Access VPN: omogućava udaljeni pristup na intranet ili extranet infrastrukturu preko dijeljene (share) infrastrukture poput: Dial UP, ISDN, (A/S/H)DSL, Cable modem i sl. na druge udaljene korisnike ili na intranet/e.
  • Intranet VPN: omogućava pristup preko dijeljene veze, za spajanje više lokacija i omogućava pristup samo zaposlenicima unutar korporacije
  • Extranet VPN: omogućava pristup preko dijeljene veze, za spajanje kompanije partnera na udaljenim lokacijama i omogućava pristup vanjskim (engl. External) korisnicima.



Log datoteke


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:

  • /var/log/messages – sadrži globalne sistemske poruke koje se spremaju od trenutka podizanja sustava.
  • /var/log/dmesg – sadrži informacija koje proslijeđuje kernel . Ove poruke mogu se vidjeti s naredbom dmesg.
  • /var/log/boot.log – sadrži informacije koje se logiraju kod podizanja (engl. Boot) sustava tj. podizanja svakog pojedinog servisa/daemona tokom podizanja sustava.
  • /var/log/lastlog – Prikazuje informacije o zadnjem logiranom korisniku.Naredbom lastlog se može vidjeti sadržaj ove datoteke.
  • /var/log/maillog – sadrži log informacije mail poslužitelja.
  • /var/log/Xorg.x.log – sadrži log informacije o X Window sustavu.
  • /var/log/btmp – sadrži informacije o pogrešnim pokušajima logiranja na sustav (! nije u tekstualnom formatu !). S naredbom last može se vidjeti formatirana statistika iz ove datoteka , također i sa utmpdump /var/log/btmp.
  • /var/log/cups – prikazje sve informacije vezane za Printere ili print servis/daemon (CUPS).
  • /var/log/anaconda.log – sadrži sve informacije o procesu instalacije Linuxa (za to je zadužen servis/daemon “Anaconda”).
  • /var/log/yum.log – sadrži informacije koje logira “YUM” package manager kod instalacije paketa.
  • /var/log/cron – sadrži informacije koje zapisuje “cron” servis/daemon.
  • /var/log/secure – sadrži sve informacije vezane za sigurnost koje mogu popunjavati razni servisi/daemoni : p. SSH daemon ovdje zapisuje sve poruke oko logiranja.
  • /var/log/wtmp – sadrži zapise o logiranju na sustav (! nije u tekstualnom formatu !). Naredba 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--



Kernel Dump/Crashdump/core dump


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 :

  • datotečni sustav na lokalnom tvrdom disku, kroz datoteku /proc/vmcore
  • ili na neki drugi sustav (računalo), dostupno preko mreže.

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

  • Ovaj već opisani s učitavanjem novog posebnog kernela koji služi samo ovoj svrsi
  • Poseban slučaj u kojemu se primarni kernel može ponovno iskoristiti (Engl. Reuse) ali samo na arhitekturama koje podržavaju Tzv. “relocatable kernels”

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:

  • Minmalna verzija Linux kernela 2.6.13
  • Kernel mora biti konfiguriran da podržava kexec
  • Moraju biti instalirani pripadajući alati (“kexec-tools ”)


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

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 poslužitelj,
  • X Window klijent,
  • komunikacijska veza i konačno
  • X Window Manager

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 :

  • hardverom “ekrana” (engl. Display) odnosno grafičke kartice,
  • ulazom s tipkovnice i miša
  • ulaznih ili izlaznih podataka s drugih uređaja

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 :

  • Iscrtaj prozor na koordinatama x,y

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:


Dodaci


ASCII tablica


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:

DECOCT 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 OCTHEXSymbol Description
32 04020 Space
33 04121 ! Exclamation mark
34 04222 Double quotes (or speech marks)
35 04323 # Number
36 04424 $ Dollar
37 04525 % Percent
38 04626 & Ampersand
39 04727 ' Single quote
40 05028 ( Open parenthesis (or open bracket)
41 05129 ) Close parenthesis (or close bracket)
42 0522A * Asterisk
43 0532B + Plus
44 0542C , Comma
45 0552D - Hyphen
46 0562E . Period, dot or full stop
47 0572F / Slash or divide
48 06030 0 Zero
49 06131 1 One
50 06232 2 Two
51 06333 3 Three
52 06434 4 Four
53 06535 5 Five
54 06636 6 Six
55 06737 7 Seven
56 07038 8 Eight
57 07139 9 Nine
58 0723A : Colon
59 0733B ; Semicolon
60 0743C < Less than (or open angled bracket)
61 0753D = Equals
62 0763E > Greater than (or close angled bracket)
63 0773F ? Question mark
64 10040 @ At symbol
65 10141 A Uppercase A
66 10242 B Uppercase B
67 10343 C Uppercase C
68 10444 D Uppercase D
69 10545 E Uppercase E
70 10646 F Uppercase F
71 10747 G Uppercase G
72 11048 H Uppercase H
73 11149 I Uppercase I
74 1124A J Uppercase J
75 1134B K Uppercase K
76 1144C L Uppercase L
77 1154D M Uppercase M
78 1164E N Uppercase N
79 1174F O Uppercase O
80 12050 P Uppercase P
81 12151 Q Uppercase Q
82 12252 R Uppercase R
83 12353 S Uppercase S
84 12454 T Uppercase T
85 12555 U Uppercase U
86 12656 V Uppercase V
87 12757 W Uppercase W
88 13058 X Uppercase X
89 13159 Y Uppercase Y
90 1325A Z Uppercase Z
91 1335B [ Opening bracket
92 1345C \ Backslash
93 1355D ] Closing bracket
94 1365E ^ Caret - circumflex
95 1375F _ Underscore
96 14060 ` Grave accent
97 14161 a Lowercase a
98 14262 b Lowercase b
99 14363 c Lowercase c
100 14464 d Lowercase d
101 14565 e Lowercase e
102 14666 f Lowercase f
103 14767 g Lowercase g
104 15068 h Lowercase h
105 15169 i Lowercase i
106 1526A j Lowercase j
107 1536B k Lowercase k
108 1546C l Lowercase l
109 1556D m Lowercase m
110 1566E n Lowercase n
111 1576F o Lowercase o
112 16070 p Lowercase p
113 16171 q Lowercase q
114 16272 r Lowercase r
115 16373 s Lowercase s
116 16474 t Lowercase t
117 16575 u Lowercase u
118 16676 v Lowercase v
119 16777 w Lowercase w
120 17078 x Lowercase x
121 17179 y Lowercase y
122 1727A z Lowercase z
123 1737B { Opening brace
124 1747C | Vertical bar / Pipe
125 1757D } Closing brace
126 1767E ~ Equivalency sign - tilde
127 1777F Delete




Izvori informacija


Izvori informacija :

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




wiki/knjige/uvod_u_linux.txt · Last modified: 2018/01/03 15:31 by hhorvat