====== 14. Gestiunea serviciilor ====== Serviciile sunt acele procese pornite la inițializarea sistemului ce nu au un terminal de intrare/ieșire. De obicei parintele lor este ''init''. Este important să știm cum să le controlăm și modul în care vedem erorile generate de acestea. ===== Subiecte abordate ===== * Managementul serviciilor * Menținerea timpului sistemului * Menținearea jurnalelor sistemului ==== Utilitare folosite ==== * /etc/init.d/ * update-rc.d * sysv-rc-conf * /etc/xinet.d/* * netstat * syslog.conf * syslogd * klogd * logger * journalctl * /etc/systemd/journald.conf * /var/log/journal * rsyslog and syslog-ng ===== Exerciții ===== ==== Demo-uri Servicii ==== * Folosiți comanda {{{netstat}}} pentru afișarea serviciilor de rețea ale sistemului netstat -tlpn ** Verificati in manual functionalitatea fiecarui argument. * Opriți, porniți și reporniți serviciul SSH, folosind {{{/etc/init.d/cups}}} și argumentele respectiv, {{{start}}}, {{{stop}}}, {{{restart}}}. * Instalați serverul web Apache2, folosind apt-get install apache2 ** Folosiți {{{netstat -tlpn}}} pentru a afla pe ce port ascultă conexiuni serverul ''apache2''. ==== Exercițiu Servicii ==== # Instalați și configurați {{{sysv-rc-conf}}} pentru a configura runlevel-urile în care rulează serviciul Apache2. #* Pentru testare rulați comanda ls -l /etc/rcX.d/ | grep 'apache2' unde ''X'' este indicele runlevel-ului configurat folosind ''sysv-rc-conf'' (adică una dintre valorile 1, 2, 3, 4, 5, 6). # Instalați {{{xinetd}}}. # Activați în cadrul {{{xinetd}}} suportul pentru serviciul de {{{echo}}} (Hint: {{{/etc/xinetd.d/echo}}}) #* Pentru verificare reporniți serviciul ''xinetd'' folosind comanda: sudo service xinetd restart #* Dacă ați configurat totul cum trebuie, ar trebui ca serviciul local ''echo'' să ruleze și să asculte conexiuni. Puteți verifica folosind comenzi de forma: pgrep -f xinetd sudo netstat -tlpn #* Comanda ''netstat'' vă va afișa că serviciul ''xinetd'' ascultă conexiuni pe portul 7, portul aferent serviciului ''echo''. Puteți verifica maparea portului ''7'' la serviciul ''echo'' în următoarele moduri: #** rulând comenzile sudo netstat -tlp sudo netstat -tlpn și văzând ca una folosește portul ''7'' cealaltă numele ''echo'' pentru serviciu. #** rulând comanda cat /etc/services | grep -w echo #** rulând comanda getent services echo #* Ca să testați că serviciul merge, vă conectați la serviciu folosind clientul TCP ''netcat'' în forma de mai jos: nc localhost 7 adică vă conectați pe sistemul local pe portul ''7''. #** În continuare orice șir veți da va fi retransmis identic (''echo'' -- ecou) de server. #** Ca să închideți conexiunea ''netcat'' dată de comanda de mai sus folosiți combinația de taste ''Ctrl+c''. # Activați în cadrul {{{xinetd}}} suportul pentru serviciul de {{{telnet}}}. #* Instalați pachetul {{{telnetd}}}. #* Folosiți {{{dpkg -L telnetd}}} pentru a localiza calea către executabilul aferent serviciului. #* Creați fișierul {{{/etc/xinetd.d/telnet}}} dacă nu există. #* Urmăriți [[http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-en-4/s1-tcpwrappers-xinetd-config.html | exemplul de configurație de aici]]. #* După configurare reporniți serviciul ''xinited'' folosind comanda sudo service xinetd restart #* Dacă ați configurat totul cum trebuie, ar trebui ca serviciul local ''telnet'' să ruleze și să asculte conexiuni. Puteți verifica folosind comenzi de forma: pgrep -f xinetd sudo netstat -tlpn #* Comanda ''netstat'' vă va afișa că serviciul ''xinetd'' ascultă conexiuni pe portul 23, portul aferent serviciului ''telnet''. Puteți verifica maparea portului ''7'' la serviciul ''echo'' în următoarele moduri: #** rulând comenzile sudo netstat -tlp sudo netstat -tlpn și văzând ca una folosește portul ''23'' cealaltă numele ''telnet'' pentru serviciu. #** rulând comanda cat /etc/services | grep -w telnet #** rulând comanda getent services telnet #* Serviciul ''telnet'' este un serviciu de conexiune la distanță **necriptat**. Nu este recomandat pentru conexiuni în afara rețelei locale, și poate nici atunci. Pentru a testa serviciul ''telnet'', folosiți clientul ''telnet'': telnet localhost În caz de succes veți primi un prompt de autentificare unde vă veți autentifica folosind username ''student'' și parolă ''student'' și apoi veți obține un prompt. #** De la prompt și de la conexiunea ''telnet'' vă puteți deconecta folosind comanda ''exit'' sau combinația de taste ''Ctrl+d''. #** În caz de probleme cu conexiunea ''telnet'' puteți folosi combinația de taster ''Ctrl+]'' urmată de apăsarea tastei ''q'' și apoi de ''ENTER'' pentru a închide conexiunea. #* În caz de probleme consultați fișierele de jurnalizare ({{{/var/log/syslog}}}). ==== Demo Logging ==== * Instalati daemonul {{{rsyslog}}}: apt-get install rsyslog * Instalati pachetul de documentație aferent: apt-get install rsyslog-doc * Parcurgeți fișierul de configurare {{{/etc/rsyslog.conf}}} si observati diferite optiuni disponibile vim /etc/rsyslog.conf * Utilitarul {{{journalctl}}} este utilizat pentru interogarea mesajelor generate de systemd: #* Pentru a verifica ultimele 50 mesajele: journalctl -n 50 #* Pentru a verifica mesajele cu prioritate critică: journalctl -p “crit” ==== Exercițiu Logging ==== # Ce efect are prezența unui minus ({{{-}}}) în cadrul unei intrări de fișier de tip jurnal în fișierul de configurare? #* Hint: http://www.rsyslog.com/doc/rsyslog_conf_actions.html (căutați după cuvântul {{{minus}}}). # Adaugati în {{{/etc/rsyslog.conf}}} o intrare prin care TOATE mesajele din sistem sa fie înregistrate în {{{/var/log/all_logs}}} #* **Important**: **Nu** creați fișierul de mână, îl va crea daemon-ul ''rsyslog'' la nevoie. #* Pentru verificare reporniți daemonul {{{rsyslog}}} folosind comanda sudo service rsyslog restart și testați recepționarea de mesaje in fișierul ''/var/log/all_logs'' trimițând mesaje folosind comanda logger, precum logger -p mail.err "test" # Folosind comanda {{{logger}}}, generați 5 mesaje de mail cu proritatea info, care să conțină textele %%"mail log 1"%% ... %%"mail log 5"%%, adică ceva de forma logger -p mail.info "mail log 1" # Modificați {{{/etc/logrotate.conf}}} astfel încat fisierul {{{/var/log/all_logs}}} să fie rotit zilnic. # Configurați {{{rsyslog}}} pentru a asculta conexiuni în rețea. #* Urmăriți directivele de configurare secțiunea {{{MODULES}}} din {{{/etc/rsyslog.conf}}}. #* Pentru a verifica faptul că serverul ''rsyslog'' ascultă conexiuni și pe UDP vom lista serviciile care ascultă conexiuni pe UDP folosind comanda netstat -ulpn Dacă e configurat cum trebuie, comanda de mai sus va afișa și numele serviciului ''rsyslog''. #** Portul pe care ascultă conexiuni este portul ''514'', lucru verificabil și prin rularea comenzilor netstat -ulp netstat -ulpn sau grep 'syslog' /etc/services sau getent services syslog # Realizați un script care ia din {{{/var/log}}} toate fișierele de logging de un anumit nivel, primit ca argument (''err'', ''warn'', ''debug'', ''info'' și ''log''), indiferent de facilitate, și le arhivează într-un fișier cu numele ''[NIVEL]_[DATA_CURENTA].tar.gz''. #* Pentru obținerea datei folosiți o construcție de forma date +"%Y-%m-%d" #* Pentru căutarea fișierelor necesare folosiți o construcție de forma find /var/log -name "*.err*" unde ''err'' se poate înlocui cu nivelul de logging necesar. #* Pentru arhivare/comprimare folosiți comanda tar -czf $nume-arhiva fisiere-de-arhivat ... unde ''$nume-arhiva'' este numele fișierului arhivă, iar ''fisiere-de-arhivat ...'' reprezintă lista de fișiere de arhivat. Poate fi vorba de output-ul comenzii ''find''. #* Dacă fișierul arhivă deja există la începutul rulării scriptului, ștergeți-l. #* Este nevoie să rulați comanda ca ''root'' pentru că aveți nevoie de privilegii pentru a lucra în directorul ''/var/log''. #* Pentru verificare, listați conținutul arhivei folosind comanda tar -tzf $nume-arhiva unde ''$nume-arhiva'' este numele fișierului arhivă. ==== Demo Time ==== * Pentru a configura timezone-ul corect ({{{Europe/Bucharest}}}) folosiți comanda sudo dpkg-reconfigure tzdata Este posibil să aveți configurația realizată corect. Dacă nu, realizați-o acum. * Folosiți fișierul {{{/etc/timezone}}} pentru afișarea timezone-ului curent folosind comanda cat /etc/timezone * Verificați configurarea corespunzătoare a zonei comparând fișierul de sistem ''/etc/localtime'' cu cel așteptat diff -s /etc/localtime /usr/share/zoneinfo/$(cat /etc/timezone) ** Dacă sunt identice, deci configurația este corectă, se va afișa un mesaj de forma %%"Files ... are identical."%%. * Verificați timpul curent folosind comanda date * Afișați data într-un nou format folosind comanda date +%d/%m/%Y ==== Exerciții Time==== # Afișați data curentă în următoarele formate: #* numărul de secunde începând cu epoca Unix (1 ianuarie 1970). #* ziua și luna curentă în format numeric, separate prin minus. # Afișați zilele din luna curentă (Hint: {{{ncal}}}). # Afișați data Paștelui ortodox (Hint: {{{ncal}}}). # Afișați data Paștelui ortodox pentru anul 2011. # Configurați data curentă la valoarea de 1 ianuarie 2011. # Afișați timpul hardware (Hint: {{{hwclock}}}). # Configurați data curentă la valoarea dată de timpul hardware. # Instalați pachetul {{{ntpdate}}}. #* Verificați în fișierul {{{/etc/default/ntpdate}}} serverele folosite pentru sincronizare folosind NTP. # Afișați data curentă, inclusiv secundele. # Folosiți {{{ntpdate}}} pentru sincronizarea la unul dintre serverele menționate în cadrul fișierului de mai sus. #* Trebuie să transmiteți numele serverului ca argument comenzii {{{ntpdate}}}. #** Puteți folosi un server din [[http://www.pool.ntp.org/zone/ro | pool-ul din România]]. # Reafișați data curentă, inclusiv secundele. # Dacă doriți să configurați permanent servere NTP care să fie consultate, puteți scrie numele serverelor în fișierul ''/etc/ntp.conf'' și să activați optiunea necesară în fișierul ''/etc/default/ntpdate''. #* După aceasta rulați, fără argumente, comanda ''ntpdate-debian'' care va consulta serverele din ''/etc/ntp.conf''. #* Comanda ''ntpdate'' nu consultă fișiere de configurare. Pentru aceasta folosim comanda ''ntpdate-debian''. #** Comanda ''ntpdate-debian'' este un script shell (wrapper) peste ''ntpdate''. Puteți urmări conținutul ei prin intermediul comenzii vi /usr/sbin/ntpdate-debian