This shows you the differences between two versions of the page.
gsr:laboratoare:laborator-02 [2016/10/11 12:36] alexandru.carp |
gsr:laboratoare:laborator-02 [2016/10/20 21:05] (current) alexandru.carp [b) Reguli de jurnalizare] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Laborator 02: Servicii sistem și server basics ====== | ====== Laborator 02: Servicii sistem și server basics ====== | ||
- | ===== Demo ===== | + | ===== 01. Investigarea dinamică a unui proces ===== |
- | TODO | + | ==== a) strace ==== |
- | ===== Exerciții ===== | + | Comanda ''strace'' (//system call trace//) ne este utilă pentru a investiga ce apeluri de sistem efectuează o comandă dată și ce parametri folosește. |
- | ==== Investigarea proceselor sistemului ==== | + | De exemplu, dacă dorim să urmărim apelurile de sistem efectuate de comanda ''ls'' folosim comanda<code> |
+ | strace ls | ||
+ | </code> | ||
- | === Afișare procese === | + | Output-ul fiind destul de vast, ne preocupă să obținem doar informații despre fișierele deschide. Pentru aceasta folosim opțiunea ''-e'' a comenzii ''strace'' cu ajutorul căreia filtrăm tipuri de operații. În cazul de față folosim comanda<code> |
+ | strace -e file ls | ||
+ | </code> | ||
- | Dorim să afișăm anumite procese într-o anumită ordine. | + | Observăm fișierele deschise. |
- | Folosiți ''ps'' cu opțiunea corectă pentru a afișa procesele care aparțin utilizatorului ''student''. Căutați în pagina de manual după șirul //user//. | + | Pentru a vedea diferența între comenzile ''ls'' și ''ls -l'' folosim comanda<code> |
+ | strace -e file ls -l | ||
+ | </code> | ||
- | Pentru procesele de mai sus afișați PID-ul, comanda completă (cale completă cu parametri), timpul de rulare pe procesor, memoria RAM consumată (RSS -- //resident set size//). Pentru a selecta doar anumite atribute ale unui proces folosiți comanda ''ps'' cu parametrul ''-o'' urmat de opțiunile specifice; urmăriți și pagina de manual. | + | Observăm că acum deschise și fișiere precum ''/etc/passwd'' și ''/etc/group'' pentru a determina username-ul și grupul aferent UID-ului și GID-ului din fișier. |
- | + | ||
- | Sortați procesele de mai sus în ordinea inversă a memoriei RAM consumate (RSS -- //resident set size//). Adică cele mai consumatoare de memorie procese la început. | + | |
- | + | ||
- | Din procesele sortate rețineți doar primele 10 intrări. Să afișați și antetul oferit de ''ps''. | + | |
- | === Procesele unui utilizator === | + | ==== b) Informații despre rețea ==== |
- | Dorim să lucrăm cu grupuri de procese care țin de un utilizator. | + | Comanda<code bash> |
- | + | netstat -s | |
- | Pe un tab nou de terminal adăugăm utilizatorul ''ana'' folosind comenzile<code> | + | |
- | $ sudo su | + | |
- | # adduser ana | + | |
- | [...] | + | |
- | # exit # sau puteti folosi combinatia de taste Ctrl+d | + | |
- | $ | + | |
</code> | </code> | ||
+ | afișează informații statistice despre pachetele sistemului. Ne interesează să știm de unde obține comanda respectivă informațiile. | ||
- | În acel tab nou ne autentificăm ca utilizatorul ''ana'' folosind comanda<code> | + | Rulați comanda<code bash> |
- | $ su - ana | + | strace -e open netstat -s |
</code> | </code> | ||
+ | pentru a afla ce fișiere deschide comanda la rulare. | ||
- | În cel nou tab, din contul utilizatorului ''ana'', porniți în background mai multe procese: ''sleep'', ''emacs'', ''gedit'' etc. | + | Care fișier este citit pentru a afla informații despre pachetele primite (//packets received//)? Vizualizați acel fișier (luați-o pe încercate). |
- | Din primul tab, folosiți, ca ''root'', ''pkill'' pentru o încheia execuția proceselor utilizatorului ''ana''; adică rulați ''%%sudo pkill ...%%'' (cu ce opțiuni sunt utile). Este posibil să fie necesar să folosiți semnalul ''SIGKILL'' ca să fie garantată încheierea execuției. | + | ==== c) Atașarea la un proces ==== |
+ | |||
+ | ''strace'' permite investigarea unui proces aflat deja în rulare. Numim acest lucru atașarea la un proces. Putem astfel investiga apelurile de sistem efectuate de un proces aflat în rulare și diagnostica anumite probleme ale acestuia. Pentru a ne putea atașa la un proces avem nevoie de PID-ul acestuia. | ||
+ | |||
+ | Deschideți două tab-uri de terminal (adică să aveți două deschise; dacă aveți deja unul mai deschideți încă unul). | ||
<note tip> | <note tip> | ||
- | În locul comenzii ''pkill'' puteți folosi comanda ''killall'' cu opțiunile potrivite. | + | Pentru a deschide un tab nou de terminal în GNOME Terminal puteți folosi combinația de taste ''Ctrl+Shift+t''. |
</note> | </note> | ||
- | === Procesele unui terminal === | + | Într-unul dintre tab-uri aflați PID-ul procesului curent (a shell-ului) folosind comanda<code> |
+ | echo $$ | ||
+ | </code> | ||
- | Pe un tab nou de terminal porniți în background procese ca utilizatorul ''root'', ''student'' și ''ana''. | + | Pentru a investiga shell-ul, din celălalt tab folosim comanda<code> |
- | + | strace -p <PID> | |
- | În acel tab aflăm care este identificatorul terminalului curent folosind comanda<code> | + | |
- | $ tty | + | |
</code> | </code> | ||
+ | unde ''<PID>'' este PID-ul shell-ului determinat mai sus. | ||
- | Din primul tab, folosiți, ca ''root'', ''pkill'' pentru o încheia execuția proceselor de pe al doilea terminal; adică rulați ''%%sudo pkill ...%%'' (cu ce opțiuni sunt utile). Este posibil să fie necesar să folosiți semnalul ''SIGKILL'' ca să fie garantată încheierea execuției. | + | Acum dacă în celălalt shell rulăm comenzi vom vedea ce se întâmplă în cadrul shell-ului. |
- | ==== Investigarea descriptorilor de fișiere ==== | + | Observăm că se folosește apelul de sistem ''clone'' pentru a crea un nou proces, dar nu apare apelul de sistem ''execve'' care înlocuiește imaginea de proces. Pentru a vedea aceste apeluri de sistem trebuie să precizăm comenzii ''strace'' să investigheze și procesele copil folosind opțiunea ''-f'' (de la ''follow children''). Astfel, vom putea investiga folosind comanda<code> |
+ | strace -f -p <PID> | ||
+ | </code> | ||
- | === lsof === | + | Dacă dorim să vedem doar operațiile cu procese și fișiere, de exemplu, vom folosi pentru investigație comanda<code> |
- | + | strace -f -e process,file -p <PID> | |
- | Ne interesează pentru un proces dat care sunt fișierele deschise de un proces, sau, de fapt, descriptorii de fișier deschiși de un proces. De exemplu, dacă dorim să identificăm descriptorii de fișier deschiși de shell-ul curent folosim comanda<code> | + | |
- | lsof -p $$ | + | |
</code> | </code> | ||
- | În fișierele deschise vom putea vedea descriptorii de fișier standard (''0'', ''1'' sau ''2''). Observăm că acești descriptori referă un dispozitiv de tip terminal, de forma ''/dev/pts/0'' pentru că astfel interacționează procesul cu utilizatorul. | + | ===== 02. Demonizarea proceselor ===== |
- | Dacă dorim să vizualizăm descriptorii deschiși de un proces daemon, de exemplu ''sshd''<code> | + | ==== a) Procese detașate de terminal ==== |
- | sudo lsof -p $(pidof sshd) | + | |
- | </code> | + | |
- | Observăm și descriptorii de fișier standard și sockeții TCP deschiși (2 sockeți care ascultă pe portul 22 atât pe IPv4 cât și pe IPv6). | + | Sunt cazuri în care dorim să pornim procese detașate de terminal. Adică după pornirea procesului să închidem terminalul și procesul să nu fie "omorât" ci să își încheie execuția. Aceste procese sunt echivalente unor procese daemon. |
- | Folosiți ''lsof'' pentru a investiga și descriptorii deschiși de procesul ''init''. | + | Pentru a detașa un proces de un terminal se folosesc comenzi precum ''nohup'', ''dtach'' și ''disown''. |
- | === Investigarea redirectării === | + | Folosiți comanda ''wget'' pentru a descărca fișierul ''.torrent'' de [[http://cdimage.debian.org/debian-cd/8.6.0/amd64/bt-cd/debian-8.6.0-amd64-netinst.iso.torrent|aici]]. |
- | Putem folosi ''lsof'' pentru a verifica modul în care redirectarea afectează descriptorii unui proces. | + | ==== b) disown ==== |
- | Într-un tab de terminal porniți un proces ''sleep'' folosind comanda<code> | + | Porniți un proces ''BitTorrent'' folosind comanda:<code> |
- | sleep 100 | + | btdownloadheadless lin-prog.torrent |
</code> | </code> | ||
- | În alt tab, pentru a investiga descriptorii procesului ''sleep'' folosim comanda<code> | ||
- | lsof -p $(pidof sleep) | ||
- | </code> | ||
- | |||
- | Observăm că descriptorii standard referă terminalul în care a fost rulată comanda, moșteniți de la terminalul din shell-ul folosit. | ||
- | Acum să invesigăm procesul ''sleep'' cu redictări în diverse fișiere. Folosiți comanda<code> | + | <note tip> |
- | sleep 100 < /dev/zero > /dev/null 2> error.txt | + | Dacă nu aveți ''btdownloadheadless'' instalat pe sistem instalați pachetul ''bittorrent''<code> |
+ | sudo apt-get install bittorrent | ||
</code> | </code> | ||
+ | sau pachetul ''bittornado''<code> | ||
+ | sudo apt-get install bittornado | ||
+ | </code> | ||
+ | </note> | ||
- | Folosim comanda ''lsof'' anterioară pentru a investiga descriptorii procesului ''sleep''. Putem observa unde pointează descriptorii standard de fișier pentru procesul pornit. | + | Transferați procesul pornit în starea de rulare în background. Detașați procesul de terminal folosind comanda ''disown''. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda ''lsof'' pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error. |
- | === Investigarea operatorului pipe === | + | Apoi încheiați execuția acelui proces. |
- | Folosiți ''lsof'' pentru a investiga descriptorii deschiși de cele trei procese ''sleep'' din cadrul comenzii<code> | + | ==== c) nohup ==== |
- | sleep 100 | sleep 120 | sleep 140 | + | |
- | </code> | + | |
- | Urmăriți ce înseamnă operatorul pipe (''|'') si ce impact are asupra descriptorilor de fișier ai unui proces. | + | Folosiți comanda ''nohup'' pentru a crea un proces BitTorrent precum cel de mai sus, detașat de terminal. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda ''lsof'' pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error. |
- | === netstat și ss === | + | Trimiteți un semnal procesului pentru a-i încheia execuția și apoi reporniți-l sub ''nohup'' astfel încât ieșirea standard (//standard output//, //stdout//) să fie redirectată la ''/dev/null'' iar ieșirea de eroare standard (//standard error//, //stderr//) să fie redirectată în fișierul ''err.log''. Investigați cu ''lsof'' unde pointează descriptorii standard ai procesului. |
- | Pentru a determina sockeții deschiși în cadrul sistemului folosim comanda ''netstat''. Modurile uzuale de lucru ale comenzii sunt:<code> | + | ===== 03. Serviciul cron ===== |
- | netstat -tlpn | + | |
- | netstat -tpn | + | |
- | netstat -ulpn | + | |
- | netstat -lpn | + | |
- | </code> | + | |
- | Aceleași opțiuni sunt folosite și pentru comanda ''ss''. | + | ==== a) Demo: Inspectarea configurației cron ==== |
- | Urmăriți și din output-ul comenzilor și din pagina de manual ce efect au fiecare dintre comenzile de mai sus. | + | /* |
+ | <note> | ||
+ | Pentru task-urile de ''cron'', folositi masina virtuala din ''/mnt/sda5/gsr/'' | ||
+ | </note> | ||
+ | */ | ||
- | === netcat === | + | Pentru a vedea configurația ''cron'' a sistemului inspectăm configurațiile din fișierele/directoarele ''/etc/cron*''. Fișierele ''/etc/cron.d/*'' și fișierul ''/etc/crontab'' conțin configurații standard ''cron'' la nivelul sistemului. Liniile de configurare urmează sintaxa crontab așa cum este exemplificată [[http://techie-experience.blogspot.ro/2012/10/crontab.html|aici]]. |
- | Dacă dorim deschiderea unui server/serviciu pe sistemul curent putem folosi comanda<code> | + | Pentru a vedea configurația pentru utilizatorul curent folosim comanda<code> |
- | netcat -l -p 12345 | + | crontab -l |
</code> | </code> | ||
- | Comanda de mai sus va deschide un server TCP pe portul ''12345''. | ||
- | Pentru a deschide o conexiune către acest serviciu folosim comanda<code> | + | Dacă suntem autentificați ca utilizator privilegiat, putem vizualiza configurația ''cron'' pentru un utilizator dat putem folosi comanda<code> |
- | netcat <hostname> 12345 | + | crontab -u <username> -l |
</code> | </code> | ||
- | unde ''<hostname>'' este numele stației sau adresa IP a stației. Pentru o conexiune pe stația locală folosiți comanda<code> | + | unde ''<username>'' este numele utilizatorului a cărui configurație dorim să o afișăm. |
- | netcat localhost 12345 | + | |
+ | Pentru a afla job-urile cron active per utilizator putem inspecta, ca utilizator privilegiat, directorul de spooling ''/var/spool/cron/''<code> | ||
+ | sudo tree /var/spool/cron/ | ||
</code> | </code> | ||
- | Investigați folosind comanda ''netstat'' sau comanda ''s'' conexiunea astfel deschisă. | + | În subdirectorul ''/var/spool/cron/crontabs/'' se găsesc job-urile cron active (marcate per utilizator). |
- | === SimpleHTTPServer === | + | ==== b) Configurare cron cu standard output ==== |
- | Pachetul ''python'' vine cu un server web simplu care poate fi pornit pentru a servi fisiere din directorul curent. Pentru pornirea sa folositi comanda<code> | + | Dacă dorim să avem un job care să ruleze periodic vom crea o intrare în crontab-ul utilizatorului ''root''. |
- | python -m SimpleHTTPServer | + | |
+ | Următorul exercițiu este didactic, ca să putem urmări comportamentul ''cron''. | ||
+ | |||
+ | Comanda de mai jos este folosită pentru a afișa numărul de procese și thread-uri curente la nivelul sistemului:<code> | ||
+ | /bin/echo "Num processes: $(ps -e --no-header | wc -l), num threads: $(ps -eL --no-header | wc -l)" | ||
</code> | </code> | ||
- | Investigati folosind ''netstat'' si ''s'' portul pe care asculta conexiuni (afisat si la pornirea sa) si pointati browser-ul la URL-ul http://localhost:8000/ pentru a putea urmari fisierele servite. Un coleg poate sa se conecteze la acest server web folosind in loc de ''localhost'' adresa IP a statiei voastre. | + | Folosim calea completă către comanda ''echo'' pentru că nu știm cum arată variabila ''PATH'' în mediul în care rulează ''cron''. |
- | ==== Obținerea unui clip de pe YouTube din Firefox ==== | + | |
- | <note> | + | Adăugați comanda de mai sus să ruleze la fiecare două minute prin alterarea crontab-ului utilizatorului ''root''. După adăugare urmăriți spool-ul cron în ''/var/spool/cron/crontabs/root''. |
- | Exercițiul de mai jos poate să nu meargă pe anumite versiuni de Firefox sau pe anumite clipuri. În general funcționează pe clipuri care folosesc plugin-ul Flash pentru rendering. | + | |
+ | În urma funcționării corecte, veți vedea o intrare in ''/var/log/syslog'' care arata ca a fost executata comanda. | ||
+ | |||
+ | <note tip> | ||
+ | Dupa ce configurati regulile de cron, restartati serviciul ''cron''. | ||
</note> | </note> | ||
- | In momentul in care un browser acceseaza un clip video acesta incepe sa faca streaming si sa descarce fisierul aferent in sistemul local de fisiere. Firefox descarca clip-urile video in directorul ''/tmp'', dar le sterge acel ''hard link'' si nu pot fi obtinute direct. Putem insa sa le determinam si obtinem prin investigatie si folosind ''lsof'' sau ''/proc''. | + | <note tip> |
+ | Pentru crearea intrării în crontab-ul utilizatorului ''root'' urmăriți indicațiile de [[http://techie-experience.blogspot.ro/2012/10/crontab.html|aici]]. | ||
+ | </note> | ||
- | Pentru aceasta, accesati folosind Firefox un clip video de pe YouTube. Clipul va fi streamuit si puteti observa cum se descarca. | + | ==== c) Alte configurări cron ==== |
- | Pentru a vedea care sunt fisierele deschise de Firefox avem doua optiuni date de cele doua comenzi de mai jos:<code> | + | Actualizați comanda din ''cron'' de mai sus astfel încât output-ul comenzii să fie adăugat într-un fișier dat. Output-ul să conțină și data la care a fost rulată comanda. |
- | lsof -p $(pidof firefox) | + | |
- | ls /proc/$(pidof firefox)/fd | + | |
- | </code> | + | |
- | Printre fisierele deschise de procesul firefox putem observa si cel putin un fisier care se gaseste in ''/tmp'', fisier care insa nu exista. Avem insa un descriptor catre el; a fost sters hard link-ul din ''/tmp'' dar nu si fisierul efectiv. Pentru a recupera fisierul, daca descriptorul sau este ''<FD>'' vom folosi comanda<code> | + | Instalați pachetul ''debsums''. Urmăriți ce configurări de cron sunt adăugate la instalarea pachetului. |
- | cp /proc/$(pidof firefox)/fd/<FD> myclip | + | |
- | </code> | + | |
- | Folosim comanda<code> | + | <note tip> |
- | vlc myclip | + | Urmăriți conținutului unui pachet instalat folosind comanda<code> |
+ | dpkg -L <nume-pachet> | ||
</code> | </code> | ||
- | pentru a porni clipul. | + | unde ''<nume-pachet>'' este numele pachetului. |
- | ==== Investigarea dinamică a unui proces ==== | + | </note> |
- | === strace === | + | ==== d) Configurare serviciu cron de pornire client Bittorrent ==== |
- | Comanda ''strace'' (//system call trace//) ne este utilă pentru a investiga ce apeluri de sistem efectuează o comandă dată și ce parametri folosește. | + | Instalați un client de Bittorrent care funcționează în linia de comandă, precum ''transmission-cli'' sau ''bittorrent'' sau ''bittornado'' și porniți-l în background (folosind ''nohup'') ca să descarce un anumit conținut Bittorrent. Găsiți un fișier ''.torrrent'' pe Internet și descărcați-l. |
- | De exemplu, dacă dorim să urmărim apelurile de sistem efectuate de comanda ''ls'' folosim comanda<code> | + | Apoi creați un script care să verifice dacă este pornit clientul Bittorrent pentru acel fișier ''.torrent'' și dacă nu este pornit să-l repornească. |
- | strace ls | + | |
- | </code> | + | |
- | Output-ul fiind destul de vast, ne preocupă să obținem doar informații despre fișierele deschide. Pentru aceasta folosim opțiunea ''-e'' a comenzii ''strace'' cu ajutorul căreia filtrăm tipuri de operații. În cazul de față folosim comanda<code> | + | Plasați script-ul în crontab cu verificare la 10 minute. |
- | strace -e file ls | + | |
- | </code> | + | |
- | Observăm fișierele deschise. | + | ==== e) Gestionare client de BitTorrent folosind supervisord ==== |
- | Pentru a vedea diferența între comenzile ''ls'' și ''ls -l'' folosim comanda<code> | + | Folosiți [[http://supervisord.org/|supervisord]] pentru a porni și gestiona clientul BitTorrent de mai sus. |
- | strace -e file ls -l | + | |
- | </code> | + | |
- | Observăm că acum deschise și fișiere precum ''/etc/passwd'' și ''/etc/group'' pentru a determina username-ul și grupul aferent UID-ului și GID-ului din fișier. | + | <note tip> |
+ | Urmăriți exemplele de configurare din link-urile de mai jos: | ||
+ | * https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps | ||
+ | * https://serversforhackers.com/monitoring-processes-with-supervisord | ||
+ | </note> | ||
- | === Informații despre rețea === | + | ===== 04. Serviciul NTP ===== |
- | Comanda<code bash> | + | ==== a) Funcționarea NTP ==== |
- | netstat -s | + | |
- | </code> | + | |
- | afișează informații statistice despre pachetele sistemului. Ne interesează să știm de unde obține comanda respectivă informațiile. | + | |
- | Rulați comanda<code bash> | + | Pentru a verifica funcționarea NTP (//Network Time Protocol//) o soluție este instalarea utilitarului ''ntpdate''. Dacă nu-l aveți instalat, instalați-l folosind comanda<code> |
- | strace -e open netstat -s | + | sudo apt-get install ntpdate |
</code> | </code> | ||
- | pentru a afla ce fișiere deschide comanda la rulare. | ||
- | Care fișier este citit pentru a afla informații despre pachetele primite (//packets received//)? Vizualizați acel fișier (luați-o pe încercate). | + | Aveți două utilitare pe care le puteți folosi interschimbabil pentru actualizarea timpului sistemului: ''ntpdate'' care primește ca argument un server NTP, și ''nptdate-debian'' care folosește serverele configurate în ''/etc/default/ntpdate'' (directiva ''NTPSERVERS''). |
- | === Atașarea la un proces === | + | ==== b) Configurare server NTP. Sincronizare sisteme ==== |
- | ''strace'' permite investigarea unui proces aflat deja în rulare. Numim acest lucru atașarea la un proces. Putem astfel investiga apelurile de sistem efectuate de un proces aflat în rulare și diagnostica anumite probleme ale acestuia. Pentru a ne putea atașa la un proces avem nevoie de PID-ul acestuia. | + | Instalați, dacă nu este instalat serverul ''NTP'' prin intermediul pachetului ''ntp''. Serverul va porni automat și veți putea verifica faptul că ascultă conexiuni pe portul ''123'' UDP folosind comanda<code> |
+ | sudo netstat -ulpn | ||
+ | </code> | ||
- | Deschideți două tab-uri de terminal (adică să aveți două deschise; dacă aveți deja unul mai deschideți încă unul). | + | Discutați cu 2-3 colegi și aflați adrese IP stațiilor pe care aceștia lucrează și adăugați configurare pentru serverul NTP în fișierul ''/etc/ntp.conf''. După un timp se va crea un mesh de comunicare între serverele NTP din sala de laborator. |
<note tip> | <note tip> | ||
- | Pentru a deschide un tab nou de terminal în GNOME Terminal puteți folosi combinația de taste ''Ctrl+Shift+t''. | + | Pentru a investiga la orice moment informații despre funcționarea serverului NTP și peer-ii cu care acesta comunică puteți folosi una dintre comenzile de mai jos<code> |
+ | ntpq -p | ||
+ | ntpq -pn | ||
+ | </code> | ||
</note> | </note> | ||
- | Într-unul dintre tab-uri aflați PID-ul procesului curent (a shell-ului) folosind comanda<code> | + | <note tip> |
- | echo $$ | + | Informații despre configurarea NTP găsiți în link-urile de mai jos: |
- | </code> | + | * http://www.debianadmin.com/ntp-server-and-client-configuration-in-debian.html |
+ | * http://www.tecmint.com/install-and-configure-ntp-server-client-in-debian/ | ||
+ | </note> | ||
- | Pentru a investiga shell-ul, din celălalt tab folosim comanda<code> | + | ===== 05. Jurnalizare ===== |
- | strace -p <PID> | + | |
- | </code> | + | |
- | unde ''<PID>'' este PID-ul shell-ului determinat mai sus. | + | |
- | Acum dacă în celălalt shell rulăm comenzi vom vedea ce se întâmplă în cadrul shell-ului. | + | ==== a) Investigare configuratie syslog ==== |
- | Observăm că se folosește apelul de sistem ''clone'' pentru a crea un nou proces, dar nu apare apelul de sistem ''execve'' care înlocuiește imaginea de proces. Pentru a vedea aceste apeluri de sistem trebuie să precizăm comenzii ''strace'' să investigheze și procesele copil folosind opțiunea ''-f'' (de la ''follow children''). Astfel, vom putea investiga folosind comanda<code> | + | Pe mașina virtulă verificați dacă daemonul de syslog este instalat (Hint: rsyslog). |
- | strace -f -p <PID> | + | <code> |
+ | root@heimdall:~# apt-get install rsyslog | ||
+ | Reading package lists... Done | ||
+ | Building dependency tree | ||
+ | Reading state information... Done | ||
+ | rsyslog is already the newest version. | ||
+ | 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. | ||
</code> | </code> | ||
- | Dacă dorim să vedem doar operațiile cu procese și fișiere, de exemplu, vom folosi pentru investigație comanda<code> | + | ==== b) Reguli de jurnalizare ==== |
- | strace -f -e process,file -p <PID> | + | |
- | </code> | + | |
- | ==== Demonizarea proceselor ==== | + | Adaugati în ''/etc/rsyslog.conf'' o intrare prin care TOATE mesajele din sistem sa fie înregistrate în ''/var/log/all_logs'' |
+ | <code> | ||
+ | root@heimdall:~# tail -n 1 /etc/rsyslog.conf | ||
+ | *.* -/var/log/all_logs | ||
- | === Procese detașate de terminal === | + | Se adauga un minus (-) pentru a se evita sincronizarea fisierului dupa fiecare mesaj syslog (fiind vorba despre toate mesajele din sistem). |
+ | </code> | ||
- | Sunt cazuri în care dorim să pornim procese detașate de terminal. Adică după pornirea procesului să închidem terminalul și procesul să nu fie "omorât" ci să își încheie execuția. Aceste procese sunt echivalente unor procese daemon. | + | Creati fisierul ''/var/log/all_logs'', apoi configurati owner-ul ca fiind user-ul sub care ruleaza ''rsyslog'': |
+ | <code> | ||
+ | # touch /var/log/all_logs | ||
+ | # chown syslog:adm /var/log/all_logs | ||
+ | </code> | ||
- | Pentru a detașa un proces de un terminal se folosesc comenzi precum ''nohup'', ''dtach'' și ''disown''. | + | Reporniți daemonul ''rsyslog'' și verificați conținutul fișierului ''/var/log/all_logs''. |
+ | <code> | ||
+ | root@heimdall:~# /etc/init.d/rsyslog restart | ||
+ | Stopping enhanced syslogd: rsyslogd. | ||
+ | Starting enhanced syslogd: rsyslogd. | ||
- | Folosiți comanda ''wget'' pentru a descărca fișierul ''.torrent'' de [[http://cdimage.debian.org/debian-cd/8.2.0/i386/bt-cd/debian-mac-8.2.0-i386-netinst.iso.torrent|aici]]. | + | root@heimdall:~# tail /var/log/all_logs |
+ | Nov 9 15:34:04 heimdall kernel: imklog 5.8.5, log source = /proc/kmsg started. | ||
+ | Nov 9 15:34:04 heimdall rsyslogd: [origin software="rsyslogd" swVersion="5.8.5" x-pid="2604" x-info="http://www.rsyslog.com"] start | ||
+ | </code> | ||
- | === disown === | + | ==== c) Generate mesaje cu logger ==== |
- | Porniți un proces ''BitTorrent'' folosind comanda:<code> | + | Folosind comanda ''logger'', generați 5 mesaje de log cu facilitatea mail și cu proritatea info, care să conțină textele "mail log 1" ... "mail log 5". Verificați prezența mesajelor în ''/var/log/all_logs''. |
- | btdownloadheadless lin-prog.torrent | + | <code> |
- | </code> | + | root@heimdall:~# logger -p mail.info "mail log 1" |
- | <note tip> | + | root@heimdall:~# logger -p mail.info "mail log 2" |
- | Dacă nu aveți ''btdownloadheadless'' instalat pe sistem instalați pachetul ''bittorrent''<code> | + | |
- | sudo apt-get install bittorrent | + | |
- | </code> | + | |
- | sau pachetul ''bittornado''<code> | + | |
- | sudo apt-get install bittornado | + | |
- | </code> | + | |
- | </note> | + | |
- | Transferați procesul pornit în starea de rulare în background. Detașați procesul de terminal folosind comanda ''disown''. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda ''lsof'' pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error. | + | root@heimdall:~# logger -p mail.info "mail log 3" |
- | Apoi încheiați execuția acelui proces. | + | root@heimdall:~# logger -p mail.info "mail log 4" |
- | === nohup === | + | root@heimdall:~# logger -p mail.info "mail log 5" |
- | Folosiți comanda ''nohup'' pentru a crea un proces BitTorrent precum cel de mai sus, detașat de terminal. Închideți terminalul. Investigați prezența procesului în alt terminal. Folosiți comanda ''lsof'' pentru a vedea ce folosește procesul pe post de standard input, standard output și standard error. | + | root@heimdall:~# tail /var/log/all_logs |
+ | Nov 9 15:34:04 heimdall kernel: imklog 5.8.5, log source = /proc/kmsg started. | ||
+ | Nov 9 15:34:04 heimdall rsyslogd: [origin software="rsyslogd" swVersion="5.8.5" x-pid="2604" x-info="http://www.rsyslog.com"] start | ||
+ | Nov 9 15:36:55 heimdall root: mail log 1 | ||
+ | Nov 9 15:36:57 heimdall root: mail log 2 | ||
+ | Nov 9 15:36:58 heimdall root: mail log 3 | ||
+ | Nov 9 15:36:59 heimdall root: mail log 4 | ||
+ | Nov 9 15:37:00 heimdall root: mail log 5 | ||
+ | </code> | ||
- | Trimiteți un semnal procesului pentru a-i încheia execuția și apoi reporniți-l sub ''nohup'' astfel încât ieșirea standard (//standard output//, //stdout//) să fie redirectată la ''/dev/null'' iar ieșirea de eroare standard (//standard error//, //stderr//) să fie redirectată în fișierul ''err.log''. Investigați cu ''lsof'' unde pointează descriptorii standard ai procesului. | + | ==== d) Rotirea fisierelor de log ==== |
+ | |||
+ | Modificați ''/etc/logrotate.conf'' astfel încat fisierul ''/var/log/all_logs'' să fie rotit zilnic, folosind până la maxim 10 fișiere, fișire care să fie comprimate. Logurile trebuie să fie trimiste pe email la sysadmin@gsr.cs.pub.ro. (Hint: ''man logrotate'') | ||
+ | <code> | ||
+ | root@heimdall:~# tail -n 8 /etc/logrotate.conf | ||
+ | /var/log/all_logs { | ||
+ | missingok | ||
+ | daily | ||
+ | create 0660 root utmp | ||
+ | compress | ||
+ | rotate 10 | ||
+ | mail sysadmin@gsr.cs.pub.ro | ||
+ | } | ||
+ | </code> | ||
+ | /* | ||
==== Conectarea pe SSH la mașina virtuală ==== | ==== Conectarea pe SSH la mașina virtuală ==== | ||
Line 337: | Line 373: | ||
Rulați serverul de SSH sub ''strace'' (eventual folosind opțiunea ''-f'') și urmăriți ce se întâmplă atunci când se încearcă noi conexiuni. | Rulați serverul de SSH sub ''strace'' (eventual folosind opțiunea ''-f'') și urmăriți ce se întâmplă atunci când se încearcă noi conexiuni. | ||
- | /* | ||
~~SHOWSOLUTION~~ | ~~SHOWSOLUTION~~ | ||
====== Laborator 02 - Gestiunea sistemului de fișiere ====== | ====== Laborator 02 - Gestiunea sistemului de fișiere ====== |