Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Strana 2 / 9
- OS2 Vežba 1
- VIŠER 2014.
- Uvodne napomene
- Operativni sistemi 2, V semestar, VIŠER.
- Profesor:
- Borislav Đorđević, bora@impcomputers.com
- Saradnik:
- Borislav Krneta, borak@viser.edu.rs
- Strana 3 / 9
- OS2 Vežba 1
- VIŠER 2014.
- Sadržaj laboratorijskih vežbi
- 1. UVOD
- Uvodna priča.
- Uvodni test. Provera znanja sa OS1 koje je neophodno za OS2.
- 2. FILE MANAGMENT
- Rad sa komandama za kreiranje, kopiranje, brisanje i pomeranje datoteka i direktorijuma.
- Hard linkovi i simbolički linkovi
- Pretraživanje direktorijuma (find)
- Pretraživanje tekstualnih datoteka (grep)
- 3. ARHIVIRANJE I BACKUP
- Tar, tar+gzip, tar+bzip2
- cpio
- 4. NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA (PROGRAMERSKI ČAS)
- Vektorsko čitanje i pisanje (writev, readv)
- Brzi prenos podataka (sendfile)
- Čitanje sadržaja simboličkih linkova (readlink)
- Zaključavanje datoteka (fcntl)
- Prikazivanje informacija iz i-node strukture datoteka (stat)
- 5. DISKOVI I FAJL SISTEMI
- Blok uređaji i diskovi, particije
- Administriranje fajl sistema - kreiranje, aktiviranje, fsck
- Aktivno stablo
- 6. KOLOKVIJUM # 1
- Obuhvata gradivo sa vežbi 2-5
- 7. SHELL PROGRAMIRANJE
- Kako se piše i pokreće shell program; C program vs shell script
- Promenljive, kako ih proslediti shell skriptu, šta je izlazni status komande
- Upotreba navodnika
- Osnovne komande (read, expr, test, ...)
- If struktura i petlje
- Shell proširenja
- 8. PROCESI - IPC (PROGRAMERSKI ČAS)
- Deljiva memorija
- Mapirana memorija
- Neimenovani pipe
- Preusmeravanje standardnog ulaza, izlaza i izlaza za greške
- FIFO
- 9. MREŽA
- Mrežno okruženje i konfiguracione datoteke za mrežno okruženje
- Strana 4 / 9
- OS2 Vežba 1
- VIŠER 2014.
- Konzolni programi za administraciju
- Mrežni servisi
- NFS
- Administracija mreže iz YaST-a
- Šta je i kako radi socket mehanizam (programerski)
- 10. UREĐAJI I PROC FS (PROGRAMERSKI ČAS)
- Tipovi uređaja, označavanje uređaja, hardverski i specijalni uređaji
- Sistemski pozv ioctl
- /proc sistem datoteka - dobijanje informacija iz /proc
- /proc - upisi procesa
- /proc - informacije o hardveru
- /proc - informacije o FS
- /proc - statistika sistema
- 11.BOOT I SHUTDOWN
- Boot - procedura, šta se dešava
- Nivoi izvršavanja i rc skripte
- Administracija runlevel-a i servisa iz YaST-a
- Prijavljivanje na sistem
- Shutdown procedura
- 12.SECURITY
- sudo
- gnupg
- iptables
- 13.KOLOKVIJUM # 2
- Obuhvata gradivo sa vežbi 7-12
- Strana 5 / 9
- OS2 Vežba 1
- VIŠER 2014.
- Knjige i dokumentacija za pripremu pismenog ispita
- Knjige:
- Za korišćenje i administraciju Linux-a:
- Borislav Đorđević, Dragan Pleskonjić, Nemanja Maček, „Operativni sistemi: UNIX i Linux“.
- Viša elektrotehnička škola, Beograd (2004.), ISBN 86-85081-03-3.
- Za sistemsko programiranje:
- Borislav Đorđević, Marko Carić, Dragan Pleskonjić, Nemanja Maček, „GNU/Linux sistemsko
- programiranje“, Visoka škola elektrotehnike i računarstva, Beograd (2007.), ISBN 978-86-
- 7982-009-9.
- Za pripremu ispita (Linux administracija):
- Borislav Đorđević, Dragan Pleskonjić, Nemanja Maček, „Operativni sistemi: zbirka rešenih
- ispitnih pitanja i zadataka“, Viša elektrotehnička škola, Beograd (2005.), ISBN 86-85081-15-
- 7.
- Borislav Đorđević, Dragan Pleskonjić, Nemanja Maček, „Operativni sistemi: teorija, praksa i
- rešeni zadaci“, Mikro knjiga, Beograd (2005.), ISBN 86-7555-274-2. NAPOMENA: Ova knjiga
- sadrži i teorijski deo koji ovaj kurs većim delom pokriva.
- Dokumentacija:
- PDF dokumenti sa vežbi u okviru kursa na Moodle sistemu.
- Strana 6 / 9
- OS2 Vežba 1
- VIŠER 2014.
- Način polaganja ispita
- Uslov za izlaz na ispit
- Uslov za izlazak na ispit su odbranjene laboratorijske vežbe. Da bi ste odbranili laboratorijske
- vežbe, potrebno je na svakoj odbrani sakupiti minimum 50 % od maksimalnog broja poena.
- Odbrane vežbi
- Za odbrane vežbi, predviđena su dva testa (nakon pređene svake od dve glavne celine gradiva, u
- računarskoj laboratoriji škole. Na prvoj odbrani može se ostvariti do 5 poena i na drugoj do 5 poena.
- Kolokvijumi
- Kao glavne provere znanja, predviđena su dva kolokvijuma (nakon pređene svake od dve glavne
- celine gradiva) ili završni ispit, u računarskoj laboratoriji škole. Na prvom kolokvijumu može se
- ostvariti do 35 poena i na drugom do 35 poena, ili na završnom ispitu do 70 poena.
- Strana 7 / 9
- OS2 Vežba 1
- VIŠER 2014.
- Uvodni test
- Namena ovog testa je da proverite koliko ste gradiva iz OS1 zapamtili ili zaboravili. Preporuka je da
- test probate da uradite sami, ukoliko ne možete nečega da se setite, pokušajte da rešite problem
- čitajući PDF-ove iz OS1.
- 1. Kreirajte jedan novi korisnički nalog koristeći "User Accounts".
- Parametri naloga su:
- korisničko ime: korisnik1
- lozinka: 1Password2
- 2. Kreirajte jedan novi korisnički nalog iz komandne linije komandom useradd.
- Parametri naloga su:
- korisničko ime: korisnik2
- lozinka: 1Password2
- home direktorijum: /home/korisnik2 (NAPOMENA: koristite opciju -d /home/korisnik2
- komande useradd za dodelu home direktorijuma korisniku)
- Proverite da li je korisniku dato puno ime. Ako nije, dodelite mu ime Drugi Korisnik (komanda
- chfn).
- Proverite da li je korisniku napravljen home direktorijum. Ako nije:
- kreirajte ga
- iskopirajte u njega profil (kopiranje kompletnog sadržaja iz /etc/skel)
- dodelite vlasništvo korisniku nad kompletnim sadržajem home direktorijuma (komanda
- chown)
- postavite prava pristupa nad home direktorijumom tako da vlasnik ima sva prava, grupa
- pravo čitanja i izvršavanja a ostali nikakva prava
- 3. Koristeći komandu chage postavite parametre lozinke za korisnički nalog korisnik1 tako da:
- nalog nikad ne ističe, ali se zaključava nakon 7 dana neaktivnosti (-I inactivity)
- korisnik mora da promeni lozinku na svakih 40 dana (-M maximum)
- 10 dana nakon promene lozinke korisnik ne sme ponovo da menja lozinku (-m minimum)
- 20 dana nakon promene lozinke korisnik dobija upozorenje da će mu lozinka isteći za 20
- dana (-W warning)
- 4. Kreirajte grupu korisnici i u nju učlanite korisnike korisnik1 i korisnik2.
- Za kreiranje grupe koristite komandu groupadd a korisnike učlanite komandama usermod -G.
- 5. Prijavite se u konzoli kao korisnik1 komandom su.
- Strana 8 / 9
- OS2 Vežba 1
- VIŠER 2014.
- 6. Komandom file odredite kojeg su tipa datoteke /etc/hosts, /bin/cp, /etc.
- 7. Na svom home direktorijumu kreirajte praznu datoteku.
- 8. Podesite umask tako da se pri kopiranju ukida pravo čitanja grupi i sva prava ostatku sveta.
- 9. Iskopirajte tu praznu datoteku i proverite prava pristupa kopije.
- 10.Dodelite kopiji pravo čitanja i izvršavanja za ostatak sveta.
- 11. Prijavite se na konzolu kao root i poklonite datoteku drugom korisniku.
- 12.Kojom komandom ćete pročitati sadržije i-nodea za direktorijum /etc?
- 13.Kreirajte jednu praznu datoteku i dajte joj pravo izvršavanja. Poklonite datoteku korisniku
- korisnik2. Podesite flegove tako da se pri izvršavanju ove datoteke ona uvek izvršava sa
- akreditivima korisnika kome je poklonjena.
- 14.Napišite C program koji prikazuje pid procesa i proces roditelja. Prevedite program i
- pokrenite ga.
- 15. Izlistajte sve procese na sistemu (procese svih korisnika)
- Strana 9 / 9
- Strana 2 / 15
- OS2 Vežba 2 VIŠER 2014.
- Preporučuje se da pročitate
- Borislav Đorđević, Dragan Pleskonjić, Nemanja Maček, Operativni sistemi: UNIX i Linux, VETŠ 2004.
- Poglavlje 5 - Rad sa datotekama iz komandne linije (91. strana).
- Strana 3 / 14
- OS2 Vežba 2 VIŠER 2014.
- Praktični zadaci
- 1. Pokretanje virtuelne mašine.
- Kreirajte novi korisnički nalog koristeči "User Accounts" ili iz odgovarajuće shell komande.
- Parametri su sledeći:
- username: smerbrojIndeksa (npr: nrtd912)
- password: 1Password2
- full name: Vaše ime
- home direktorijum: /home/smerbrojIndeksa (npr: /home/ nrtd912)
- shell: /bin/bash
- Odjavite se sa sistema.
- Prijavite se na sistem kao novokreirani korisnik.
- Pokrenite terminal.
- 2. Određivanje sistemske putanje
- Odredite maksimalnu dužinu sistemske putanje (PATH): getconf PATH_MAX
- Prikažite vašu sistemsku putanju na ekranu: echo $PATH
- Da li možete da izvršavate komande koje se nalaze:
- u vašem home direktorijumu
- u /bin direktorijumu
- u /sbin direktorijumu
- Pretpostavite da se vaš home direktorijum NE nalazi u sistemskoj putanji i da se u njemu nalazi
- izvršna binarna datoteka program. Kako ćete u Bourne Again Shell-u pokrenuti ovu datoteku?
- Prijavite se privremeno kao root korisnik: su -
- Odredite sistemsku putanju. Da li root može da izvršava komande iz /sbin i /usr/sbin
- direktorijuma ?
- Preuzmite stari identitet: exit
- Strana 4 / 14
- OS2 Vežba 2 VIŠER 2014.
- 3. Redirekcija ulaza/izlaza
- Šta radi sledeća komanda: ls -l /etc
- Probajte da izlaz prethodne komande preusmerite u datoteku etclist: ls -l /etc >etclist
- Pogledajte sadržaj datoteke etclist: cat etclist
- Šta radi sledeća komanda: mount
- Probajte da izlaz prethodne komande preusmerite u datoteku mountlist: mount >mountlist
- Pogledajte sadržaj datoteke mountlist: cat mountlist
- Zadajte sledeću komandu: ls -l /qwertz
- Preusmerite standardni izlaz za greške komande ls -l /qwertz u datoteku error.txt sledećom
- komanom: ls -l /qwertz 2>error.txt
- Pogledajte sadržaj datoteke error.txt: ls -l error.txt
- Obrišite datoteke koje ste kreirali: rm etclist mountlist error.txt
- 4. Pipeline komandi
- Potrebno je prebrojati sve datoteke u osnovnoj grani direktorijuma /etc. Jedan od načina na koji se
- to može učiniti je sledeći:
- preusmerite izlaz komande ls -l /etc (koja ispisuje jednu datoteku direktorijuma /etc u svakoj
- liniji na ekranu) u neku datoteku: ls -l /etc >etc1.txt
- prebrojite linije datoteke: wc -l etc1.txt
- Drugi način je da iskoristite komandni pipeline: ls -l /etc | wc -l
- Drugi primer gde je pipeline neophodan je bilo koja Linix komanda koja proizvodi veliki output.
- Komanda koja prikazuje sadržaj etc direktorijuma (ls -l /etc) je dobar primer. Izlaz takve komande
- možete videti stranu po stranu ako uradite sledeće stvari:
- preusmerite izlaz komande ls -l /etc (koja ispisuje jednu datoteku direktorijuma /etc u
- svakoj liniji na ekranu) u neku datoteku: ls -l /etc >etc2.txt
- pregledajte datoteku viewer-om less: less etc2.txt
- Drugo rešenje je da povežete te dve komande u pipeline: ls -l /etc | less
- Obrišite datoteke koje ste kreirali: rm etc1.txt etc2.txt
- 5. Upotreba joker-a *, ?, []
- Pređite na direktorijum /bin: cd /bin
- Strana 5 / 14
- OS2 Vežba 2 VIŠER 2014.
- Prikažite sve datoteke čije ime počinje na slovo a: ls -l a*
- Prikažite sve datoteke čije ime počinje slovima ch: ls -l ch*
- Šta prikazuje: ls -l ??mod
- Šta prikazuje: ls -l [a-d]*
- Vratite se na home direktorijum: cd
- 6. Upotreba alias-a
- Prikažite sve alias-e za tekućeg korisnika: alias
- Napravite alias et kao “ls -l /etc | less”: alias et=”ls -l /etc | less”
- Napravite alias mn kao “mount”: alias mn=”mount”
- Probajte aliase: et
- Probajte aliase: mn
- Poništite aliase: unalias et
- Poništite aliase: unalias mn
- 7. Ponavljanje i editovanje komandi
- Namerno pogrešno otkucajte neku komandu, na primer lls: lls -l /etx
- Vratite komandu iz bafera (strelica na gore) pa je ispravite i izvršite: ls -l /etc
- Gde se čuvaju komande otkucane u prošlosti?
- Pogledajte sadržaj datoteke .bash_history u home direktorijumu: less ~/.bash_history
- 8. Kompletiranje imena datoteke
- Otkucati “cat /etc/pas” pa pritisnite <tab> - od Linuxa dobijate kompletirano ime /etc/passwd
- Sta znači ako tab ne radi: ili ima vise opcija, ili nema nijedne. Na primer: “cat /etc/pa” <tab>
- 9. Dobijanje pomoći
- Probajte da dobijete pomoć za neku komandu na sledeće načine:
- mkdir --help
- man mkdir
- info mkdir
- Isprobajte ovo za nekoliko raznih komandi. Ukoliko niste sigurni za komandu, imate pretraživač na
- osnovu ključnih reči: apropos partition
- Strana 6 / 14
- OS2 Vežba 2 VIŠER 2014.
- 10. Lokatori komandi
- Pronađite sve informacije o položaju datoteke cp: whereis cp
- Pronaci gde se nalazi manual page programa insmod: whereis -m insmod
- Pronaci gde se nalazi source datoteke find: whereis -s find
- Pronaci gde se nalazi izvršna datoteka grep: whereis -b grep
- Uporedite komande: whereis insmod i which insmod
- 11. Ispitivanje sadrzaja datoteke
- Odredite tipove sledećih datoteka:
- /etc/hosts: file /etc/hosts
- /bin/cp: file /bin/cp
- /dev/hda: file /dev/hda
- Napomena: Ukoliko vam se pojavi error: No such file or directory, prijavite se na sistem
- kao root, pokrenite terminal i ukucajte komandu: fdisk -l kako biste proverili da li je
- /dev/sda, ukoliko jeste, u daljem radu umesto hda kucajte sda.
- Napravite jedan simbolički link pa primenite komandu file na njega:
- Kreirajte link: ln -s /tmp tmp1
- Pogledajte kako link izgleda: ls -l
- Proverite tip: file tmp1
- Obrišite ga: rm tmp1
- Probajte sledeću komandu: file /dev/hda{,1,2,9,10,11}
- Probajte sledeću komandu: file -s /dev/hda{,1,2,9,10,11}
- 12. Prikazivanje čitljivih karaktera iz binarne datoteke
- Probajte komandu: strings /bin/rm
- 13. Komanda cp – jednostavno kopiranje, pristupna prava originala i kopije i vrednost
- umask parametra
- Kreirajte jednu datoteku u svom home direktorijumu: touch original
- Strana 7 / 14
- OS2 Vežba 2 VIŠER 2014.
- Postavite prava pristupa za datoteku original na 775: chmod 775 original
- Postavite vrednost promenljive umask tako da odseca prava write i execute kategorijama group i
- others sledećom komandom: umask 033
- Iskopirajte datoteku: cp original kopija
- Pogledajte šta piše u i-nodeovima originala i kopije: ls -l original kopija
- Uporedite pristupna prava originala i kopije. Koji su bitovi ukinuti ?
- Postavite vrednost promenljive umask na vrednost 022: umask 022
- Obrišite obe datoteke: rm original kopija
- 14. Komanda cp – kopiranje jedne datoteke iz drugog direktorijuma u tekući, sa
- promenom imena datoteke,vlasnički odnosi originala i kopije
- Iskopirajte jednu datoteku čiji je vlasnik korisnik root u svoj home: cp /bin/cp my_cp
- Pogledajte šta piše u i-nodeovima originala i kopije: ls -l /bin/cp my_cp
- Uporedite vlasničke odnose originala i kopije. Kom korisniku i kojoj grupi je dodeljena kopija?
- (hint: pogledajte koja je primarna grupa korisnika “korisnik”)
- Obrišite datoteku my_cp: rm my_cp
- 15. Upotreba džokera za kopiranje datoteka iz jednog direktorijuma u drugi
- Kreirajte dva direktorijuma u svom home direktorijumu: mkdir src dst
- Kreirajte nekoliko datoteka u direktorijumu src zadajući redom sledeće komande:
- pređite na direktorijum src: cd src
- kreirajte datoteke: touch a1 a2 a3 a4 a5 b1 b2 b3 b4 b5 c1 c2 c3 c4 c5
- vratite se na svoj home direktorijum: cd
- Iskopirajte u direktorijum dst sve datoteke koje počinju na slovo a: cp src/a* dst/
- Sada probajte da Iskopirate u direktorijum dst sve datoteke koje počinju na slovo “b”, ali tako da
- im promenite prvo slovo u “d” (npr b1 se kopira u d1, b2 u d2...): cp src/b* dst/d*
- Da li ste u tome uspeli?
- Ako niste, probajte da kopirate datoteku po datoteku i da joj pri tom menjate ime:
- cp src/b1 dst/d1
- cp src/b2 dst/d2-RC5
- cp src/b3 dst/d31
- Strana 8 / 14
- OS2 Vežba 2 VIŠER 2014.
- cp src/b4 dst/d41
- cp src/b5 dst/d5-tux
- 16. Još malo priče o džokerima i njihovoj primerni na komandu za listanje sadržaja
- direktorijuma
- Prikažite sve datoteke u direktorijumimu dst: ls -l dst
- Prikažite sve datoteke u direktorijumu dst čije je ima dužine dva karaktera: ls dst/??
- Prikažite sve datoteke u direktorijumu dst čije ime počinje na “d”: ls dst/d*
- Prikažite sve datoteke u direktorijumu dst čije ime počinje na “d” i dužine je 2 karaktera: ls dst/d?
- Prikažite sve datoteke u direktorijumu dst u čijem je imenu drugi karakter “2”: ls dst/?2*
- Obrišite kompletne direktorijume dst i src: rm -rf src dst
- 17. Odredite potrebne i dovoljne uslove da nešto iskopirate
- Kreirajte dva direktorijuma u svom home direktorijumu: mkdir dir1 dir2
- Kreirajte datoteku u direktorijumu src: cp /etc/passwd dir1/file1
- Dodelite sva prava nad direktorijumima vlasniku (tj. sebi): chmod 777 dir1 dir2
- Dodelite sva prava nad datotekom vlasniku (tj. sebi): chmod 777 dir1/file1
- Probajte da iskopirate datoteku: cp dir1/file1 dir2/file2
- Da li ste uspeli? Zašto?
- Obrišite kopiju: rm dir2/file2
- Ukidajte redom prava nad datotekom dir1/file1 i utvrdite koja su vam prava neophodna nad
- izvorišnom datotekom da bi ste mogli da izvršite kopiranje:
- Pravo čitanja “r” izvorišne datoteke:
- o ukinite pravo “r”: chmod u-r dir1/file1
- o probajte da iskopirate: cp dir1/file1 dir2/file2
- ako je kopiranje uspešno (proverite sa ls dir2), obrišite kopiju: rm dir2/file2
- ako ne prodje to pravo, potrebno je dodelite ponovo sebi pravo “r”: chmod u+r
- dir1/file1
- Pravo upisa “w” u izvorišnu datoteku: *** few commands missing ***
- Pravo izvršavanja “x” izvorišne datoteke: *** few commands missing ***
- Strana 9 / 14
- OS2 Vežba 2 VIŠER 2014.
- Ukidajte redom prava nad direktorijumom dir1 i utvrdite koja su vam prava neophodna nad
- direktorijumom u kome se nalazi izvorišna datoteka da bi ste mogli da izvršite kopiranje:
- Pravo čitanja “r” izvorišnog direktorijuma: *** few commands missing ***
- o ukinite pravo “r”: chmod u-r dir1
- o probajte da iskopirate: cp dir1/file1 dir2/file2
- ako je kopiranje uspešno (proverite sa ls dir2), obrišite kopiju: rm dir2/file2
- ako ne prodje to pravo, potrebno je dodelite ponovo sebi pravo “r”: chmod u+r dir1
- Pravo upisa “w” u izvorišni direktorijum: *** few commands missing ***
- Pravo izvršavanja “x” izvorišnog direktorijuma: *** few commands missing ***
- Ukidajte redom prava nad direktorijumom dir2 i utvrdite koja su vam prava neophodna nad
- odredišnim direktorijumom da bi ste mogli da izvršite kopiranje:
- Pravo čitanja “r” odredišnog direktorijuma:
- o ukinite pravo “r”: chmod u-r dir2
- o probajte da iskopirate: cp dir1/file1 dir2/file2
- ako je kopiranje uspešno (proverite sa ls dir2), obrišite kopiju: rm dir2/file2
- ako ne prodje to pravo, potrebno je dodelite ponovo sebi pravo “r”: chmod u+r dir2
- Pravo upisa “w” u odredišni direktorijum: *** few commands missing ***
- Pravo izvršavanja “x” odredrišnog direktorijuma: *** few commands missing ***
- Zapišite sva prava koja su vam neophodna nad izvorišnom datotekom, direktorijumom u kojem se
- ona nalazi i odredišnim direktorijumom da bi ste mogli da izvršite kopiranje datoteke.
- Obrišite direktorijume dir1 i dir2: rm -rf dir1 dir2
- 18. Neki parametri komande cp
- Kreirajte direktorijum u svom home direktorijumu: mkdir dir1
- Kreirajte datoteku u direktorijumu src: cp /etc/passwd dir1/file1
- Probajte ponovo da iskopirate istu datoteku: cp /etc/passwd dir1/file1
- Šta sistem prijavljuje ? Utvrdite da li je to interaktivni ili forsirani režim.
- interaktivno (postojeća datoteka se prepisuje bez pitanja): cp -i /etc/passwd dir1/file1
- forsirano (sistem pita pre prepisivanja postojeće datoteke): cp -f /etc/passwd dir1/file1
- Probajte “verbose” režim kopiranja:
- “non-verbose” (podrazumevano, ne ispisuje poruke na ekranu): cp /etc/passwd dir1/file2
- “verbose” (mora se naglasiti, ispisuje se poruke na ekranu): cp -v /etc/passwd dir1/file3
- Probajte “rekurzivno” kopiranje, tj . kopiranje kompletnog sadržaja direktorijuma ili cele grane
- stabla.
- Strana 10 / 14
- OS2 Vežba 2 VIŠER 2014.
- Napravite dva odredišna direktorijuma: mkdir dir2 dir3
- Iskopirajte sadržaj /etc u direktorijum dir2: cp -r /etc/* dir2/
- Iskopirajte direktorijum /etc kao granu u direktorijum dir3: cp -r /etc dir3/
- Pregledajte sadržaj direktorijuma etc, dir2 i dir3: ls -l /etc dir2 dir3)
- Ustanovite razliku između prethodne dve komande.
- Obrišite podddirektorijume dir2 i dir3 sa tekuće grane: rm -rf dir2 dir3
- 19. Komanda mv – pomeranje jedne datoteke, grupe datoteka i direktorijuma
- Kreirajte dva direktorijuma u svom home direktorijumu: mkdir src dst
- Kreirajte nekoliko datoteka u direktorijumu src zadajući redom sledeće komande:
- pređite na direktorijum src: cd src
- kreirajte datoteke: touch a1 a2 a3 a4 a5 b1 b2 b3 b4 b5 c1 c2 c3 c4 c5
- vratite se na svoj home direktorijum: cd
- Pomerite datoteku a1 u direktorijum dst: mv src/a1 dst/
- Pomerite datoteku a2 u direktorijum dst i promenite joj ime: mv src/a2 dst/a2_v1.01
- Promenite ime datoteke a3 u c6: mv src/a3 src/c6
- Pomerite grupu datoteka kojima ima počinje na “b” u direktorijum dst: mv src/b* dst/
- Probajte da pomerite grupu datoteka i da im promenite ime: mv src/c* dst/d*
- Da li ste uspeli u tome?
- Probajte da pomerite ceo poddirektorijum: mv src dst/
- Da li ste uspeli u tome?
- Obrišite poddirektorijume src i dst: rm -rf src dst
- 20. Komanda mv – šta se dešava sa vlasničkim odnosima i pristupnim pravima
- datoteka koju pomerate
- Kreirajte dva direktorijuma u svom home direktorijumu: mkdir src dst
- Kreirajte datoteku u direktorijumu src: touch src/file1
- Pogledajte prava pristupa i vlasničke odnose datoteke src/file1: ls -l src/file1
- Pomerite datoteku file1 u direktorijum dst: mv src/file1 dst/
- Pogledajte prava pristupa i vlasničke odnose datoteke src/file1: ls -l dst/file1
- Odredite šta se desilo sa vlasništvom i pravima pristupa.
- Obrišite direktorijume src i dst: rm -rf src dst
- Strana 11 / 14
- OS2 Vežba 2 VIŠER 2014.
- 21. Komanda mv – potrebni i dovoljni uslovi za izvršenje komande mv
- Kreirajte dva direktorijuma u svom home direktorijumu: mkdir dir1 dir2
- Kreirajte datoteku u direktorijumu src: cp /etc/passwd dir1/file1
- Dodelite sva prava nad direktorijumima vlasniku (tj. sebi): chmod 777 dir1 dir2
- Dodelite sva prava nad datotekom vlasniku (tj. sebi): chmod 777 dir1/file1
- Koristeći sličan postupak kao u poglavlju 17. odredite prava koja su potrebna da bi korisnik
- pomerio datoteku. Potrebno je da ispitate prava koja imate nad izvorišnim i odredišnim
- direktorijumom i samom datotekom.
- Kada završite, obrišite direktorijume dir1 i dir2: rm -rf dir1 dir2
- 22. Komanda rm – brisanje datoteka i poddirektorijuma
- Kreirajte dve datoteke, direktorijum i u njemu još dve datoteke:
- touch a1 a2 b1 b2; mkdir dir1; touch dir1/c1 dir1/c2
- Probajte da obrišete dve datoteke sa fiegom -i: rm -i a*
- Probajte da obrišete dve datoteke sa flegom -f: rm -f b*
- Probajte da obrišete direktorijum (koji nije prazan) komandom rmdir: rmdir dir1
- Jeste li uspeli u tome?
- Probajte ovako: rm -rf dir1
- 23. Komanda rm – potrebni uslovi za brisanje datoteke
- Kreirajte direktorijum u svom home direktorijumu: mkdir dir1
- Kreirajte datoteku u tom poddirektorijumu: cp /etc/passwd dir1/file1
- Dodelite sva prava nad direktorijumom vlasniku (tj. sebi): chmod 777 dir1
- Dodelite sva prava nad datotekom vlasniku (tj. sebi): chmod 777 dir1/file1
- Koristeći sličan postupak kao u poglavlju 17. odredite prava koja su potrebna da bi korisnik
- obrisao datoteku. Potrebno je da ispitate prava koja imate nad direktorijumom u kome se datoteka
- nalazi.
- Kada završite, obrišite direktorijum dir1: rm -rf dir1
- Strana 12 / 14
- OS2 Vežba 2 VIŠER 2014.
- 24. Hard linkovi
- Postavite umask na 027: umask 027
- Napravićete hard link datoteke /etc/passwd u svom home direktorijumu.
- Pogledajte broj linkova originalne datoteke: ls -l /etc/passwd
- Napravite hard link: cp -l /etc/passwd hard_passwd
- Pogledajte i-nodove za obe datoteke: ls -l /etc/passwd hard_passwd
- Uporedite, vlasnika, grupu i prava pristupa hard linka i originalne datoteke.
- Pogledajte broj linkova datoteke i linka: ls -l /etc/passwd hard_passwd
- Obrišite link: rm hard_passwd
- Pogledajte broj linkova originala nakon brisanja linka: ls -l /etc/passwd
- 25. Simbolički linkovi
- Napravićete simbolički link na datoteku /etc/passwd u svom home direktorijumu.
- Pogledajte broj linkova originalne datoteke: ls -l /etc/passwd
- Napravite simbolički link : cp -s /etc/passwd sym_passwd
- Pogledajte i-nodove za obe datoteke: ls -l /etc/passwd sym_passwd
- Obratite pažnju na deskriptor simboličkog linka lrwxrwxrwx. Da li je umask “ukinuo” neka prava?
- Uporedite, vlasnika, grupu i prava pristupa hard linka i originalne datoteke.
- Pogledajte broj linkova datoteke i linka: ls -l /etc/passwd sym_passwd
- 26. Kopiranje sa flegom -d
- Probajte kopiranje sa -d flegom: cp -d sym_passwd d_passwd
- Probajte kopiranje bez -d flega: cp sym_passwd no_d_passwd
- Pogledajte kontekst za originalnu datoteku, simboličku link i dve kopije koje ste dobili i utvrdite šta
- se dešava kada kopirate simbolički link sa -d flegom, a šta se dobija kada kopirate link bez -d
- flega.
- ls -l /etc/passwd sym_passwd d_passwd no_d_passwd
- Obrišite datoteke i linkove koje ste napravili: rm sym_passwd file_d file_no_d
- 27. Rad sa direktorijumima – parametri komande ls
- Šta prikazuju sledeće dve komande:
- ls /etc
- Strana 13 / 14
- OS2 Vežba 2 VIŠER 2014.
- ls -l /etc
- Opcija -a (prikazuje skrivene datoteke):
- izlistajte sadržaj: ls -l /tmp
- prikažite i skrivene datoteke: ls -al /tmp
- Opcija -d (prikazuje kontekst direktorijuma umesto sadržaja):
- prikažite kontekst: ls -ld /tmp
- Prikažite i-nodove sledećih datoteka: ls -i /bin/cp /tmp
- Probajte sadžaj direktorijuma po dubini (recursively): ls -R /usr
- Dereferenciranje linkova:
- Prikažite kontekst linka: ls -l /dev/cdrom
- Prikažite kontekst originala (dereferenciranje): ls -lL /dev/cdrom
- Probajte da prikažete veličine datoteka u čitljivijem formatu: ls -lh /boot
- Probajte da prikažete datoteke u direktorijumu /etc i da ih sortirate po veličini: ls -l -sort=S /etc
- 28. Navigacija po aktivnom stablu – komanda cd
- Pozicioniranje na home direktorijum: cd . Proverite gde ste pozicionirani: pwd
- Pozicioniranje na roditeljski direktorijum: cd .. . Proverite gde ste pozicionirani: pwd
- Pozicioniranje na direktorijum /etc: cd /etc . Proverite gde ste pozicionirani: pwd
- Relativna putanja do /usr: cd ../usr . Proverite gde ste pozicionirani: pwd
- 29. Kreiranje direktorijuma – komanda mkdir
- Pređite na home: cd
- Kreirajte jedan direktorijum: mkdir newdirectory
- Kreirajte stablo: mkdir 1/11/111
- Proverite šta je prethodna komanda napravila, tj čemu služi fleg [26].
- Obrišite direktorijum: rmdir newdirecory
- Obrišite stablo: rm -rf 1
- Napomena: Ukoliko se prilikom kreiranja stabla pojavi error: No such file or directory, potrebno je
- zadati komandu u drugačijem obliku: mkdir -p 1/11/111
- Strana 14 / 14
- OS2 Vežba 2 VIŠER 2014.
- (-p, --parents no error if existing, make parent directories as needed )
- 30. Pretrazivanje direktorijuma – komanda find
- Prijavite se na sistem kao root.
- Pronađite sve datoteke:
- kreirane pre manje od 3 dana, pocev od /home: find /home -ctime -3 -print
- vece od 100KB a manje od 500KB, pocev od /boot: find /boot -size +100k -size -500k
- -print
- koje pripadaju grupi bin, pocev od /bin: find /bin -group bin -print
- koje pripadaju korisniku “smer_brojIndeksa (npr: nrtd912)”, pocev od /home:
- find /home -user smer_brojIndeksa -print
- sa pravima pristupa rw-r-----, pocev od /etc: find /etc -perm 640 -print
- sve karakter uređaje u direktorijumu /dev: find /dev -type c -print
- koje imaju tacno po 2 linka, pocevsi od /sbin: find /sbin -links 2 -print
- sve datoteke ciji inode ima vrednost 50: find / -inum 50 -print
- Pitanje: kako ćete naći sve hard linkove jedne datoteke?
- Pitanje: kako ćete jednom komandom pronaći sve datoteke koje pripadaju jednom korisniku i
- obrisati ih?
- Odjavite se sa sistema: logout
- 31. Cleaning and housekeeping.
- Ugasite virtuelnu mašinu.
- Strana 15 / 14
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 2 / 13
- Teorijski deo
- Preporučuje se da pročitate
- Borislav Đorđević, Dragan Pleskonjić, Nemanja Maček, Operativni sistemi: UNIX i Linux, VETŠ 2004. Poglavlja: 9 - Arhiviranje i backup (265. strana) 12 - Instalacija softverskih paketa (318. strana)
- Najčešće korišćeni arhiver. Radi sa magnetnom trakom, disketama i sa arhivama u okviru datoteka.
- Sintaksa komande tar je: tar komanda [opcije] ime_arhive lista_datoteka
- tacno jedna komanda je obavezna, a opcije se navode ukoliko su potrebne (najčešće jesu)
- ime arhive je ime datoteke ili nod za uređaj
- lista datoteka se zadaje u jednostavnom obliku file1,... fileN, dir1,... dirN, a upotreba dţokera je dozvoljena.
- Komande:
- -c kreiranje nove arhive
- -t listanje sadrţaja arhive
- -x ekstrakcija datoteka iz arhive (extract).
- -r bezuslovno aţuriranje (append) - datoteka se dodaje na kraj arhive
- -u uslovno aţuriranje (update) - datoteka se dodaje na kraj arhive ako je novijeg datuma u odnosu na postojeću kopiju datoteke u arhivi
- --delete brisanje datoteka iz arhive - datoteka se u arhivi označi kao da je obrisana i dalje se ne koristi prilikom listanja ili ekstrakcije, iako fizički postoji u arhivi. Datoteka se ne moţe obrisati iz arhive koja se nalazi na magnetnim trakama
- Opcije:
- -f arch specificira datoteku ili uređaj na kome treba kreirati arhivu, odnosno na kome se nalazi arhiva
- -M kreira višemedijumsku arhivu (multi-volume archive)
- -p čuva prava pristupa datoteka
- -P čuva apsolutnu putanju, odnosno ne briše vodeći /, koji se podrazumevano uklanja
- -v opširno opisuje status prilikom izvršenja tar komande
- -w interaktivni rad (od korisnika se zahteva potvrda za svaku akciju)
- --verify provera ispravnosti arhive nakon upisa u nju,
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 3 / 13
- - I FILE arhiviraju se datoteke pobrojane u datoteci FILE
- -X FILE datoteke pobrojane u datoteci FILE se ne arhiviraju
- -Z uključuje kompresiju arhive pomoću programa compress
- -z uključuje kompresiju arhive pomoću programa gzip
- --ignore-failed-read u slučaju oštećenja arhive, tar komanda prestaje sa radom. Ukoliko je ova opcija navedena, arhiviranje se nastavlja nakon oštećenja.
- Kreiranje arhive (komanda c)
- Navodi se ime arhive (datoteke ili uređaja) i lista datoteka koje će biti uključene u tu arhivu. Na primer:
- tar cvf /dev/rst0 myfile - arhivira datoteku myfile na magnetnu traku
- tar cvf myfile.tar myfile - arhivira datoteku myfile u arhivu myfile.tar
- Argumenat cfv ima sledeće značenje:
- c je kreiranje nove arhive
- v obezbeđuje poruke o izvršenju komande na ekranu
- f specificira da je prvi sledeći argumenat ime tar arhive, odnosno uređaja (preporučuje se da, ukoliko je arhiva realizovana u formi datoteke, ima ekstenziju .tar.)
- Arhiviranje svih datoteka osim onih koje su pobrojane u nekoj datoteci (na primer, exclude.list - u ovom slučaju to su datoteke file1, file2, tempdata i datoteka u kojoj je smeštena lista - exclude.lst):
- $ cat exclude.list
- exclude.list
- file1
- file2
- tempdata
- $ tar cvfX mydata.tar exclude.list *
- Kombinacija tar+find:
- $ find -newer lastmod -print >> include.list
- $ tar cvf mydata.tar -I include.list
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 4 / 13
- Arhive koje kreira tar uključuju: vlasničke odnose (na osnovu UID i GID), prava pristupa i vremena koja opisuju pristupe i modifikacije. Kada se datoteke raspakuju iz arhive, ovi atributi se prenose iz arhive u datoteke.
- Listanje sadržaja arhive (komanda t)
- tar tf - prikazuje imena datoteka koje se nalaze u arhivi
- tar tvf - prikazuje i ostale atribute
- Listanje se koristi za pregledanje sadrţaja arhive i određivanje punog imena datoteke koje je neophodno za ekstrakciju pojedinačnih datoteka iz arhive.
- $ tar tf myfiles.tar
- 1.txt
- acme/
- acme/1.txt
- $ tar tvf myfiles.tar
- -rw-rw-r-- nm/nm 20 2003-10-24 15:42:06 1.txt
- drwxrwxr-x nm/nm 0 2003-10-24 11:08:17 acme/
- -rwxrwxr-x nm/nm 125 2003-10-24 11:07:50 acme/1.txt
- Ekstrakcija datoteka (komanda x)
- Ukoliko se ne navede lista datoteka, vrši se ekstrakcija cele arhive.
- Ukoliko se navede lista, iz arhive se izvlače pojedinačne datoteke, grupe datoteka i direktorijumi.
- $ tar xvf myfiles.tar
- Arhiviranje i kompresija
- gzip komprimuje datoteku a.a u datoteku a.a.gz pri čemu se čuvaju vlasnički odnosi, prava pristupa i vreme poslednje modifikacije. Kompimovane datoteke se mogu vratiti u originalni oblik pomoću programa gunzip, odnosno gzip -d. Sadrţaj kompresovanih tekstualnih datoteka moţe se pregledati sa zcat i zless bez prethodne dekompresije. Program gzip ne radi arhiviranje - svaka datoteka se kompresuje odvojeno. Komprimovane arhive pravi sprega tar+gzip.
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 5 / 13
- Arhiviranje: cpio (copy in and out)
- cpio sluţi za:
- arhiviranje datoteka u cpio formate arhiva
- prenos čitavih stabala datoteka sa jednog mesta na drugo.
- cpio ima 3 načina rada (specificiraju se obaveznom komandom i,o ili p):
- copy-out: cpio arhivira datoteke, odnosno kopira ih u arhivu.
- cpio -o[opcije] >arhiva <lista
- Parametar lista je tekstualna datoteka, u kojoj je u svakoj liniji navedena jedna datoteka.
- cpio se moţe spregnuti sa find ili ls koje će kreirati listu datoteka za cpio komandu
- copy-in: cpio vadi datoteke iz arhive
- cpio -i[opcije] <arhiva
- Ukoliko se navedu pojedinačne datoteke onda će samo one biti raspakovane iz arhive.
- Specijalan oblik (copy-test) koji lista sadrţaj arhive je: cpio -it[opcije] <archiva
- copy-pass: cpio kopira datoteke u odredišni direktorijum
- Datoteke pobrojane u datoteci lista kopiraju se u odredišni direktorijum:
- cpio -p[opcije] /odredišni_direktorijum <lista
- VAŢNA NAPOMENA: Tar NE MOŢE da arhivira nodove. Tar format se ne moţe koristiti za specijalne datoteke (blok ili karakter uređaji) Cpio MOŢE da arhivira i kopira nodove.
- GNU cpio program podrţava rad sa tar arhivom. Prilikom ekstrakcije iz arhive cpio automatski prepoznaje tip arhive.
- Opcije:
- -A datoteke se dodaju na kraj arhive (opcija funkcioniše jedino u izlaznom reţimu rada)
- -B veličina ulazno-izlaznog bloka postavlja se na 512x10=5120 bajtova. U protivnom, komanda radi sa blokom veličine 512 bajtova, što negativno utiče na performanse
- -c isto što i "-H newc", koristi se novi SVR4 format arhive
- -C IOSIZE veličina ulazno-izlaznog bloka postavlja se na IO-SIZE bajtova
- -d direktorijumi se kreiraju uvek kada je to potrebno
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 6 / 13
- -F file zadaje se ime arhive, što je ekvivaletno sa >file
- -m vreme poslednje modifikacije se čuva prilikom kreiranja novih datoteka
- -t copy-test mode, odnosno listanje sadrţaja arhive (radi samo u ulaznom reţimu)
- -u bezuslovno kopiranje/arhiviranje. Do transfera dolazi bez obzira koja je datoteka novija
- -v obezbeđuje prikazivanje statusa, odnosno prikazuje datoteke koje se kopiraju
- -H FRMT specificiranje formata arhive: bin (stari binarni format), newc (novi prenosivi SRV4 format koji podrţava sisteme datoteka sa više od 65536 i-node čvorova), crc (novi prenosivi SRV4 format sa proverom ispravnosti zapisa), tar (stari tar format), ustar (POSIX.1 tar format).
- Kako se koristi cpio?
- U copy-out reţimu, cpio kreira arhivu i kopira datoteke u nju, npr: cpio –ocvB >arh1 <lista1
- copy-out reţim (–o), arhiva se kreira u vidu datoteke pod imenom arh1, u arhivu se kopiraju sve datoteke navedene u datoteci lista1, na ekranu prikazuju poruke o izvršenju komande (-v). Koristi se podrazumevani bin format, a veličina I/O bloka je 5120 bajtova (-B).
- U copy-in reţimu, cpio lista arhivu ili kopira jednu ili više datoteka iz arhive u FS, npr: cpio –iv <arh1
- copy-in reţim (-i), ekstrakcija svih datoteka iz arhive arh1, na ekranu se prikazuju poruke o izvršenju komande.
- Oblik komande koji se preporučuje za copy-in reţim: cpio –ic(t)vd(u)mB <arhiva
- Flegovi t i u se zadaju po ţelji, a ostali argumenti se gotovo redovno koriste.
- Primer copy-test reţima (listanje sadrţaja arhive, argument –it): cpio –itv <arh1
- U copy-pass reţimu, cpio kopira datoteke u odredišni direktorijum, pri čemu se direktorijumi kopiraju
- rekurzivno, odnosno po dubini. Na primer: cpio –pdumv /home/jsmith/new <lista2
- U ovom primeru datoteke koje su pobrojane u datoteci lista2 kopiraju se na direktorijum /home/jsmith/new, kopiranje je bezuslovno (fleg u), komanda prikazuje poruke o izvršenju na ekranu (fleg v), a vreme poslednje modifikacije datoteka se čuva (fleg m).
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 7 / 13
- Korišćenje cpio povezano sa ls ili find:
- arhiviranje svih datoteka sa tekuće grane u arh1: ls -1 | cpio –ocvB >arh1
- arhiviranje celog direktorijuma dir1 u arh1: find dir1 -print | cpio –ocvB >arh2
- alternativni oblik prethodne komande: find dir1 -cpio -ocvB >arh2
- Praktični zadaci
- 1. Pripremite sistem za rad
- Kreirajte novi korisnički nalog koristeči "User Accounts" ili iz odgovarajuće shell komande. Parametri su sledeći:
- username: smer_brojIndeksa (npr: nrtd912)
- password: 1Password2
- full name: Vaše ime
- home direktorijum: /home/smer_brojIndeksa (npr: /home/ nrtd912)
- shell: /bin/bash
- Odjavite se sa sistema.
- Prijavite se na sistem kao novokreirani korisnik.
- Pokrenite terminal.
- 2. tar: kreiranje i uslovno/bezuslovno ažuriranje arhive
- Na home direktorijumu treba napraviti tri datoteke (a.a, b.b i c.c) i upisati neki tekst u njih. Zatim se ove tri datoteke arhiviraju u simulacionu datoteku proba.tar. Nakon kreiranja arhive, izlistati sadrţaj arhive pomoću tar tvf komande. Zatim se sa postojećom arhivom demonstrira komanda za aţuriranje u i komanda za dodavanje na kraj r. Najpre će se isprobati –u (update) komanda u dva slučaja: u prvom slučaju ukoliko su sve datoteke (a.a, b.b i c.c) nepromenjene, a u drugom slučaju ukoliko se promeni sadrţaj samo jedne datoteke, na primer a.a. Potom će se isprobati r komanda, dodavanjem nepromenjene datoteke b.b komandom –r (append). Obratititi paţnju gde se u arhivi nalaze nove datoteke!
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 8 / 13
- Na svom home direktorijumu pripremite tri datoteke koje ćete arhivirati:
- cd
- ls -l / >a.a
- cp /etc/passwd b.b
- cp /etc/hosts c.c
- Kreirajte arhivu i u nju dodajte te tri datoteke: tar cvf proba.tar a.a b.b c.c
- Izlistajte sadrţaj arhive: tar tvf proba.tar
- Pokušajte da aţurirate arhivu sa nepromenjenom datotekom: tar uvf proba.tar a.a
- Izlistajte sadrţaj arhive: tar tvf proba.tar
- Da li je transfer izvršen, tj. da li je u arhivi nešto promenjeno? [1.]
- Promenite sadrţaj datoteke a.a komandom: cp /etc/fstab a.a
- Aţurirajte arhivu sa datotekom sa promenjenim sadrţajem: tar uvf proba.tar a.a
- Izlistajte sadrţaj arhive: tar tvf proba.tar
- Odredite gde se u arhivi nalazi datoteka a.a sa novim sadrţajem. Da li je stara datoteka a.a izbrisana? [2.]
- Bezuslovno dodajte identičnu datoteku u arhivu: tar rvf proba.tar b.b
- Izlistajte sadrţaj arhive: tar tvf proba.tar
- Obrišite datoteku c.c sa tekućeg direktorijuma: rm c.c
- Izvucite datoteku c.c iz arhive: tar xvf proba.tar c.c
- Obrišite datoteke: rm a.a b.b c.c proba.tar
- Zaključak:
- datoteka se uvek dodaje isključivo na kraj arhive
- komanda -u dodaje datoteke pod uslovom da su izmenjene,
- komanda -r uvek dodaje datoteke, bez obzira na to da li su izmenjene ili ne.
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 9 / 13
- 3. tar: ekstrakcija datoteka iz arhive
- Prilikom ekstrakcije, ime datoteke mora da se navede onako kako je navedeno u arhivi, uključujući i putanju ukoliko je ima. Datoteka se zove a, ali se u arhivi nalazi sa putanjom svoje roditeljske grane dir1. Primer ilustruje bezuspešan pokušaj ekstrakcije datoteke a po imenu, i uspešan pokušaj ekstrakcije iste datoteke sa navođenjem putanje pre imena.
- Pripremite datoteke:
- cd
- mkdir dir1
- cp /etc/fstab dir1/a.a
- cp /etc/passwd dir1/b.b
- cp /etc/hosts dir1/c.c
- Napravite arhivu i u nju dodajte datoteke: tar cvf proba1.tar dir1/a.a dir1/b.b dir1/c.c
- Uklonite originalne datoteka: rm dir1/*
- Probajte da izvučete datoteku a iz arive bez navođenja putanje: tar xvf proba1.tar a.a
- Jeste li uspeli u tome? [3.] Izlistajte sadţaj direktorijuma dir1: ls –l dir1
- Probajte sad to isto, ali navedite putanju: tar xvf proba1.tar dir1/a.a
- Jeste li uspeli u tome? [4.] Izlistajte sadţaj direktorijuma dir1: ls –l dir1
- Obrišite direktorijum dir1: rm -rf dir1
- 4. tar: arhiviranje celog direktorijuma
- Za arhiviranje celog direktorijuma dovoljno je navesti ime direktorijuma u listi datoteka tar komande, a tar će arhivirati čitavo stablo po dubini sa svim pripadajućim datotekama. Za potrebe ovog primera potrebno je na home direktorijumu napraviti direktorijum dir1 i u njemu tri datoteke (a.a, b.b i c.c). Arhivirati ceo direktorijum dir1 u simulacionu datoteku arh1.tar. Obrisati dir1 sa home direktorijuma, a potom raspakovati arhivu arh1. Kreirati dir2 na home direktorijumu, preći na dir2 i u njemu raspakovati arhivu arh1. Pogledati gde su datoteke raspakovane.
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 10 / 13
- Priprema direktorijuma i datoteka:
- cd
- mkdir dir1
- cp /etc/fstab dir1/a.a
- cp /etc/passwd dir1/b.b
- cp /etc/hosts dir1/c.c
- Arhiviranje celog direktorijuma: tar cvf arh1 dir1
- Izlistajte sadrţaj arhive: tar tvf arh1
- Obrišite original: rm dir1/*
- Ekstrakcija celog direktorijuma: tar xvf arh1 dir1
- Ekstrakcija celog direktorijuma na drugo mesto (dir2):
- mk dir2
- cd dir2
- tar xvf ../arh1 dir1
- Pregledajte kako su raspakovane datoteke:
- cd
- ls -l dir1
- ls -l dir2
- ls -l dir2/dir1
- Obrišite direktorijume dir1 i dir2: rm -rf dir1 dir2
- Zaključak:
- prilikom ekstrakcije arhive treba obratiti paţnju na tekuću poziciju, odnosno tekući direktorijum.
- direktorijumi koje arhiva sadrţi biće kreirani u njemu, ukoliko tamo već ne postoje
- u novonastale (i/ili postojeće) direktorijume biće raspakovane odgovarajuće datoteke
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 11 / 13
- 5. tar: arhiviranje i gzip kompresija
- Za potrebe ovog primera na home direktorijumu treba napraviti tri datoteke (a.a, b.b i c.c). Arhivirati ih u simulacionu datoteku proba.tar bez kompresije, potom u simulacionu datoteku proba.tar.Z uz korišćenje programa compress, i na kraju u simulacionu datoteku proba.tar.gz uz korišćenje programa gzip. Uporediti veličine novonastalih arhiva. Obrisati datoteke a.a, b.b i c.c i raspakovati jednu kompresovanu arhivu.
- Priprema datoteka:
- cd
- cp /etc/fstab a.a
- cp /etc/passwd b.b
- cp /etc/hosts c.c
- Kreiranje arhiva bez kompresije: tar cf proba.tar a.a b.b c.c
- Kreiranje arhiva sa gzip programom: tar cfz proba.tar.gz a.a b.b c.c
- Izlistajte sadrţaj direktorijuma i uporedite veličine arhiva: ls -l
- Obrišite polazne datoteke: rm a.a b.b c.c
- Ekstrakcija datoteka iz komprimovane arhive: tar xvfz proba.tar.gz
- Obrišite datoteke i arhive: rm a.a b.b c.c proba.*
- 6. cpio: copy-in i copy-out (kreiranje arhive, listanje i ekstrakcija)
- Na home direktorijumu treba napraviti tri datoteke (a.a, b.b i c.c) i upisati neki tekst u njih. Zatim se kreira lista datoteke lista1 koja će sadrţati te tri datoteke, a potom se na bazi liste obavi arhiviranje u datoteku proba1. Nakon toga treba obrisati datoteke a.a, b.b, c.c i lista1. Arhivu treba testirati, a zatim je raspakovati.
- Priprema datoteka:
- cd
- cp /etc/fstab a.a
- cp /etc/passwd b.b
- cp /etc/hosts c.c
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 12 / 13
- Kreiranje liste:
- cat >lista
- a.a
- b.b
- c.c
- <CTRL-D>
- Kreiranje arhive (copy-out): cpio –ocvB >proba1 <lista1
- Brisanje datoteka koje ste arhivirali: rm a.a b.b c.c lista1
- Testiranje arhive (copy-test): cpio –itvB <proba1
- Ekstrakcija kompletne arhive: cpio –ivB <proba1
- Provera šta je izvađeno iz arhive: ls -l
- Obrišite sve što ste napravili: rm a.a b.b c.c proba1
- 7. cpio: cpio, ls i find
- Na home direktorijumu treba napraviti tri datoteke (a.a, b.b i c.c) i upisati neki tekst u njih. Datoteke treba arhivirati u arhivu proba2 pomoću pipeline mehanizma komande ls i cpio, a zatim u arhivu proba3 pomoću pipeline mehanizma komandi find i cpio.
- Priprema datoteka:
- cd
- cp /etc/fstab a.a
- cp /etc/passwd b.b
- cp /etc/hosts c.c
- Kreiranje arhive (pipeline ls i cpio): ls -1 | cpio –ocvB >proba2
- Kreiranje arhive (pipeline find i cpio): find . –print | cpio –ocvB >proba3
- Listanje sadrţaja arhiva:
- cpio –itvB <proba2
- cpio –itvB <proba3
- Obrišite sve što ste napravili: rm a.a b.b c.c proba2 proba3
- OS2 NRTD, Veţba 3 - ARHIVIRANJE I BACKUP
- © Borislav Đorđević, Borislav Krneta, Mina Kamberović, VIŠER 2014.
- Strana 13 / 13
- 8. cpio: kopiranje direktorijuma u copy-pass režimu
- Na home direktorijumu treba kreirati dva direktorijuma dir1 i dir2, a u direktorijumu dir1 poddirektorijum dir1/dir11. Zatim kreirati datoteke dir1/a.a i dir1/dir11/b.b. Kopirati u copy-pass reţimu sadrţaj direktorijuma dir1 u dir2 i rekurzivno izlistati sadrţaj direktorijuma dir2.
- Kreiranje direktorijuma i datoteka:
- cd
- mkdir –p dir1/dir11 dir2
- cp /etc/fstab dir1/a.a
- cp /etc/hosts dir1/dir11/b.b
- pređite na dir1: cd dir1
- copy-pass reţim: find * –print | cpio –pdum ~/dir2
- Listanje dir2: ls –R ~/dir2
- Da li je cpio iskopirao kompletnu direktorijumsku strukturu? [5.]
- 9. Cleaning and housekeeping.
- Prijavite se na sistem OS2. Pokrenite terminal. Obrišite korisnika korisnik i njegov lični direktorijum:
- userdel smer_brojIndeksa (npr: nrtd912)
- rm -rf /home/smer_brojIndeksa (npr: /home/ nrtd912)
- Ugasite virtuelnu mašinu.
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 1 / 20
- Uvod
- U prethodnom semestru obradili smo primere za sistemske pozive open, read, write, lseek. U
- ovom predavanju daćemo dopunu sa primerima za sledeće sistemske pozive za:
- vektorsko čitanje i pisanje (writev, readv)
- brzi prenos podataka (sendfile)
- čitanje sadržaja simboličkih linkova (readlink)
- zaključavanje datoteka (fcntl)
- prikazivanje informacija iz i-node strukture datoteke (stat)
- proveru prava pristupa (access)
- Vektorsko čitanje i pisanje
- Poziv write uzima kao argumente
- deskriptor datoteke u koju se upisuje
- pokazivač na početak bafera podataka
- dužinu tog bafera
- Poziv write upisuje kontinualnu oblast memorije u deskriptor datoteke. Program će ponekad trebati da zapiše nekoliko stavki podataka, a svaka se nalazi u različitim delovima memorije. Da bi koristio jedan write poziv, program mora ili da kopira sve stavke podatka u kontinualni deo memorije, a to dovodi do dodatnih CPU-memorijskih ciklusa, ili bi program morao da napravi više write poziva, što je takoĎe neefikasno.
- Za neke aplikacije, višestruki write pozivi su neefikasni ili nepoželjni. Na primer, kada pišemo na mrežni soket, dve write funkcije mogu da pruzrokuju da dva paketa budu poslata kroz mrežu, a ti isti podaci, mogu biti poslati u jednom paketu, preko jednog poziva write.
- Poziv writev omogućava vam da više diskontinualnih regiona memorije upišete u deskriptor datoteke u jednoj operaciji. Ovo se naziva vektorsko pisanje (vector write). Ono što treba dodatno da uradimo, prilikom korišćenja poziva writev, je to da moramo da podesimo strukturu podataka, specificiranjem početka i dužine svakog dela memorije. Ova struktura podataka se naziva niz (array)
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 2 / 20
- elemenata strukture iovec. Svaki element specificira jedan deo memorije za upis, pri čemu polja iov_base i iov_len odreĎuju početnu adresu dela memorije i njenu dužinu. Ako unapred znate kolika vam oblast treba, možete prosto da deklarišete niz promenljivih strukture iovec; ako broj regiona može da varira, onda morate da dodelite dinamički niz.
- Ulazni parametri funkcije writev su:
- deskriptor datoteke u koju se upisuje
- niz elemenata strukture iovec
- broj elemenata u nizu
- Povratna vrednost je ukupan broj upisanih bajtova.
- Program write-arg.c (listing 1) upisuje argumente sa komandne linije u datoteku, koristeći jedan writev poziv. Prvi argument je ime datoteke, a drugi i svi ostali argumenti se upisuju u datoteku sa tim imenom, i to svaki u posebnom redu. Program alocira niz sa elementima structure iovec koji je ima duplo više elemenata od broja argumenata koji se upisuju – za svaki argument program upisuje tekst svojih argumenata, kao i karakter za novi red. Pošto ne znamo unapred broj argumenata, niz se alocira korišćenjem funkcije malloc. #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/uio.h> #include <unistd.h> int main (int argc, char* argv[]) { int fd; struct iovec* vec; struct iovec* vec_next; int i; /* Trebaće nam "bafer" koji sadrži karaktere za novi red. Koristite uobičajene char promenljive za to */ char newline = '\n'; // Prvi argument u komandnoj liniji je ime datoteke
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 3 / 20
- char* filename = argv[1]; /* Preskačemo prva dva elementa sa liste argumenata. Element 0 je ime programa, a element 1 je ime datoteke */ argc -= 2; argv += 2; /* Dodeljivanje niza elemenata iovec. Trebaju nam po dva za svaki element liste argumenata, jedan za sam text, a drugi za novi red */ vec = (struct iovec*) malloc (2*argc*sizeof (struct iovec)); // Petlja preko liste argumenata, pravljenje iovec upisa vec_next = vec; for (i = 0; i < argc; ++i) { // Prvi element je tekst samog argumenta vec_next->iov_base = argv[i]; vec_next->iov_len = strlen (argv[i]); ++vec_next; /* Drugi red je jedan karakter za novi red. U redu je ako višestruki elementi iz niza struktura iovec pokazuju na isti deo memorije*/ vec_next->iov_base = &newline; vec_next->iov_len = 1; ++vec_next; } // Pisanje argumenata u datoteku fd = open (filename, O_WRONLY | O_CREAT); writev (fd, vec, 2 * argc); close (fd); free (vec); return 0; }
- Listing 1 (write-arg.c) Pisanje liste argumenata u datoteku koristeći writev
- Prevedite program i pokrenite ga navodeći output file kao argument.
- $ gcc –o write-arg write-arg.c
- $ ./write-arg outputfile "bora" "marko" "dragan" "nemanja"
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 4 / 20
- Deklarišemo izlaznu datoteku pod imenom outputfile i tri tekstualna niza koji su ulazni argumenti za writew funkciju.
- Rezultat izvršavanja programa je:
- $ cat outputfile
- bora
- marko
- dragan
- nemanja
- Brzi prenosi podataka
- Sistemski poziv sendfile, omogućava efikasan mehanizam kopiranja podataka iz jednog deskriptora datoteke u drugi. Deskriptori mogu biti otvoreni za disk datoteke, sokete ili druge ureĎaje.
- Da bi se kopiralo iz jednog deskriptora datoteke u drugi, program dodeljuje bafer fiksne veličine, kopira neke podatke iz jednog deskriptora u bafer, a zatim iz istog bafera, upisuje u drugi deskriptor, a to ponavlja sve dok svi podaci ne budu kopirani. Ovo je neefikasno i po pitanju vremena i prostora, zato što zahteva dodatnu memoriju za bafer i pravi suvišnu kopiju podataka u baferu.
- Korišćenjem funkcije sendfile, posrednički bafer se eliminiše.
- Poziv sendfile ima sledeće ulazne parametre:
- deskriptor datoteke u koji treba da se upisuje
- deskriptor datoteke sa koga se čita
- pokazivač za promenljivu pomeraja (offset), koja ukazuje odakle treba da počne iz ulazne datoteke
- broj bajtova koje treba prebaciti.
- Pomeraj (offset) promenljiva sadrži pomeraj u ulaznoj datoteci od koga čitanje treba da počne (0 označava početak datoteke) i ova promenljiva se ažurira se na poziciju u datoteci, nakon transfera. Vrednost koju sendfile vraća je broj prebačenih bitova. Uključite <sys/sendfile.h> u vaš program
- ako se koristi funkcija sendfile.
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 5 / 20
- Program copy.c (listing 2) je jednostavna ali veoma efikasna primena kopiranja datoteka.
- Kada se ovaj program pozove sa dva imena za datoteke na komandnoj liniji, program kopira sadržaj prve datoteke u drugu. Program koristi fstat da odredi veličinu izvorne tj. prve datoteke u bajtovima. #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <sys/sendfile.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int main (int argc, char* argv[]) { int read_fd; int write_fd; struct stat stat_buf; off_t offset = 0; // Otvaranje ulazne datoteke read_fd = open (argv[1], O_RDONLY); // Dobijanje veličine ulazne datoteke fstat (read_fd, &stat_buf); /*Otvaranje izlazne datoteke za upis, sa istim dozvolama kao za ulaznu datoteku*/ write_fd=open(argv[2], O_WRONLY | O_CREAT, stat_buf.st_mode); // Brzo kopiranje sendfile (write_fd, read_fd, &offset, stat_buf.st_size); // Zatvaranje datoteka close (read_fd); close (write_fd); return 0; }
- Listing 2 (copy.c) Kopiranje datoteke pomoću sendfile
- Prevedite i pokrenite program.
- $ gcc –o copy copy.c
- $ ./copy /etc/termcap /tmp/termcap.1
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 6 / 20
- Deklarišemo ulaznu datoteku /etc/termcap i izlaznu datoteku /tmp/termcap.1. Prva datoteka predstavlja nešto veću datoteku na operativnom sistemu Linux, a /tmp direktorijum je izabran zato što korisnik tamo ima pravo da upisuje svoje datoteke.
- Rezultat izvršavanja programa je:
- $ ls –l /tmp/termcap.1
- Videćete novokreiranu datoteku termcap.1 koju je kreirao sistemski poziv sendfile. Uporedite vremena. Prvo ćemo obrisati datoteku:
- $ rm /tmp/termcap.1
- Merimo vreme za klasičnu cp komandu
- $ time cp /etc/termcap /tmp/termcap.1
- Potom ćemo ponovo obrisati datoteku
- $ rm /tmp/termcap.1
- Merimo vreme za klasičnu copy program koji koristi sendfile sistemski poziv
- $ time ./copy /etc/termcap /tmp/termcap.1
- Uporedite ta dva vremena.
- Sistemski poziv sendfile može biti iskorišćen na mnogim primenama da bi se kopiranje učinilo efikasnijim. Jedan dobar primer je na Web serveru ili nekom drugom mrežnom daemonu, koji prenosi sadržaj datoteke, preko mreže do klijent programa. Zahtev se obično prima sa soketa klijent-kompjutera. Server program otvara lokalnu datoteku da bi dobio podatke i upisuje sadržaj datoteke na mrežni soket. Korišćenje funkcije sendfile može znatno da ubrza ovu operaciju. Treba preduzeti i druge korake da bi se mrežni transfer učinio što efikasnijim, kao što je pravilno postavljanje soket parametara. Ali ovo je van teme ove lekcije.
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 7 / 20
- Čitanje sadržaja simboličkih linkova
- Sistemski poziv readlink obezbeĎuje ime objekta na koji pokazuje simbolički link. Uzima tri argumenta:
- putanju do simboličkog linka
- bafer koji prima putanju do datoteke na koju pokazuje link, original datoteke (target)
- dužinu tog bafera.
- Poziv readlink ne stavlja null karakter (‘\0’) koji označava kraj stringa, u ovom slučaju u bafer, koji sadrži ime originalne datoteke (target). Ali umesto toga, readlink vraća broj karaktera koji upisuje u bafer, tako da je upis oznake kraja bafera krajnje jednostavan (samo dodate nulu).
- Ako prvi argument za readlink pokazuje na datoteku koja nije simbolički link, readlink postavlja vrednost errno na EINVAL i vraća vrednost -1.
- Program print-symlink.c (listing 3) prikazuje put do datoteke na koju pokazuje simbolički link (simbolički link se unosi preko komandne linije). #include <errno.h> #include <stdio.h> #include <unistd.h> int main (int argc, char* argv[]) { char target_path[256]; char* link_path = argv[1]; // Pokušaj da se pročita ono na šta pokazuje simbolički link int len = readlink (link_path, target_path, sizeof (target_path)); if (len == -1) { // Poziv je propao if (errno == EINVAL) // Ovo nije simbolički link fprintf (stderr, "%s nije simbolicki link\n", link_path); else // U pitanju je drugi problem; ispisi generičku poruku perror ("readlink"); return 1; }
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 8 / 20
- else { // Niz target_path se mora završiti NULL karakterom target_path[len] = '\0'; printf ("%s\n", target_path); // Ispišite je return 0; } }
- Listing 3 (print-symlink.c) Prikaz puta do datoteke na koju pokazuje simbolički link
- Prevedite program:
- $ gcc –o print-symlink print-symlink.c
- Evo primera kako možete napraviti simbolički link i iskoristiti program print-symlink da ga pročitate: $ ln -s /usr/bin/wc my_link
- $ ./print-symlink my_link
- /usr/bin/wc
- Zakjučavanje
- Sistemski poziv fcntl je način da se pristupi nekim naprednim operacijama na deskriptorima datoteka. Prvi argument za fcntl je deskriptor otvorene datoteke, a drugi je vrednost koja označava koja operacija treba da bude izvršena. Za neke operacije, fcntl uzima dodatni argument. Ovde ćemo opisati jednu od najkorisnijih fcntl operacija, zaključavanje datoteka (file locking). Pogledajte fcntl man stranu, za informacije o ostalim operacijama.
- Fcntl sistemski poziv omogućava programu da postavi zaključavanje za čitanje (read-lock) ili zaključavanje za upis (write-lock) na datoteku, što je u nekoj meri slično mutex semaforima. Zaključavanje za čitanje (read lock) se postavlja na deskriptor datoteke sa koga se može čitati, a zaključavanje za upis (write-lock) se postavlja na deskriptor datoteke u koji se može pisati. Više od jednog procesa može držati zaključavanje za čitanje (read-lock) na istoj datoteci u isto vreme, ali samo jedan proces može držati zaključavanje za upis (write-lock). Ista datoteka ne može biti zatvorena (zaključan) i za čitanje i za pisanje.
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 9 / 20
- Zapamtite da zaključavanje zapravo ne sprečava ostale procese od otvaranja datoteke, čitanja iz nje ili pisanja po njoj, sem ako i oni takoĎe ne traže zaključavanje sa fcntl.
- Da bi se postavilo zaključavanje (lock) na datoteku, prvo napravite i anulirajte strukturu flock. Postavite l_type polje strukture na F_RDLCK za zaključavanje za čitanje (read-lock) ili F_WRLCK za zaključavanje za upis (write-lock). Zatim pozovite fcntl, sa tri ulazna argumenta:
- deskriptor te datoteke
- F_SETLCKW je operacijski kôd
- pokazivač na struct flock promenljivu.
- Ako neki drugi proces drži zaključavanje koje sprečava primenu novog zaključavanja, fcntl se blokira dok se to zaključavanje ne ukloni.
- Program lock-file.c (listing 4) otvara datoteku za pisanje, a njeno ime se daje u komandnoj liniji, a onda se zaključavanje za upis (write-lock) postavlja na tu datoteku. Program čeka da korisnik pritisne taster <enter>, a onda otključava i zatvara datoteku. #include <fcntl.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main (int argc, char* argv[]) { char* file = argv[1]; int fd; struct flock lock; printf ("Otvaranje datoteke %s\n", file); // Otvaranje deskriptora datoteke. fd = open (file, O_WRONLY); printf ("Zakljucavanje\n"); // Inicijalizacija flock strukture. memset (&lock, 0, sizeof(lock)); lock.l_type = F_WRLCK; // Postavljanje zabrane pisanja (write lock) na datoteku. fcntl (fd, F_SETLKW, &lock);
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 10 / 20
- printf ("Zakljucano! Pritisni Enter za otkljucavanje... "); // Čeka na Enter. getchar (); printf ("Otključavanje\n"); // Otključavanje lock.l_type = F_UNLCK; fcntl (fd, F_SETLKW, &lock); close (fd); return 0; }
- Listing 4 (lock-file.c) Postavlja zabranu pisanja korišćenjem fcntl
- Prevedite i pokrenite program navodeći ime datoteke /tmp/test-file kao argument:
- $ gcc -o lock-file lock-file.c
- $ touch /tmp/test-file
- $ ./lock-file /tmp/test-file
- Otvaranje datoteke /tmp/test-file
- Zakljucavanje
- Zakljucano! Pritisni Enter za otkljucavanje...
- Onda u drugom prozoru pokušajte da pokrenete lock-file, ponovo na istoj datoteci.
- $ ./lock-file /tmp/test-file
- Otvaranje datoteke /tmp/test-file
- Zakljucavanje
- Primetimo da je druga instanca blokirana dok pokušava da zaključa datoteku. Vratite se na prvi prozor i pritisnite Enter. Dobićete poruku:
- Otključavanje
- Program koji je otvoren u drugom prozoru odmah dobija šansu da obavi zaključavanje za upis (write-lock).
- Ako želite da se fcntl ne blokira, ako poziv ne može da dobije zaključavanje koji ste tražili, koristite F_SETLK umesto F_SETLKW. Ako se zaključavanje ne može postići, fcntl odmah vraća –1.
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 11 / 20
- Linux obezbeĎuje još jednu primenu zaključavanja datoteka pozivom flock. Primena fcntl ima jednu veliku prednost: radi sa NFS datotekama (ukoliko je NFS server relativno nov i ispravno konfigurisan). Ako imate pristup preko dve mašine koje aktiviraju isti sistem datoteka preko NFS, možete ponoviti prethodni primer koristeći dve različite mašine. Pokrenite lock-file na jednoj mašini, specificirajući datoteku na NFS i pokrenite ga ponovo na drugoj mašini, specificirajući istu datoteku. NFS budi drugi program kada se zaključavanje na upis oslobodi, od strane prvog programa.
- Informacije iz i-node strukture datoteke
- Korišćenjem poziva open i read, možete videti sadržaj datoteke. Ali šta je sa ostalim informacijama? Na primer, pozivanje ls -l prikazuje, informacije kao što su veličina datoteke, poslednje promene u datoteci, dozvole i vlasnika datoteke.
- Funkcija stat nam daje te informacije o datoteci. Funkcija stat ima dva ulazna argumenta:
- putanja (path) do datoteke koji vas zanima
- pokazivač na promenljivu tipa struct stat
- Ako stat odradi sve uspešno, onda vraća vrednost 0 i popunjava polja sa informacijama o
- datoteci, u suprotnom, stat vraća vrednost -1.
- Ovo su najkorišćenija polja u strukturi stat:
- st_mode sadrži prava pristupa te datoteke.
- kao dodatak na prava pristupa, st_mode koduje tip datoteke u svojim višim bitovima.
- st_uid i st_gid sadrze ID vlasnika datoteke i grupe kojoj datoteka pripada.
- st_size sadrži veličinu datoteke, u bajtovima.
- st_atime sadrži vreme kada je poslednji put bilo pristupano toj datoteci (pisanje ili čitanje)
- st_mtime sadrži vreme kada je ta datoteka poslednji put bila promenjena.
- Ovi makroi proveravaju vrednost polja st_mode da bi odredili koju vrstu tj. tip datoteke je analizirao vaš sistemski poziv stat. Makro ocenjuje da je to istina (true, tj. 1), ako je datoteka odreĎenog tipa.
- S_ISBLK (mode) - blok ureĎaj
- S_ISCHR (mode) - karakter ureĎaj
- S_ISDIR (mode) - direktorijum
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 12 / 20
- S_ISFIFO (mode) - fifo
- S_ISLNK (mode) - simbolički link
- S_ISREG (mode) - regularna datoteka
- S_ISSOCK (mode) - soket
- Polje st_dev sadrži glavni (major) broj i sporedni (minor) broj hardverskog ureĎaja, preciznije drajvera, kojima blok ili karakter datoteka odgovara. Glavni (major) broj ureĎaja se pomera ulevo za osam bitova, a sporedni (minor) broj ureĎaja, obuhvata osam najmanje značajnih bitova. Polje st_ino sadrži inode broj datoteke, pri čemu inode locira datoteku u sistemu datoteka.
- Ako pozovete stat na simbolički link, stat prati link i vi možete dobiti informacije o datoteci na koji taj link pokazuje, ali ne i o samom simboličkom linku. Zbog takvog rada, S_ISLINK nikada neće biti istinit (true) kao rezultat stat. Koristite lstat funkciju, ako ne zelite da pratite simbolički link, zato što ova funkcija dobija informacije o samom linku a ne o njenom originalu. Ako pozovete lstat na datoteku, koja nije simbolički link, onda ona ima isti rezultat kao stat. Pozivanjem funkcije stat, na prekinuti link (link koji pokazuje na nepostojeću ili nepristupačnu originalnu datoteku), kao rezultat se pojavljuje greška, dok se pozivanjem funkcije lstat greška ne prijavljuje.
- Ako već imate otvorenu datoteku za čitanje ili pisanje, pozovite fstat umesto stat. Poziv fstat uzima deskriptor datoteke kao njegov prvi argument umesto putanje.
- Program read-file.c (listing 5) prikazuje funkciju koja alocira dovoljno veliki bafer, da prihvati sadržaj datoteke i onda ga učitava u bafer. Funkcija koristi fstat da odredi veličinu bafera, koja je potrebna za alociranje, a takoĎe se proverava da li je to regularna datoteka. #include <fcntl.h> #include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> /* Učitava sadržaj FILENAME u novododeljeni bafer. Veličina bafera je sačuvana u *LENGTH. Vraća bafer, koji korisnik mora da isprazni. Ako makro ne odgovori da je datoteka regularna, on vraća NULL vrednost. */ char* read_file (const char* filename)
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 13 / 20
- { int fd; struct stat file_info; char* buffer; size_t* length = malloc(sizeof(size_t)); // Otvara datoteku fd = open (filename, O_RDONLY); // Uzimanje informacija o datoteci fstat (fd, &file_info); *length = file_info.st_size; // Obratite pažnju da li je u pitanju regularna datoteka if (!S_ISREG (file_info.st_mode)) { // Nije, znaci odustani close (fd); return NULL; } // Dodeljivanje dovoljno velikog bafera da primi sadržaj datoteke buffer = (char*) malloc (*length); // Učitavanje datoteke u bafer read (fd, buffer, *length); // Završavanje close (fd); return buffer; } int main(int argc, char *argv[]) { char *filename = argv[1]; char *buffer = read_file(filename); printf("Bafer je:\n%s\n", buffer); }
- Listing 5 (read-file.c) Učitavanje datoteke u bafer
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 14 / 20
- Prevedite program read-file.c
- $ gcc -o read-file read-file.c
- Pokrenite program na test datoteci /etc/hosts:
- $ ./read-file /etc/hosts
- Bafer je:
- 127.0.0.1 localhost
- 172.20.3.100 linux.site linux
- Izlistajte sadržaj datoteke /etc/hosts koristeći naredbu cat i uporedite sadržaj:
- $ ./read-file /etc/hosts
- 127.0.0.1 localhost
- 172.20.3.100 linux.site linux
- Provera prava pristupa datoteci
- Sistemski poziv access odreĎuje da li pozivni proces ima prava pristupa datoteci. Može da proveri bilo koju kombinaciju read, write i execute prava, a takoĎe proverava postojanje datoteke.
- Poziv access ima dva ulazna argumenta.
- Prvi je putanja do datoteke koji treba da se proveri.
- Drugi je bit (bitwise) ili simbolička vrednost R_OK, W_OK i X_OK, koja odgovara read, write, i execute dozvoli.
- Povratna vrednost je 0 ako proces ima sve specificirane dozvole. Ako datoteka postoji, ali pozivni proces nema specificirane dozvole, access vraća –1 i postavlja errno na vrednost EACCES (ili na vrednost EROFS, ako se dozvola za upis proverava za datoteku u read-only sistemu datoteka).
- Ako je drugi argument F_OK, access prosto proverava postojanje datoteke. Ako ona postoji, vrednost koja se vraća je 0; ako ne postoji, ta vrednost je –1 i errno je postavljena na vrednost ENOENT. Zapamtite da errno može biti postavljen na EACCES, ako se bilo kom direktorijumu u putanji datoteke ne može pristupiti.
- Program check-access.c (listing 6) koristi sistemski poziv access da proveri postojanje datoteke i proveri read i write dozvole. Potrebno je u komandnoj liniji dati ime datoteke, koja se proverava.
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 15 / 20
- #include <errno.h> #include <stdio.h> #include <unistd.h> int main (int argc, char* argv[]) { char* path = argv[1]; int rval; // Provera postojanja datoteka rval = access (path, F_OK); if (rval == 0) printf ("%s postoji\n", path); else { if (errno == ENOENT)printf ("%s ne postoji\n", path); else if (errno == EACCES) printf ("ne mogu da pristupim %s \n", path); return 0; } // Provera read dozvola rval = access (path, R_OK); if (rval == 0) printf ("%s moze da se cita\n", path); else printf ("%s ne moze da se cita\n", path); // Proverava write dozvolu rval = access (path, W_OK); if (rval == 0) printf ("U %s moze da se pise\n", path); else if (errno == EACCES) printf ("U %s ne moze da se pise (nema w dozvole)\n", path); else if (errno == EROFS) printf ("U %s ne moze da se pise (read-only FS)\n", path); return 0; }
- Listing 6 (check-access.c) Provera dozvole pristupa datoteci
- Prevedite program check-access.c
- $ gcc -o check-access check-access.c
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 16 / 20
- Pokrenite program na test datoteci /etc/hosts:
- $ ./check-access /etc/hosts
- /etc/hosts postoji
- /etc/hosts moze da se cita
- U /etc/hosts ne moze da se pise (nema w dozvole)
- Na primer, da bi se proverile pristupne dozvole za datoteku README na CD-ROM medijumu, primenite sledeće:
- $ ./check-access /mnt/cdrom/README
- /mnt/cdrom/README postoji
- /mnt/cdrom/README moze da se cita
- U /mnt/cdrom/README ne moze da se pise (read-only FS)
- Rad sa direktorijumima
- Par operacija nad direktorijumima koje mogu da budu korisne su:
- getcwd nam daje trenutni radni direktorijum. Ima dva argumenta, bafer i dužinu tog bafera.
- getcwd kopira putanju trenutnog radnog direktorijuma u bafer.
- chdir menja radni direktorijum u kojem se trenutno nalazite, na putanju koju stavite kao ulazni argument.
- mkdir kreira novi direktorijum. Njegov prvi argument je putanja gde će se nalaziti taj novi direktorijum. Drugi argument su prava pristupa za taj novi direktorijum. Interpretacija prava pristupa je ista kao kod trećeg argumenta za funkciju open i modifikuju se na isti način preko umask procesa.
- rmdir briše direktorijum. Njegov argument je putanja do direktorijuma.
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 17 / 20
- Čitanje sadržaja direktorijuma
- GNU/Linux obezbeĎuje funkcije za čitanje sadržaja direktorijuma. Iako one nisu direktno vezane za U/I funkcije nižeg nivoa, objašnjavamo ih jer su često korisne u raznim aplikativnim programima.
- Da bi pročitali sadržaj direktorijuma, pratite sledeće korake:
- Pozovite opendir funkciju, zadajući putanju direktorijuma koji želimo da ispitamo. Funkcija opendir vraća DIR* identifikator, koji ćete da koristite za pristup sadržaju direktorijuma. Ako se pojavi neka greška, funkcija vraća NULL.
- Pozovite readdir sa ponavljanjem, prosleĎući DIR* identifikator koji ste dobili sa opendir. Svaki put kada pozovete readdir, on vraća pokazivač na strukturu dirent koji odgovara sledećem direktorijumskom ulazu. Kada stignete do kraja sadržaja tog direktorijuma, readdir vraća NULL vrednost. Struktura dirent koju dobijate od funkcije readdir, ima polje d_name, koje sadrži ime direktorijumskog ulaza.
- Pozovite closedir, prosleĎujući DIR* identifikator, da bi završili operaciju listanja.
- Uključite <sys/types.h> i <dirent.h> ako koristite ove funkcije u svom programu.
- Zapamtite da ako želite da sadržaj direktorijuma bude poreĎan u odreĎenom redosledu, to morate sami da uradite.
- Program listdir.c (listing 7) ispisuje sadržaj direktorijuma. Direktorijum može biti zadat u komandnoj liniji, ali ako nije zadat, program koristi trenutni radni direktorijum. Program prikazuje tip i putanju svake datoteke, tj svake stavke u direktorijumu koristeći sistemski poziv lstat funkciji get_file_type. #include <assert.h> #include <dirent.h> #include <stdio.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> // Vraća string koji opisuje tip datoteke
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 18 / 20
- const char* get_file_type (const char* path) { struct stat st; lstat (path, &st); if (S_ISLNK (st.st_mode)) return "simbolicki link"; else if (S_ISDIR (st.st_mode)) return "direktorijum"; else if (S_ISCHR (st.st_mode)) return "karakter uredjaj"; else if (S_ISBLK (st.st_mode)) return "blok uredjaj"; else if (S_ISFIFO (st.st_mode)) return "fifo"; else if (S_ISSOCK (st.st_mode)) return "socket"; else if (S_ISREG (st.st_mode)) return "regularna datoteka"; else // Neocekivano. Mora da bude jedan od navedenih tipova. assert (0); } int main (int argc, char* argv[]) { char* dir_path; DIR* dir; struct dirent* entry; char entry_path[PATH_MAX + 1]; size_t path_len; if (argc >= 2) dir_path = argv[1]; // Ako je direktorijum zadat kao argument, koristite ga else dir_path = "."; // U suprotnom koristi trenutni direktorijum // Kopira putanju direktorijuma u entry_path strncpy (entry_path, dir_path, sizeof (entry_path)); path_len = strlen (dir_path); // Ako se putanja direktorijuma ne završava kosom crtom, ona se dodaje if (entry_path[path_len - 1] != '/') { entry_path[path_len] = '/'; entry_path[path_len + 1] = '\0'; ++path_len; }
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 19 / 20
- // Pocetak operacije listanja direktorijuma dir = opendir (dir_path); while ((entry = readdir (dir)) != NULL) { const char* type; strncpy (entry_path + path_len, entry->d_name, sizeof (entry_path) – path_len); // Određivanje tipa datoteke (stavke u direktorijumu) type = get_file_type (entry_path); // Ispisivanje tipa i punog imena sa putanjom printf ("%-18s: %s\n", type, entry_path); } // Sve gotovo closedir (dir); return 0; }
- Listing 7 (listdir.c) Ispis liste direktorijuma
- Prevedite i izvršite program listdir.c, deklarišite ulaznu datoteku i demonstrirajte sistemske pozive za direktorijume.
- Prevedite program listdir.c i pokrenite ga navodeći direktorijum /dev kao argument.
- $ gcc -o listdir listdir.c
- $ ./listdir /dev
- directory : /dev/.
- directory : /dev/..
- socket : /dev/log
- character device : /dev/null
- regular file : /dev/MAKEDEV
- fifo : /dev/initctl
- character device : /dev/agpgart
- ...
- OS2, Vežba 4 - NAPREDNI SISTEMSKI POZIVI ZA RAD SA DATOTEKAMA
- Strana 20 / 20
- Da bi ovo proverili, možete koristiti komandu ls u istom direktorijumu. Navedite –u infikator da bi naložili ls da ne sortira, i specificirajte –a indikator da bi uzrokovali da trenutni direktorijum (.) i roditeljski direktorijum (..) budu uračunati.
- $ ls -lUa /dev
- total 124
- drwxr-xr-x 7 root root 36864 Feb 1 15:14 .
- drwxr-xr-x 22 root root 4096 Oct 11 16:39 ..
- srw-rw-rw- 1 root root 0 Dec 18 01:31 log
- crw-rw-rw- 1 root root 1, 3 May 5 1998 null
- -rwxr-xr-x 1 root root 26689 Mar 2 2000 MAKEDEV
- prw------- 1 root root 0 Dec 11 18:37 initctl
- crw-rw-r-- 1 root root 10, 175 Feb 3 2000 agpgart
- ...
- Prvi karakter svakog reda koji prikazuje komada ls je tip ulaza.
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- Teoretski deo
- Shell program (shell script) je datoteka koju čini niz Linux komandi koje se mogu izvršavati
- sekvencijalno ili povezati strukturama kao što su uslovni skokovi i petlje.
- Primer shell programa (datoteka ss1 na tekućem direktorijumu):
- # ss1: jednostavan shell program (ovo je komentar)
- clear
- echo "Goodbye, Cruel World !"
- <CTRL-D>
- Pokreće se na jedan od sledeća tri načina
- Ako se skript nalazi u tekućem
- direktorijumu koji nije u
- sistemskoj putanji:
- $ chmod a+x ss1
- $ ./ss1
- Ako se skript nalazi u nekom
- direktorijumu koji jeste u
- sistemskoj putanji (videti echo
- $PATH):
- $ chmod a+x ss1
- $ ss1
- Bez eksplicitnog dodavanja
- prava “x”:
- $ /bin/bash ss1
- Komandni interpreter interpretira i izvršava program (nema compiler-a, linker-a itd...). Program se
- izvršava u:
- komandom interpreteru naznačenom u prvoj liniji programa na sledeći način: #!/bin/bash
- tekućem komandom interpreteru ukoliko ništa nije naznačeno
- Promenljive
- Omogućavaju čuvanje podataka u RAM memoriji. Bash promenljive se ne deklarišu za specifični tip
- podataka - dovoljno je dodeliti vrednost promenljivoj i ona će biti alocirana prema toj vrednosti. U
- Bourne Again Shellu, promenljive mogu sadržavati brojeve, karaktere ili nizove karaktera. Na Linux
- sistemima postoje dva tipa promenljivih:
- sistemske promenljive – OS ih kreira i održava; ne preporučuje se promena njihovog sadržaja;
- definišu se strogo velikim slovima
- korisnički definisane promenljive (User defined) – kreiraju ih korisnici; definišu se malim
- slovima
- Strana 1 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- Sistemske promenljive mogu se videti pomoću komandi:
- set (prikazuje sve promenljive)
- echo $IMEPROMENLJIVE (prikazuje sadrzaj jedne promenljive) – na primer, echo $PATH
- Prilikom dodele vrednosti promenljivim:
- ime promenljive: alfanumeričkim karakterom ili donja crta ‘_' praćeno sa više alfanumeričkih
- karaktera
- imena promenljivih su (kao i imena datoteka) osetljiva na velika i mala slova (case sensitive)
- ime promenljive uvek ide s leve strane znaka jednakosti
- između znaka jednakosti i imena promenljive i znaka jednakosti i vrednosti ne sme biti blanko
- karaktera
- br=10 # ispravno
- 10=br # neispravno - vrednost na levoj strani
- $ br= 10 # neispravno - prazni karakteri
- Vrednost korisnički definisane promenljive se može videti komandom echo, npr: echo $br
- echo
- Prikazuje tekst ili vrednost promenljive na ekranu.
- Sintaksa komande je: echo [opcije] [string, promenljive...]
- Opcija -n znači da se nakon izvršenja echo komande kursor ne prebacuje u novi red
- Opcija -e omogućava interpretaciju sledećih karaktera u kombinaciji sa obrnutom kosom crtom
- Navodnici
- "Double Quotes". Sve što se nalazi u ovim navodnicima gubi originalno značenje (osim \ i $).
- 'Single quotes'. Sve što je zatvoreno jednostrukim navodnicima ostaje nepromenjeno.
- `Back quote`. Izraz zatvoren obrnutim navodnicima tretira se kao komanda koju treba
- izvršavati.
- Strana 2 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- Na primer, ukoliko korisnik želi da na ekranu prikaže tekući datum navešće izraz date sa obrnutim
- navodnicima:
- $ echo "Današnji datum : date" # tretira date kao string
- Today is : date
- $ echo "Današnji datum : `date`" # tretira date kao komandu
- Today is : Fri Apr 2 16:30:35 CEST 2004
- expr
- Naredba expr koristi se da obavi jednostavne aritmetičke operacije.
- Sintaksa komande je: expr op1 operator op2
- op1 i op2 su celi brojevi
- operator: “+” sabiranje, “–” oduzimanje, “\*” množenje1, “/” (deljenje), “%” ostatak po modulu
- op1, op2 i operator moraju da budu razdvojeni blanko karakterima jer su to parametri
- komande.
- Na pimer:
- expr 1 + 3 # ispisuje: 4
- expr 20 % 3 # ispisuje: 2
- echo 6+3=`expr 6 + 3` # ispisuje: 6+3=9
- echo 6+3="expr 6 + 3" # ispisuje: 6+3=expr 6 + 3
- Naredba expr se kao parametar komande echo zadaje u obrnutim navodnicima, a ne u dvostrukim
- ili
- jednostrukim. Samo u tom slučaju echo posmatra expr kao komandu, a ne kao običan string.
- read
- Koristi se za:
- čitanje ulaznih podataka sa tastature i upis unete vrednosti u promenljivu
- ubacivanje prekidnih tačake u program u fazi razvoja radi kontrole izvršavanja
- 1 Za množenje se koristi \*, a ne *, pošto je * džoker
- Strana 3 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- Sintaksa komande read je: read varible1, varible2,...varibleN
- Primer: skript čita ulazni podatak sa tastature u promenljivu var1, a zatim ga ispisuje na ekran.
- echo "Unesite podatak:"
- read var1
- echo "Uneli ste: $var1"
- Prosleđivanje parametara shell skriptu
- Posmatrajte komandu: rm file1 file2 file3
- Ovde je rm ime komande, a argumenti su imena datoteka koje korisnik želi da obriše. Komandni
- argumenti se na isti način mogu zadati i shell programu. Na primer, za shell program scriptus, koji je
- pozvan pomoću sledeće komandne linije, prvi komandni argument je arg1, drugi arg2, a treći arg3:
- scriptus arg1 arg2 arg3
- U shell programu se argumentima komandne linije pristupa pomoću sledećih promenljivih:
- vrednost promenljive $0 je ime programa (u ovom slučaju scriptus)
- vrednost promenljive $1 je prvi komandni argument (u ovom slučaju arg1)
- vrednost promenljive $2 je drugi komandni argument (u ovom slučaju arg2)
- vrednost promenljive $3 je treći komandni argument (u ovom slučaju arg3)
- vrednost promenljive $# je broj komandnih argumenta (u ovom slučaju dva)
- $* se proširuje u `$0,$1,$2...$9` (što je u ovom slučaju arg1, arg2, arg3).
- Na primer:
- # ss3: korišćenje argumenata komandne linije
- echo "Ukupan broj argumenata komandne linije: $#"
- echo "0-ti argument je ime programa $0, a je prvi argument je $1"
- echo "Svi argumenti su redom: $*"
- Strana 4 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- Izlazni status komande
- Nakon izvršenja Linux komande vraćaju vrednost na osnovu koje se može odrediti da li je komanda
- izvršena uspešno ili ne:
- ako je povratna vrednost 0, komanda je izvršena uspešno.
- ako je povratna vrednost različita od 0 (veća od 0), komanda se nije uspešno završila, a broj
- predstavlja neku vrstu dijagnostičkog statusa koja se naziva izlazni status.
- Da bi se odredila ova vrednost koristi se sistemska promenljiva $?
- Konstrukcija if
- U najkompleksnijem obliku sintaksa if komande je:
- if test-commands;
- then
- consequent-commands;
- [elif more-test-commands;
- then
- more-consequents;]
- [else alternate-consequents;]
- fi
- Posmatrajte sledeći program (datoteka proba):
- if rm $1
- then
- echo "Datoteka $1 je uspešno obrisana"
- fi
- Program se pokreće pomoću komande bash proba filename. Ako komanda rm pronađe datoteku
- filename i uspešno je obriše, njen izlazni status je 0, te će se izvršiti naredba ispod then (tj.
- Naredba echo “Datoteka $1 je uspešno obrisana”). U protivnom, izlazni status je različit od 0, i
- komanda se izvršava.
- Strana 5 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- $ bash proba nepostojeca_datoteka
- rm: cannot remove `nepostojeca_datoteka': No such file or directory
- $ bash proba postojeca_datoteka
- Datoteka postojeca_datoteka je uspešno obrisana
- Naredba test
- Posmatrajte i program pozitivan (prikazuje upotrebu naredbe test):
- if test $1 -gt 0
- then
- echo "$1 je pozitivan broj"
- fi
- Program se pokreće komandom: bash pozitivan arg, gde je arg numerička vrednost.
- $ bash ss5 5
- 5 je pozitivan broj
- $ bash ss5 -4
- Pomoću komande test, odnosno [ expr ] mogu se upoređivati celi brojevi, upoređivati nizovi karaktera
- i može se odrediti da li datoteka postoji, da li je regularna, izvršna, itd.
- Sledeći matematički operatori se koriste za upoređivanje celih brojeva:
- Operator Značenje if test if [ ]
- -eq jednakost (5=6) if test 5 -eq 6 if [ 5 -eq 6 ]
- -ne nejednakost (5 != 6) if test 5 -ne 6 if [ 5 -ne 6 ]
- -lt strogo manje od (5<6) if test 5 -lt 6 if [ 5 -lt 6 ]
- -le manje od ili jednako (5<= 6) if test 5 -le 6 if [ 5 -le 6 ]
- -gt strogo veće od (5>6) if test 5 -gt 6 If [ 5 -gt 6 ]
- -ge veće od ili jednako (5>=6) if test 5 -ge 6 If [ 5 -ge 6 ]
- Za upoređivanje nizova koriste se sledeći operatori:
- string1 = string2 da li je niz string1 jednak nizu string2
- Strana 6 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- string1 != string2 da li je niz string1 različit od niza string2
- string1 da li je string1 definisan i ako jeste da li nije NULL
- -n string1 da li string1 nije NULL
- -z string1 da li je string1 NULL
- Komandom test takođe se mogu izvršiti testovi nad datotekama i direktorijumima:
- -s file da li datoteka ima neki sadržaj
- -f file da li datoteka postoji, da li je obična a ne direktorijum
- -d dir da li direktorijum postoji, i da li nije obična datoteka
- -w file da li je datoteka sa pravom upisa
- -r file da li je datoteka bez prava upisa (read-only)
- -x file da li je datoteka izvršna
- Dodatno, u komandi test mogu se koristiti logički testovi za kombinovanje dva ili više uslova
- istovremeno:
- ! expression logička negacija
- exp1 -a exp2 logička AND funkcija
- exp1 -o exp2 logička OR funkcija
- Ostale značajnije konstrukcije i petlje
- case-esac (ilustrovano zadatkom 12)
- while petlja (ilustrovano zadatkom 13)
- until petlja (ilustrovano zadatkom 14)
- for petlja (ilustrovano zadatkom 15)
- select konstrukcija (ilustrovano zadatkom 16)
- Shell proširenja
- Opisujemo samo neka najznačnija shell proširenja; postoje i neka druga proširenja i njih ovde
- preskačemo; o njima ćete naći dosta informacija u knjizi ili na Internetu.
- Proširenje preko zagrada:
- echo a{d,c,b}e
- Strana 7 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- ade ace abe
- Na primer:
- chown root /home/{jsmith/{ss1,ss2},nmacek/{data,ss3}}
- proširuje se u:
- chown root /home/jsmith/ss1
- chown root /home/jsmith/ss2
- chown root /home/nmacek/data
- chown root /home/nmacek/ss3
- Tilda proširenje:
- $ whoami
- jsmith
- $ cd ~/data
- $ pwd
- /home/jsmith/data
- $ cd ~jim
- $ pwd
- /home/jim
- Komandna zamena:
- $ x = `date`
- $ echo $x
- Thu Apr 15 09:53:44 CEST 2004
- $ y = `who am i;pwd`
- $ echo $y
- nmacek pts/0 Apr 15 09:40 (nicotine.internal.vets.edu.yu) /home/nmacek
- Sledeće dve komande ilustruju simpatičnu upotrebu komandne zamene (komande rede identičnu
- stvar, u principu možete da koristite i jedan i drugi način zamene):
- gzip ` find / -name ‘*.bak’ –print `
- gzip $( find / -name ‘*.bak’ –print )
- Strana 8 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- Praktični zadaci
- 1. Pokretanje virtuelne mašinu.
- Kreirajte novi korisnički nalog koristeči "User Accounts" ili iz odgovarajuće shell komande. Parametri
- su sledeći:
- username: smer_brojIndeksa (npr: nrtd912)
- password: 1Password2
- full name: Vaše ime
- home direktorijum: /home/smer_brojIndeksa (npr: /home/ nrtd912)
- shell: /bin/bash
- Odjavite se sa sistema.
- Prijavite se na sistem kao novokreirani korisnik.
- Pokrenite terminal
- 2. Kreiranje shell programa
- Koristeći bilo koji editor teksta (vi, jed, joe, cat>, nano, pico, emacs, ...) napravite jednostavan
- shell program ss1 koji briše sadržaj ekrana i ispisuje jednu rečenicu. Ilustrovaćemo to na primeru jed
- editora.
- zadajte komandu: joe ss1
- unesite sledeći tekst u editor:
- # ss1: jednostavan shell program
- clear
- echo "Moj prvi shell program !"
- snimite datoteku – pritisnite <F10>, otvorite meni File (pritisnite Enter) i odaberite Save
- napustite editor teksta – pritisnite <F10>, otvorite meni File (pritisnite Enter) i odaberite Exit
- Probajte da pokrenete program na sledeće načine i za svaki neuspeli pokušaj objasnite zašto
- program niste uspeli da pokrenete:
- Zadajte komandu: ss1
- Zadajte komendu: ./ss1
- Strana 9 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- Zadajte komandu: bash ss1
- Zadajte sledeće dve komande: chmod +x ss1
- ./ssh1
- Šta znači ako shell-script počinje linijom #!/bin/bash ?
- Obrišite program ss1 komandom: rm ss1
- 3. Sistemske promenljive
- Zadajte sledeću komanu: set | less
- Na osnovu njenog rezultata odredite: tekući komandni interpreter, putanju do vašeg home
- direktorijuma, sistemski putanju, vaše korisničko ime, tekući direktorijum i izraz koji definiše odzivni
- znak.
- Prikažite vrednost promenljive PATH – u čemu je razlika između komandi echo PATH i echo $PATH
- 4. Korisnički definisane promenljive
- Zadajte sledeće četiri komande: (1.) br =10 (2.) br= 10 (3.) br = 10 (4.) br=10
- Objasnite zašto su prve tri komande neispravne.
- Definišite promenljive x i y koje će imati vrednosti 10 i abc respektivno i prikažite njihove vrednosti na
- ekranu u istom redu. Zadajte sledeće komande:
- x=10
- y=abc
- echo $x $y
- Proverite u čemu je razlika između komande echo x i komande echo $x
- 5. Komanda echo i upotreba navodnika
- Zadajte sledeću komanu: echo -e "Linux\n\t\tRulez\n"
- Objasnite čemu služi parametar -e i kontolni karakteri \n i \t ?
- Zadajte sledeće komande i probajte da odredite funkciju obrnutih navodnika:
- date
- echo “Today is : date"
- Strana 10 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- echo 'Today is : `date`'
- echo “Today is : `date`”
- 6. Komanda expr i shell aritmetika
- Odredite kako se komandi expr navode parametri. Zadajte sledeće komande i odredite koja na
- ekranu ispisuje zbir dva broja:
- (1) expr 1+3 (2) expr 1 +3 (3) expr 1+ 3 (4) expr 1 + 3
- Odredite pomoću kojih se navodnika komanda expr pravilno koristi u sprezi sa komandom echo.
- Koja komanda vraća pravi rezultat aritmetičke operacije?
- echo 6+3=`expr 6 + 3`
- echo 6+3="expr 6 + 3"
- Malo složeniji primer upotrebe je ugnežđivanje expr komandi. Sledeća komanda određuje vrednost
- izraza (7*2)%3:
- expr `expr 7 \* 2` % 3
- 7. Čitanje vrednosti sa tastature – komanda read
- Koristeći bilo koji editor teksta unesite sledeći tekst u datoteku ss2 na tekućem direktorijumu:
- # ss2: upotreba komande read
- clear
- echo -e "Unesite vrednost a:\c"
- read var1
- echo -e "Unesite vrednost b:\c"
- read var2
- echo "a + b = $var1 + $var2 = `expr $var1 + $var2`”
- Pokrenite program komandom: bash ss2 i isprobajte ga.
- Obrišite datoteku: rm ss2
- 8. Podsetnik (engl. reminder) – komande grep, wc i sort
- Koristeći bilo koji editor teksta unesite sledeći tekst u datoteku proba na tekućem direktorijumu:
- Strana 11 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- Second line of the text file
- Wile E. Coyote
- Third line of the text file
- B.C.D.E
- First line of the text file
- A.B.C.D
- Objasnite šta rade sledeće komande (poslužite se slobodno man stranicama ako niste sigurni):
- wc -l proba
- sort proba
- grep line proba
- grep -c line proba
- cat proba | grep line | wc -l
- cat proba | grep line | sort
- Obrišite datoteku proba.
- 9. Prosleđivanje parametara shell programu
- Koristeći bilo koji editor teksta unesite sledeći tekst u datoteku ss3 na tekućem direktorijumu:
- # ss3: koriscenje argumenata komandne linije
- c=`expr $1 + $2`
- d=`expr $c % 26`
- echo "$1 + $2 mod 26 = $d"
- Pokrenite program komandama:
- chmod +x ss3
- ./ss3 12 15
- Šta program vraća kao rezultat?
- Obrišite program komandom rm ss3
- 10. Izlazni status komande
- Ispitati status izvršenja sledećih komandi i na osnovu njega odredite da li se komanda uspešno
- izvršila (ako je izlazni status 0, sve je OK, ako je 1 ili viši, komanda je izvršena sa greškicom): [11].
- Strana 12 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- (1) Pokušaj upisa u direktorijum /bin bez root privilegija
- touch /bin/ss1
- echo $?
- (2) Prikazivanje tekućeg datuma
- date
- echo $?
- 11. Konstrukcija If-fi i naredba test
- Koristeći bilo koji editor teksta unesite sledeći tekst u datoteku ss4 na tekućem direktorijumu:
- #!/bin/bash
- # ss4: Da li je argument pozitivan ili negativan broj ?
- if [ $1 -gt 0 ]
- then
- echo "$1 je pozitivan broj"
- elif [ $1 -lt 0 ]
- then
- echo "$1 je negativan broj "
- elif [ $1 -eq 0 ]
- then
- echo "Argument je nula"
- else
- echo "$1 nije numericki argument"
- fi
- Dodajte pravo izvršavanja chmod +x ss4 i pokrenite program na četiri nacina:
- ./ss4 1
- ./ss4 -3
- ./ss4 0
- ./ss4 a
- Na kraju obrišite program ss4 komandom: rm ss4
- Strana 13 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- 12. Struktura case-esac
- Koristeći bilo koji editor teksta unesite sledeći tekst u datoteku ss5 na tekućem direktorijumu:
- #!/bin/bash
- # ss5: koriscenje case strukture
- if [ -z $1 ]
- then
- echo "*** Unesite korisnicko ime ***"
- exit 1
- fi
- echo -n "Obavestenje o korisniku sistema: "
- case $1 in
- "jsmith") echo "John Smith, jr.";;
- "coyote") echo "Wile E. Coyote, genius";;
- "student") echo "Anonymous";;
- *) echo "*** Nepostojeci korisnik ***";;
- esac
- Dodajte pravo izvršavanja chmod +x ss5 i pokrenite program na četiri nacina:
- ./ss5
- ./ss5 jsmith
- ./ss5 coyote
- ./ss5 student
- ./ss5 cvrle
- Na kraju obrišite program ss5 komandom: rm ss5
- 13. While petlja
- Koristeći bilo koji editor teksta unesite sledeći tekst u datoteku ss6 na tekućem direktorijumu:
- #!/bin/bash
- # ss6: tablica množenja realizovana while petljom
- echo "Program prikazuje tablicu mnozenja za dati broj"
- if [ $# -eq 0 ]
- Strana 14 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- then
- echo "Greska - numericki argument nije naveden"
- echo "Sintaksa : $0 broj"
- exit 1
- fi
- n=$1
- i=1
- while [ $i -le 10 ]
- do
- echo "$n * $i = `expr $i \* $n`"
- i=`expr $i + 1`
- done
- Dodajte pravo izvršavanja chmod +x ss6 i pokrenite program na četiri nacina:
- ./ss6
- ./ss6 6
- ./ss6 -4
- ./ss6 cvrle
- Na kraju obrišite program ss6 komandom: rm ss6
- Strana 15 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- 14. Until petlja
- Koristeći bilo koji editor teksta unesite sledeći tekst u datoteku ss7 na tekućem direktorijumu:
- #!/bin/bash
- # ss7: upotreba until petlje
- c=20
- until [ $c -lt 10 ]
- do
- echo c = $c
- let c-=1
- done
- Pokrenite program komandom: bash ss7
- Obrišite program ss7 komandom: rm ss7
- 15. For petlja
- Koristeći bilo koji editor teksta unesite sledeći tekst u datoteku ss8 na tekućem direktorijumu:
- # ss8: upotreba for petlje
- if [ $# -eq 0 ]
- then
- echo "Greška - numerički argument nije naveden"
- echo "Sintaksa : $0 broj"
- echo "Program prikazuje tablicu množenja za dati broj"
- exit 1
- fi
- n=$1
- for i in 1 2 3 4 5 6 7 8 9 10
- do
- echo "$n * $i = `expr $i \* $n`"
- done
- Strana 16 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- Dodajte pravo izvršavanja chmod +x ss8 i pokrenite program na četiri nacina:
- ./ss8
- ./ss8 5
- ./ss8 -3
- Na kraju obrišite program ss6 komandom: rm ss8
- 16. Struktura select
- Koristeći bilo koji editor teksta unesite sledeći tekst u datoteku ss9 na tekućem direktorijumu:
- opcije="pozdrav kraj"
- select op in $opcije;
- do
- if [ "$op" = "kraj" ];
- then
- echo OK.
- exit
- elif [ "$op" = "pozdrav" ];
- then
- echo Linux Rulez !
- else
- clear
- echo Opcija ne postoji.
- fi
- done
- Dodajte pravo izvršavanja chmod +x ss9
- Pokrenite program komandom ./ss9 i isprobaje opcije 1 i 2.
- Na kraju obrišite program ss6 komandom: rm ss9
- 17. Proširenje preko zagrada
- Probajte sledeće: echo /home/{jsmith/{mp3,video},coyote/{food,bomb}}
- Šta se ispisalo na ekranu?
- Strana 17 / 18
- OS2, Vežba 5 - DISKOVI I FAJL SISTEMI
- 18. Tilda proširenje
- Pređite na svoj home direktorijum: cd
- Na svom home direktorijumu kreirajte neki poddirektorijum: mkdir mydir
- Pređite na /etc direktorijum: cd /etc
- Kako možete jednom skraćenom komandom preći na /home/korisnik/mydir?
- Probajte sa: cd ~/mydir
- Proverite gde se nalazite: pwd
- Vratite se na home direktorijum: cd
- Obrišite mydir: rmdir mydir
- 19. Komandna zamena
- Isprobajte komandnu zamenu pomoću sledećih komandi:
- x=`date`
- echo $x
- y=`ls -ld /etc`
- echo $y
- 20. Cleaning and housekeeping.
- Prijavite se na sistem OS2. Pokrenite terminal. Obrišite korisnika korisnik i njegov lični direktorijum:
- userdel smer_brojIndeksa (npr: nrtd912)
- rm -rf /home/smer_brojIndeksa (npr: /home/ nrtd912)
- Ugasite virtuelnu mašinu.
- Strana 18 / 18
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement