Laborator 02: Servicii sistem și server basics

01. Investigarea dinamică a unui proces

a) strace

Comanda strace (system call trace) ne este utilă pentru a investiga ce apeluri de sistem efectuează o comandă dată și ce parametri folosește.

De exemplu, dacă dorim să urmărim apelurile de sistem efectuate de comanda ls folosim comanda

strace ls

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

strace -e file ls

Observăm fișierele deschise.

Pentru a vedea diferența între comenzile ls și ls -l folosim comanda

strace -e file ls -l

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.

b) Informații despre rețea

Comanda

netstat -s

afișează informații statistice despre pachetele sistemului. Ne interesează să știm de unde obține comanda respectivă informațiile.

Rulați comanda

strace -e open netstat -s

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

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

Pentru a deschide un tab nou de terminal în GNOME Terminal puteți folosi combinația de taste Ctrl+Shift+t.

Într-unul dintre tab-uri aflați PID-ul procesului curent (a shell-ului) folosind comanda

echo $$

Pentru a investiga shell-ul, din celălalt tab folosim comanda

strace -p <PID>

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.

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

strace -f -p <PID>

Dacă dorim să vedem doar operațiile cu procese și fișiere, de exemplu, vom folosi pentru investigație comanda

strace -f -e process,file -p <PID>

02. Demonizarea proceselor

a) Procese detașate de terminal

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.

Pentru a detașa un proces de un terminal se folosesc comenzi precum nohup, dtach și disown.

Folosiți comanda wget pentru a descărca fișierul .torrent de aici.

b) disown

Porniți un proces BitTorrent folosind comanda:

btdownloadheadless lin-prog.torrent

Dacă nu aveți btdownloadheadless instalat pe sistem instalați pachetul bittorrent

sudo apt-get install bittorrent

sau pachetul bittornado

sudo apt-get install bittornado

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.

Apoi încheiați execuția acelui proces.

c) nohup

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.

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.

03. Serviciul cron

a) Demo: Inspectarea configurației cron

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

Pentru a vedea configurația pentru utilizatorul curent folosim comanda

crontab -l

Dacă suntem autentificați ca utilizator privilegiat, putem vizualiza configurația cron pentru un utilizator dat putem folosi comanda

crontab -u <username> -l

unde <username> este numele utilizatorului a cărui configurație dorim să o afișăm.

Pentru a afla job-urile cron active per utilizator putem inspecta, ca utilizator privilegiat, directorul de spooling /var/spool/cron/

sudo tree /var/spool/cron/

În subdirectorul /var/spool/cron/crontabs/ se găsesc job-urile cron active (marcate per utilizator).

b) Configurare cron cu standard output

Dacă dorim să avem un job care să ruleze periodic vom crea o intrare în crontab-ul utilizatorului root.

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:

/bin/echo "Num processes: $(ps -e --no-header | wc -l), num threads: $(ps -eL --no-header | wc -l)"

Folosim calea completă către comanda echo pentru că nu știm cum arată variabila PATH în mediul în care rulează cron.

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.

În urma funcționării corecte, veți vedea o intrare in /var/log/syslog care arata ca a fost executata comanda.

Dupa ce configurati regulile de cron, restartati serviciul cron.

Pentru crearea intrării în crontab-ul utilizatorului root urmăriți indicațiile de aici.

c) Alte configurări cron

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.

Instalați pachetul debsums. Urmăriți ce configurări de cron sunt adăugate la instalarea pachetului.

Urmăriți conținutului unui pachet instalat folosind comanda

dpkg -L <nume-pachet>

unde <nume-pachet> este numele pachetului.

d) Configurare serviciu cron de pornire client Bittorrent

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.

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

Plasați script-ul în crontab cu verificare la 10 minute.

e) Gestionare client de BitTorrent folosind supervisord

Folosiți supervisord pentru a porni și gestiona clientul BitTorrent de mai sus.

04. Serviciul NTP

a) Funcționarea NTP

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

sudo apt-get install ntpdate

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

b) Configurare server NTP. Sincronizare sisteme

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

sudo netstat -ulpn

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.

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

ntpq -p
ntpq -pn

05. Jurnalizare

a) Investigare configuratie syslog

Pe mașina virtulă verificați dacă daemonul de syslog este instalat (Hint: rsyslog).

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.

b) Reguli de jurnalizare

Adaugati în /etc/rsyslog.conf o intrare prin care TOATE mesajele din sistem sa fie înregistrate în /var/log/all_logs

root@heimdall:~# tail -n 1 /etc/rsyslog.conf
*.*		-/var/log/all_logs

Se adauga un minus (-) pentru a se evita sincronizarea fisierului dupa fiecare mesaj syslog (fiind vorba despre toate mesajele din sistem).

Creati fisierul /var/log/all_logs, apoi configurati owner-ul ca fiind user-ul sub care ruleaza rsyslog:

# touch /var/log/all_logs
# chown syslog:adm /var/log/all_logs

Reporniți daemonul rsyslog și verificați conținutul fișierului /var/log/all_logs.

root@heimdall:~# /etc/init.d/rsyslog restart
Stopping enhanced syslogd: rsyslogd.
Starting enhanced syslogd: rsyslogd.

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

c) Generate mesaje cu logger

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.

root@heimdall:~# logger -p mail.info "mail log 1"

root@heimdall:~# logger -p mail.info "mail log 2"

root@heimdall:~# logger -p mail.info "mail log 3"

root@heimdall:~# logger -p mail.info "mail log 4"

root@heimdall:~# logger -p mail.info "mail log 5"

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

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)

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
}
gsr/laboratoare/laborator-02.txt · Last modified: 2016/10/20 21:05 by alexandru.carp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0