User Tools

Site Tools


advanced-unix:capitole:capitol-04

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

  1. Intrați în /dev și faceți un long listing a conținutului:
    cd /dev/ ; ls -la
  2. 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)
  3. 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.
  4. Listați conținutul lui /dev/random
    cat /dev/random
    • Folosiți ctrl-c pentru a opri procesul cat.
  5. Î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.
  6. 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.
  7. Intrați în /proc, listați conținutul direcorului și observați fișierele și directoarele disponibile.
  8. 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.
  9. 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
  10. 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
  11. Folosiți comenzile lspci și lsusb pentru a lista dispozitivele de tip PCI și USB din sistem.

Exerciții de investigare hardware

  1. 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).
  2. Listați toate fișierele ce reprezintă partitiile discului sda.
  3. Listați toate dispozitivele de tip bloc din sistem (Indiciu: /dev, grep, ^b, cut).
  4. Listați toate dispozitivele de tip caracter din sistem (Indiciu: /dev, grep, ^c, cut).
  5. Găsiți tipul procesorului din sistem.
  6. Afșați informații despre tipurile de dispozitive din sistem, folosind fișiereul /proc/devices.
  7. Aflați care este tipul plăcii de rețea și tipul plăcii video.
  8. 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).
  9. 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 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 lscpu și nproc).
  • versiunea kernelului de Linux (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 lsblk, lshw, hwinfo, 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:

  1. Afișează informațiile aferente o singură dată.
  2. Afișează informațiile aferente la fiecare 5 secunde.
  3. 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 aici. Pentru a descărca acele imagini (filesystem, kernel, initial ramdisk) mai rapid, folosiți resursele de 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 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).

advanced-unix/capitole/capitol-04.txt · Last modified: 2016/05/11 13:14 by razvan