====== 4. Investigarea sistemului ======
Din rațiuni precum documentare, monitorizare, depanare, informare statistică ne propunem să investigăm un sistem. Investigarea unui sistem presupune investigarea componentelor acestora, precum:
* investigarea proceselor
* investigarea sistemului de fișiere
* investigarea aplicațiilor/pachetelor
* investigarea sistemului de operare (kernel, distribuție)
* investigarea hardware-ului și a resurselor consumate
* investigarea rețelei și serviciilor
===== Subiecte abordate =====
* Investigarea proceselor
* Investigarea sistemului de fișiere
* Investigarea aplicațiilor/pachetelor
* Investigarea sistemului de operare (kernel, distribuție)
* Investigarea hardware-ului și a resurselor consumate
* Investigarea rețelei și serviciilor
==== Best practices ====
* Monitorizare continuă vs. stare curentă
* Utlitare de afișare și utilitare/fișiere care pot fi prelucrate
* Investigarea este un mijloc, nu un obiectiv
==== Utilitare folosite ====
* ''ps'', ''top'', ''time'', ''lsof'', ''strace'', ''/proc''
* ''ls -l'', ''file'', ''stat'', ''df''
* ''dpkg -l'', ''dpkg -L'', ''dpkg -S'', ''apt-file'', ''apt-cache''
* ''/etc/issue'', ''lsb_release'', ''uname'', ''/proc/cmdline'', ''/boot''
* ''/dev'', ''/proc/cpuinfo'', ''/proc/meminfo'', ''lscpu'', ''free'', ''uptime'', ''pidstat'', ''mpstat'', ''vmstat'', ''iostat'', ''iotop'', ''lspci'', ''lshw'', ''inxi'', ''lsusb'', ''dstat'', ''lsblk'', ''/dev'', ''%%/dev/disk/by-...%%''
* ''ip'', ''ip a s'', ''ip l s'', ''ip r s'', ''/etc/resolv.conf'', ''netstat'', ''ss'', ''vnstat'', ''iptraf'', ''nethogs''
* ''xxd'', ''hexdump''
===== Resurse utile =====
===== Exerciții =====
==== Demo-uri ====
Investigarea proceselor cu ''strace'' și ''time''. Văzut cum se folosește ''/proc''.
Căutarea de pachete ce conțin un fișier folosind ''apt-file''.
Căutarea în pachete folosind ''dpkg''.
Obținerea memoriei libere (**doar** a memoriei libere).
Aflarea adresei IP a sistemului.
Aflarea adresei IP publice a sistemului.
==== Tutoriale de investigație hardware ====
# Intrați în ''/dev'' și faceți un long listing a conținutului:
cd /dev/ ; ls -la
# Observați informațiile prezentate și identificați ce este diferit față de un fișier normal.
* tipul fișierului este ''%%'c'%%'' sau ''%%'b'%%'' (în loc de ''%%'-'%%'' sau ''%%'d'%%'')
* în loc de mărimea fișerului aveți o pereche de numere (numite **număr major** și ** număr minor**)
# Listați în format lung toate dispozitivele de tipul tty, apoi toate dispozitive de tip harddisk sau partiție
alexj@hathor /dev $ ls -la tty*
crw--w---- 1 root tty 4, 0 Mar 16 18:27 tty0
crw-rw---- 1 root tty 4, 1 Mar 16 18:27 tty1
crw--w---- 1 root tty 4, 10 Mar 16 18:27 tty10
crw--w---- 1 root tty 4, 11 Mar 16 18:27 tty11
crw--w---- 1 root tty 4, 12 Mar 16 18:27 tty12
crw--w---- 1 root tty 4, 13 Mar 16 18:27 tty13
[...]
alexj@hathor /dev $ ls -la [sh]d*
brw-rw---- 1 root disk 8, 0 Mar 22 17:48 sda
brw-rw---- 1 root disk 8, 1 Mar 16 18:27 sda1
brw-rw---- 1 root disk 8, 2 Mar 22 12:21 sda2
brw-rw---- 1 root disk 8, 5 Mar 16 18:27 sda5
brw-rw---- 1 root disk 8, 16 Mar 22 12:21 sdb
brw-rw---- 1 root disk 8, 17 Mar 16 18:27 sdb1
* Observați faptul că fiecare intrare care aparține aceluiași hardware are acelasi număr major, dar fiecare are un număr minor diferit.
# Listați conținutul lui ''/dev/random''
cat /dev/random
* Folosiți **ctrl-c** pentru a opri procesul ''cat''.
# Încercați să scrieți un text în fișierul ''/dev/full''.
echo "test">/dev/full
* Observați mesajul de eroare. Pseudodispozitivul simulează un dispozitiv ce nu mai poate accepta date pentru că este umplut.
# Folosind utilitarul **dd**, creați un fișier de 1KB ce conține doar zerouri (nu caracterul '0' ci caracterul cu codul ASCII 0).
dd if=/dev/zero of=~/zeros bs=1KB count=1
* Folosiți utilitarul **hexdump** sau **xxd** pentru a vizualiza conținutul fișierului zeros.
# Intrați în ''/proc'', listați conținutul direcorului și observați fișierele și directoarele disponibile.
# Vizualizați conținutul fișierelor ''/proc/cpuinfo'', ''/proc/meminfo'', ''/proc/interrupts'' și ''/proc/ioports''.
* Fișierele conțin informații despre procesor, memoria fizică, întreruperile hardware din sistem și porturile IO pentru dispozitive.
# Folosiți comanda **strace** pentru a vizualiza apelurile de sistem "open" făcute de comanda **uptime**. Izolați doar deschiderile de fisiere din ''/proc''. Vizualizati apoi conținutul fișerelor din ''/proc'' găsite.
alexj@hathor ~ $ strace -e open uptime 2>&1 |grep "/proc"
open("/proc/uptime", O_RDONLY) = 3
open("/proc/loadavg", O_RDONLY) = 4
# Intrați în directorul din ''/proc'' corespunzător procesului bash în care sunteți și listați conținutul.
cd /proc/$$; ls -la
* vizualizați conțintul fișierului ''status''
* vizualizati conținutul fisierului ''cmdline''
* vizulizati folosind long listing conținutul directorului ''fd''
# Folosiți comenzile **lspci** și **lsusb** pentru a lista dispozitivele de tip PCI și USB din sistem.
==== Exerciții de investigare hardware ====
# Listați toate fișierele ce reprezintă discurile de tip ATA (adică cele al căror nume începe cu ''hd'') sau SATA (adică cele al căror nume începe cu ''sd'') din sistem (**Indiciu**: ''/dev'', ''grep'').
# Listați toate fișierele ce reprezintă partitiile discului ''sda''.
# Listați toate dispozitivele de tip bloc din sistem (**Indiciu**: ''/dev'', ''grep'', ''^b'', ''cut'').
# Listați toate dispozitivele de tip caracter din sistem (**Indiciu**: ''/dev'', ''grep'', ''^c'', ''cut'').
# Găsiți tipul procesorului din sistem.
# Afșați informații despre tipurile de dispozitive din sistem, folosind fișiereul ''/proc/devices''.
# Aflați care este tipul plăcii de rețea și tipul plăcii video.
# Deschideți folosind vim fișierul ''/etc/passwd''.
* Găsiți pid-ul procesului nou deschis și intrați în directorul din ''/proc'' corespunzător.
* Gasiti fișierul ce conține comanda cu care a fost deschis procesul.
* Găsiți fișierele deschise de proces (**Indiciu**: ''fd'' sau ''lsof'').
# Folosiți comanda ''lsmod'' pentru a lista modulele de nucleu inserate.
* Folosind ''strace'' pe comanda precedentă, aflați din ce fișier din ''/proc'' obține ''lsmod'' informațiile.
==== Exerciții de investigare hardware suplimentare ====
Afișați informații despre utilizarea resurselor sistemului:
* câți utilizatori sunt online
* câte procese sunt active
* cât spațiu este ocupat pe fiecare din partițiile sistemului
* cât procesor este ocupat
* câtă memorie este ocupată
* cât spațiu de swap este ocupat
* ce trafic este curent pe placa de rețea (**hint**: ''nethogs'', ''iptraf'')
Pentru a afișa într-un format simplu informații despre monitorizarea sistemului puteți folosi utilitarul ''dstat''.
Afișați informații despre sistem precum:
* dacă procesorul are suport de virtualizare
* care este dimensiunea memoriei cache
* ce sistem de fișiere se găsește pe fiecare partiție
* care este viteza maximă de lucru pentru HDD (**hint**: ''hdparm'')
Din fișierul de [[http://lpic.ro/res/skel/sandbox.kext_iOS9.3|aici]] dorim să extragem partea care începe de la offset-ul ''0x13000'' (în hexazecimal) până la sfârșit. Puneți conținutul într-un alt fișier. Afișați conținutul primilor 16 octeți din fișier în format hexazecimal; output-ul trebuie să fie de forma ''0080 b67f 6a01 7900 1180 0000 b57f b57f''.
Pentru a extrage o parte dintr-un fișier folosiți comanda ''dd''. Folosiți opțiunea ''skip'' a ''dd''.
Pentru că operați pe octeți, nu pe blocuri, va trebui să configurați pentru ''dd'' dimensiunea blocului la ''1'' folosind opțiunea ''bs''.
==== Informații despre sistem ====
Determinați următoarele informații despre sistem. Puteți folosi oricare dintre comenzile pe care le cunoașteți:
* numele stației de lucru (''/etc/hostname'')
* tipul și versiunea distribuției (''/etc/issue'' sau ''lsb_release'')
* arhitectura procesorului (x86, x86_64, aarch64, armv7 etc.) și numărul de core-uri (Indicație: ''/proc/cpuinfo'' sau [[http://linux.die.net/man/1/lscpu|lscpu]] și [[http://linux.die.net/man/1/nproc|nproc]]).
* versiunea kernelului de Linux ([[http://linux.die.net/man/1/uname|uname]])
* dimensiunea totală a memoriei RAM, memoria folosită și memoria liberă
* numărul de partiții din sistem
* modelul hard disk-ului, device-ul (Indicație: puteți folosi/prelucra output-ul comenzilor [[http://linux.die.net/man/8/lsblk|lsblk]], [[http://linux.die.net/man/1/lshw|lshw]], [[http://www.binarytides.com/linux-hwinfo-command/|hwinfo]], [[http://www.binarytides.com/inxi-system-information-linux/|inxi]]
* cât spațiu mai este disponibil pe hard disk
Agregați informațiile/comenzile obținute mai sus într-un script care să aibă un output similar cu formatul de mai jos (nu trebuie să fie strict ca în exemplul de mai jos):
hostname: ...
distribution: ...
architecture type: ...
kernel version: ...
total memory: ...
used memory: ...
free memory: ...
number of partitions: ...
hard disk model: ...
hard disk device: ...
hard disk free space: ...
NIC (Network Interface Card) model: ...
graphics card model: ...
monitor model: ...
==== Informații despre pachete ====
Determinați pachetul care conține fișierul header {{{gdk.h}}}. **Hint**: Puteți căuta după șirul {{{/gdk.h}}} ca să căutați pachetele care conțin fix fișierul ''gdk.h''.
Listați pachetele din repository care încep cu șirul {{{"di"}}}. **Indiciu**: Folosiți ''apt-cache pkgnames''.
Din ce pachet face parte utilitarul ''ifconfig''?
Ce executabile sunt conținute în pachetul ''sysstat''? Dar în pachetul ''coreutils''? **Indiciu**: Executabilele sunt cele care se găsesc într-un director care se termină în ''bin/''.
==== Monitorizare cu sar ====
Folosiți utilitarele ''iostat'', ''pidstat'' și ''mpstat'' pentru a monitoriza informații despre sistem. Realizați rulări care:
- Afișează informațiile aferente **o singură dată**.
- Afișează informațiile aferente la fiecare 5 secunde.
- Afișați, acolo unde se poate, informații doar pentru procesul shell curent (PID-ul său este indicat de construcția ''$$'').
==== Rulare mașină virtuală ARM ====
Pentru a rula un întreg sistem sub ARM folosiți comanda ''qemu-system-arm'' și indicațiile de [[http://www.red-lang.org/2012/03/setting-up-arm-virtual-machine.html|aici]]. Pentru a descărca acele imagini (filesystem, kernel, initial ramdisk) mai rapid, folosiți resursele de [[http://titan.cs.pub.ro/~razvan/store/arm/|aici]].
Pentru accesarea mașinii virtuale folosiți numele de utilizator ''root'' cu parola ''root''.
Pentru a afla informații despre mașina virtuală proaspăt pornită rulați comanda
uname -a
Nu va merge comanda ''ping'' pe mașina virtuală, dar merge ''wget'' sau alte comenzi care au de-a face cu accesul la Internet.
Pentru a copia programul compilat static anterior urmăriți [[http://www.red-lang.org/2012/03/setting-up-arm-virtual-machine.html|indicațiile]] legate de folosirea SSH pentru copiere (opțiunea ''-redir tcp:2222::22'' la ''qemu-system-arm'').
**Opțional**: Instalați ''vim'' pe mașina virtuală QEMU de ARM.
Pentru aceasta va trebui să editați fișierul ''/etc/apt/sources.list'' și să folosiți URL-uri de forma ''archive.debian.org'' în loc de ''ftp.debian.org''. Comentați liniile finale care conțin șirul ''squeeze-updates'' (cu ''-'', adică ''minus'').