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