User Tools

Site Tools


advanced-unix:capitole:capitol-04

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
advanced-unix:capitole:capitol-04 [2016/05/09 01:20]
razvan created
advanced-unix:capitole:capitol-04 [2016/05/11 13:14] (current)
razvan [Monitorizare cu sar]
Line 1: Line 1:
 ====== 4. Investigarea sistemului ====== ====== 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 ===== ===== 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 ===== ===== Resurse utile =====
Line 7: Line 38:
 ===== Exerciții ===== ===== 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:​ <code bash>
 +cd /dev/ ; ls -la
 +</​code>​
 +# 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 <code bash>
 +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
 +</​code>​
 +  * 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''​ <code bash>
 +cat /dev/random
 +</​code>​
 +  * Folosiți **ctrl-c** pentru a opri procesul ''​cat''​.
 +# Încercați să scrieți un text în fișierul ''/​dev/​full''​. <code bash>
 +echo "​test">/​dev/​full
 +</​code>​
 +  * 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). <code bash>
 +dd if=/​dev/​zero of=~/zeros bs=1KB count=1
 +</​code>​
 +  * 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. <code bash>
 +alexj@hathor ~ $ strace -e open uptime 2>&1 |grep "/​proc"​
 +open("/​proc/​uptime",​ O_RDONLY) ​         = 3
 +open("/​proc/​loadavg",​ O_RDONLY) ​        = 4
 +</​code>​
 +# Intrați în directorul din ''/​proc''​ corespunzător procesului bash în care sunteți și listați conținutul. <code bash>
 +cd /proc/$$; ls -la
 +</​code>​
 +  * 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''​.
 +
 +<note tip>
 +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''​.
 +</​note>​
 +
 +==== 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):
 +
 +<code bash>
 +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: ...
 +</​code>​
 +
 +==== 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]].
 +
 +<note important>​
 +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<​code>​
 +uname -a
 +</​code>​
 +</​note>​
 +
 +<note tip>
 +Nu va merge comanda ''​ping''​ pe mașina virtuală, dar merge ''​wget''​ sau alte comenzi care au de-a face cu accesul la Internet.
 +</​note>​
 +
 +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''​).
 +
 +<​note>​
 +**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''​).
 +</​note>​
advanced-unix/capitole/capitol-04.1462746017.txt.gz · Last modified: 2016/05/09 01:20 by razvan