4.3 Lezione 2
Certificazione: |
Linux Essentials |
---|---|
Versione: |
1.6 |
Argomento: |
4 Il Sistema Operativo Linux |
Obiettivo: |
4.3 Dove Sono Memorizzati i Dati |
Lezione: |
2 di 2 |
Introduzione
Dopo aver esplorato i programmi e i loro file di configurazione, in questa lezione impareremo come i comandi vengano eseguiti come processi. Allo stesso modo, ci occuperemo dei messaggi di sistema, dell’uso del kernel ring buffer e di come l’avvento di systemd
e del suo demone di journal, journald
, abbiano cambiato il tradizionale modo di trattare i log di sistema.
Processi
Ogni volta che un utente lancia un comando, viene eseguito un programma e vengono generati uno o più processi.
I processi sono organizzati gerarchicamente. Dopo che il kernel è stato caricato in memoria durante l’avvio, viene avviato il primo processo che, a sua volta, avvia altri processi che, a loro volta, possono avviare altri processi. Ogni processo ha un identificativo univoco (PID
) e un identificativo del processo padre (PPID
). Questi sono numeri interi positivi assegnati in ordine sequenziale.
Esplorare i Processi in Modo Dinamico: top
Puoi ottenere un elenco dinamico di tutti i processi in esecuzione con il comando top
:
$ top top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14 Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie %Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 436 carol 20 0 42696 3624 3060 R 0,7 0,4 0:00.30 top 4 root 20 0 0 0 0 S 0,3 0,0 0:00.12 kworker/0:0 399 root 20 0 95204 6748 5780 S 0,3 0,7 0:00.22 sshd 1 root 20 0 56872 6596 5208 S 0,0 0,6 0:01.29 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0,0 0,0 0:00.02 ksoftirqd/0 5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kworker/u2:0 7 root 20 0 0 0 0 S 0,0 0,0 0:00.08 rcu_sched 8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0,0 0,0 0:00.00 migration/0 10 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 lru-add-drain (...)
Come mostrato nell’esempio sopra riportato, top
fornisce anche informazioni sulla memoria e sul consumo di CPU dell’intero sistema così pure per ogni processo.
top
consente all’utente alcune interazioni.
Per impostazione predefinita, l’output viene ordinato, in ordine descrescente, in base alla percentuale del tempo di CPU utilizzato da ciascun processo. Questo comportamento può essere modificato premendo i seguenti tasti all’interno di top
:
M
-
Ordina per utilizzo della memoria.
N
-
Ordina in base al numero di ID di processo.
T
-
Ordina per tempo di esecuzione.
P
-
Ordina per percentuale di utilizzo della CPU.
Per cambiare ordinamento decrescente/crescente, basta premere R
.
Tip
|
Una versione più carina e più facile da utilizzare di |
Un’Istantanea dei Processi: ps
Un altro comando molto utile per ottenere informazioni sui processi è ps
. Mentre top
fornisce informazioni dinamiche, quelle di ps
sono statiche.
Se invocato senza opzioni, l’output di ps
è abbastanza soddisfacente e si riferisce solo ai processi collegati alla shell corrente:
$ ps PID TTY TIME CMD 2318 pts/0 00:00:00 bash 2443 pts/0 00:00:00 ps
Le informazioni visualizzate includono l’identificativo di processo (PID
), il terminale in cui viene eseguito il processo (TTY
), il tempo di CPU utilizzato dal processo (TIME
) e il comando che ha avviato il processo (CMD
).
Un’opzione utile per ps
è -f
che mostra l’elenco in formato completo:
$ ps -f UID PID PPID C STIME TTY TIME CMD carol 2318 1682 0 08:38 pts/1 00:00:00 bash carol 2443 2318 0 08:46 pts/1 00:00:00 ps -f
In combinazione con altre opzioni, -f
mostra la relazione tra i processi “padre” e “figlio”:
$ ps -uf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND carol 2318 0.0 0.1 21336 5140 pts/1 Ss 08:38 0:00 bash carol 2492 0.0 0.0 38304 3332 pts/1 R+ 08:51 0:00 \_ ps -uf carol 1780 0.0 0.1 21440 5412 pts/0 Ss 08:28 0:00 bash carol 2291 0.0 0.7 305352 28736 pts/0 Sl+ 08:35 0:00 \_ emacs index.en.adoc -nw (...)
Allo stesso modo, ps
può mostrare la percentuale di memoria utilizzata quando viene invocato con l’opzione -v
:
$ ps -v PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 1163 tty2 Ssl+ 0:00 1 67 201224 5576 0.1 /usr/lib/gdm3/gdm-x-session (...) (...)
Note
|
Un altro comando, carino dal punto di vista estetico, che mostra la gerarchia dei processi è |
Informazioni sui Processi nella Directory /proc
Abbiamo già visto il filesystem /proc
. /proc
include una sottodirectory numerata per ogni processo in esecuzione nel sistema (il numero è il PID
del processo):
carol@debian:~# ls /proc 1 108 13 17 21 27 354 41 665 8 9 10 109 14 173 22 28 355 42 7 804 915 103 11 140 18 23 29 356 428 749 810 918 104 111 148 181 24 3 367 432 75 811 105 112 149 19 244 349 370 433 768 83 106 115 15 195 25 350 371 5 797 838 107 12 16 2 26 353 404 507 798 899 (...)
Pertanto, tutte le informazioni su un particolare processo sono incluse nella sua directory. Elenchiamo il contenuto del primo processo, ovvero quello il cui PID
è 1
(l’output è stato troncato per una migliore leggibilità):
# ls /proc/1/ attr cmdline environ io mem ns autogroup comm exe limits mountinfo numa_maps auxv coredump_filter fd loginuid mounts oom_adj ...
Puoi controllare, per esempio, l’eseguibile del processo:
# cat /proc/1/cmdline; echo /sbin/init
Come puoi vedere il binario che ha avviato la gerarchia dei processi è /sbin/init
.
Note
|
I comandi possono essere concatenati con il punto e virgola ( |
Il Carico di Sistema
In un sistema ogni processo può potenzialmente consumare risorse. Il così detto carico di sistema cerca di aggregare il carico complessivo del sistema in un unico indicatore numerico. Puoi vedere il carico corrente con il comando uptime
:
$ uptime 22:12:54 up 13 days, 20:26, 1 user, load average: 2.91, 1.59, 0.39
Le ultime tre cifre indicano rispettivamente il carico medio del sistema nell’ultimo minuto (2.91
), negli ultimi cinque minuti (1.59
) e negli ultimi quindici minuti (0.39
).
Ciascuno di questi numeri indica quanti processi erano in attesa o delle risorse della CPU o del completamento delle operazioni di input/output. Ciò significa che questi processi erano pronti per essere eseguiti se avessero ricevuto le rispettive risorse.
Log di Sistema e Messaggistica di Sistema
Non appena il kernel e i processi iniziano a essere eseguiti e a comunicare tra loro, vengono prodotte molte informazioni. La maggior parte viene inviata ai file: i cosiddetti file di log o, semplicemente, log.
Senza i log, la ricerca di un evento accaduto su un server darebbe molti grattacapi agli amministratori di sistema: da qui l’importanza di avere un modo standardizzato e centralizzato per tenere traccia di tutti gli eventi di sistema. Inoltre, i log sono fondamentali e danno indicazioni quando si tratta di individuare e risolvere problemi e per la sicurezza, nonché sono fonti di dati affidabili per comprendere le statistiche di sistema e fare previsioni future.
Log con il Demone syslog
Tradizionalmente, i messaggi di sistema venivano gestiti dallo strumento di log standard, syslog, o da uno qualsiasi dei suoi derivati: syslog-ng o rsyslog. Il demone di log raccoglie i messaggi da altri servizi e programmi e li memorizza in file di log, tipicamente sotto /var/log
. Tuttavia, alcuni servizi si occupano dei propri log (considera, per esempio, il server web Apache HTTPD). Allo stesso modo, il kernel Linux utilizza un ring buffer in memoria per archiviare i propri messaggi di log.
File di Log in /var/log
Poiché i log sono dati che variano nel tempo, normalmente si trovano in /var/log
.
Se esplori /var/log
, ti renderai conto che i nomi dei log sono, in una certo modo, abbastanza autoesplicativi. Alcuni esempi includono:
/var/log/auth.log
-
Memorizza informazioni sull’autenticazione.
/var/log/kern.log
-
Memorizza informazioni del kernel.
/var/log/syslog
-
Memorizza informazioni di sistema.
/var/log/messages
-
Memorizza i dati di sistema e delle applicazioni.
Note
|
Il nome preciso e il contenuto dei file di log possono variare a seconda della distribuzione Linux utilizzata . |
Accedere ai File di Log
Quando esplori i file di log, ricorda di essere root (se non hai i permessi di lettura) e usa un paginatore come less
;
# less /var/log/messages Jun 4 18:22:48 debian liblogging-stdlog: [origin software="rsyslogd" swVersion="8.24.0" x-pid="285" x-info="http://www.rsyslog.com"] rsyslogd was HUPed Jun 29 16:57:10 debian kernel: [ 0.000000] Linux version 4.9.0-8-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.130-2 (2018-10-27) Jun 29 16:57:10 debian kernel: [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-8-amd64 root=/dev/sda1 ro quiet
In alternativa, puoi usare tail
con l’opzione -f
per leggere i messaggi più recenti del file e mostrare dinamicamente le nuove righe man mano che vengono aggiunte:
# tail -f /var/log/messages Jul 9 18:39:37 debian kernel: [ 2.350572] RAPL PMU: hw unit of domain psys 2^-0 Joules Jul 9 18:39:37 debian kernel: [ 2.512802] input: VirtualBox USB Tablet as /devices/pci0000:00/0000:00:06.0/usb1/1-1/1-1:1.0/0003:80EE:0021.0001/input/input7 Jul 9 18:39:37 debian kernel: [ 2.513861] Adding 1046524k swap on /dev/sda5. Priority:-1 extents:1 across:1046524k FS Jul 9 18:39:37 debian kernel: [ 2.519301] hid-generic 0003:80EE:0021.0001: input,hidraw0: USB HID v1.10 Mouse [VirtualBox USB Tablet] on usb-0000:00:06.0-1/input0 Jul 9 18:39:37 debian kernel: [ 2.623947] snd_intel8x0 0000:00:05.0: white list rate for 1028:0177 is 48000 Jul 9 18:39:37 debian kernel: [ 2.914805] IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready Jul 9 18:39:39 debian kernel: [ 4.937283] e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX Jul 9 18:39:39 debian kernel: [ 4.938493] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready Jul 9 18:39:40 debian kernel: [ 5.315603] random: crng init done Jul 9 18:39:40 debian kernel: [ 5.315608] random: 7 urandom warning(s) missed due to ratelimiting
L’output avrà il seguente formato:
-
Timestamp
-
Nome dell’host da cui proviene il messaggio
-
Nome del programma/servizio che ha generato il messaggio
-
Il PID del programma che ha generato il messaggio
-
Descrizione del fatto che si è verificato
La maggior parte dei file di log sono scritti in testo normale; tuttavia, alcuni possono contenere dati binari come /var/log/wtmp
, che memorizza i dati relativi agli accessi riusciti. Puoi utilizzare il comando file
per determinare di volta in volta qual è il caso:
$ file /var/log/wtmp /var/log/wtmp: dBase III DBT, version number 0, next free block index 8
Questi file vengono normalmente letti utilizzando comandi speciali. last
viene utilizzato per interpretare i dati in /var/log/wtmp
:
$ last carol tty2 :0 Thu May 30 10:53 still logged in reboot system boot 4.9.0-9-amd64 Thu May 30 10:52 still running carol tty2 :0 Thu May 30 10:47 - crash (00:05) reboot system boot 4.9.0-9-amd64 Thu May 30 09:11 still running carol tty2 :0 Tue May 28 08:28 - 14:11 (05:42) reboot system boot 4.9.0-9-amd64 Tue May 28 08:27 - 14:11 (05:43) carol tty2 :0 Mon May 27 19:40 - 19:52 (00:11) reboot system boot 4.9.0-9-amd64 Mon May 27 19:38 - 19:52 (00:13) carol tty2 :0 Mon May 27 19:35 - down (00:03) reboot system boot 4.9.0-9-amd64 Mon May 27 19:34 - 19:38 (00:04)
Note
|
Analogamente a |
Rotazione dei Log
I file di log possono crescere molto in poche settimane o in pochi mesi e occupare tutto lo spazio libero sul disco. Per risolvere questo problema, viene utilizzata l’utility logrotate
. Implementa la rotazione o il ciclo dei log che implica azioni come rinominare i file di log, archiviarli e/o comprimerli, a volte inviandoli tramite e-mail all’amministratore di sistema, ed eventualmente eliminandoli man mano che invecchiano. Esistono diverse convenzioni utilizzate per assegnare i nomi a questi file di log ruotati (per esempio l’aggiunta di un suffisso con la data); tuttavia, è pratica comune aggiungere semplicemente un suffisso con un numero intero:
# ls /var/log/apache2/ access.log error.log error.log.1 error.log.2.gz other_vhosts_access.log
Nota come error.log.2.gz
sia già stato compresso con gzip
(da qui il suffisso .gz
).
Il Kernel Ring Buffer
Il kernel ring buffer è una struttura dati a dimensione fissa che registra i messaggi del kernel sia durante il processo di avvio sia in tempo reale. La funzione di questo buffer è molto importante e consiste nel registrare tutti i messaggi del kernel generati all’avvio quando syslog
non è ancora disponibile. Il comando dmesg
stampa il kernel ring buffer (che era anche memorizzato in /var/log/dmesg
). A causa delle grandi dimensioni del ring buffer, questo comando viene normalmente utilizzato in combinazione con l’utilità di filtraggio del testo grep
o con un paginatore come less
. Per esempio, per cercare i messaggi di avvio:
$ dmesg | grep boot [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet [ 0.000000] smpboot: Allowing 1 CPUs, 0 hotplug CPUs [ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet [ 0.144986] AppArmor: AppArmor disabled by boot time parameter (...)
Note
|
Man mano che il kernel ring buffer cresce nel tempo con nuovi messaggi, quelli più vecchi scompaiono. |
Il Journal di Sistema: systemd-journald
A partire dal 2015, systemd ha sostituito SysV Init come gestore di sistema e dei servizi de facto nella maggior parte delle principali distribuzioni Linux. Di conseguenza, il demone del journal — journald — è diventato il componente di log standard, sostituendo syslog per la maggior parte degli aspetti. I dati non vengono più memorizzati in testo normale ma in formato binario. Quindi, l’utility journalctl
è necessaria per leggere i log. Inoltre, journald è compatibile con syslog e può essere integrato con esso.
journalctl
è l’utility usata per leggere e interrogare il database del journal di systemd. Se invocato senza opzioni, stampa l’intero journal:
# journalctl -- Logs begin at Tue 2019-06-04 17:49:40 CEST, end at Tue 2019-06-04 18:13:10 CEST. -- jun 04 17:49:40 debian systemd-journald[339]: Runtime journal (/run/log/journal/) is 8.0M, max 159.6M, 151.6M free. jun 04 17:49:40 debian kernel: microcode: microcode updated early to revision 0xcc, date = 2019-04-01 Jun 04 17:49:40 debian kernel: Linux version 4.9.0-8-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) Jun 04 17:49:40 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-8-amd64 root=/dev/sda1 ro quiet (...)
Tuttavia, se invocato con le opzioni -k
o --dmesg
, è equivalente all’uso del comando dmesg
:
# journalctl -k [ 0.000000] Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.168-1+deb9u2 (2019-05-13) [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet (...)
Altre opzioni interessanti per journalctl
sono:
-b
,--boot
-
Mostra le informazioni di avvio.
-u
-
Mostra i messaggi relativi a un’unità specificata. Grosso modo, una unità può essere definita come una qualsiasi risorsa gestita da systemd. Per esempio, il comando
journalctl -u apache2.service
viene utilizzato per leggere i messaggi relativi al server webapache2
. -f
-
Mostra i messaggi più recenti del journal e continua a stampare le nuove voci man mano che vengono aggiunte al journal, in modo molto simile a
tail -f
.
Esercizi Guidati
-
Dai un’occhiata al seguente elenco prodotto dal comando
top
e rispondi alle domande di seguito riportate:carol@debian:~$ top top - 13:39:16 up 31 min, 1 user, load average: 0.12, 0.15, 0.10 Tasks: 73 total, 2 running, 71 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.1 us, 0.4 sy, 0.0 ni, 98.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1020332 total, 698700 free, 170664 used, 150968 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 710956 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 605 nobody 20 0 1137620 132424 34256 S 6.3 13.0 1:47.24 ntopng 444 www-data 20 0 364780 4132 2572 S 0.3 0.4 0:00.44 apache2 734 root 20 0 95212 7004 6036 S 0.3 0.7 0:00.36 sshd 887 carol 20 0 46608 3680 3104 R 0.3 0.4 0:00.03 top 1 root 20 0 56988 6688 5240 S 0.0 0.7 0:00.42 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.87 kworker/0:0 (...)
-
Quali processi sono stati avviati dall’utente
carol
? -
Quale directory virtuale in
/proc
dovresti visitare per cercare i dati riguardanti il comandotop
? -
Quale processo è stato eseguito per primo? Come l’hai capito?
-
Completa la seguente tabella specificando in quale zona dell’output di
top
si trovano le seguenti informazioni:Informazioni su … Area di Riepilogo Area delle Attività Memoria
Swap
PID
Tempo di CPU
Comandi
-
-
Quale comando viene utilizzato per leggere i seguenti log binari?
-
/var/log/wtmp
-
/var/log/btmp
-
/run/log/journal/2a7d9730cd3142f4b15e20d6be631836/system.journal
-
-
Quali comandi potresti utilizzare, in combinazione con
grep
, per scoprire le seguenti informazioni sul tuo sistema Linux?-
Quando il sistema è stato riavviato l’ultima volta (
wtmp
) -
Quali dischi rigidi sono installati (
kern.log
) -
Quando è avvenuto l’ultimo login (
auth.log
)
-
-
Indica i due comandi che potresti utilizzare per visualizzare il kernel ring buffer.
-
Indica dove puoi trovare i seguenti messaggi di log:
-
Jul 10 13:37:39 debian dbus[303]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 11:23:58 debian kernel: [ 1.923349] usbhid: USB HID core driver
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 14:02:53 debian sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0)
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 11:23:58 debian NetworkManager[322]: <info> [1562750638.8672] NetworkManager (version 1.6.2) is starting…
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
-
Usa
journalctl
per trovare informazioni sulle seguenti unità:Unità Comando ssh
networking
rsyslog
cron
Esercizi Esplorativi
-
Prendi nuovamente in considerazione l’output del comando
top
mostrato negli esercizi guidati e rispondi alle seguenti domande:-
Quali sono i due passaggi per terminare il server web apache?
-
Nell’area di riepilogo, come puoi visualizzare le informazioni sulla memoria fisica e di swap utilizzando delle barre di avanzamento?
-
Ora, ordina i processi in base all’utilizzo della memoria:
-
Ora che le informazioni sulla memoria sono visualizzate con delle barre di avanzamento e che i processi sono ordinati in base all’utilizzo della memoria, salva queste configurazioni in modo da averle come predefinite per la prossima volta che utilizzerai
top
: -
Quale file memorizza le impostazioni di configurazione di
top
? Dove si trova? Come puoi verificarne l’esistenza?
-
-
Approfondisci il comando
exec
in Bash. Prova a mostrarne il funzionamento: avvia una sessione Bash e trova il processo Bash conps
; esegui poiexec /bin/sh
e cerca di nuovo il processo con lo stesso PID. -
Segui questi passaggi per esplorare gli eventi del kernel e la gestione dinamica dei dispositivi da parte di udev:
-
Collega un’unità USB al tuo computer. Esegui
dmesg
e presta attenzione alle ultime righe. Qual è la riga più recente? -
Tenendo presente l’output del comando precedente, esegui
ls /dev/sd*
e assicurati che la tua unità USB sia visualizzata nell’elenco. Qual è l’output? -
Ora rimuovi l’unità USB ed esegui di nuovo
dmesg
. Che cosa mostra la riga più recente? -
Esegui di nuovo
ls /dev/sd*
e assicurati che il tuo dispositivo sia scomparso dall’elenco. Qual è l’output?
-
Sommario
Nel contesto dell’archiviazione dei dati, in questa lezione sono stati discussi i seguenti argomenti: gestione dei processi e log e messaggistica di sistema.
Per quanto riguarda la gestione dei processi, abbiamo appreso quanto segue:
-
I programmi generano processi e i processi sono organizzati gerarchicamente;
-
Ogni processo ha un identificativo univoco (
PID
) e un identificativo del processo padre (PPID
); -
top
è un comando molto utile per esplorare in modo dinamico e interattivo i processi in esecuzione in un sistema; -
È possibile utilizzare
ps
per ottenere un’istantanea dei processi correnti in esecuzione in un sistema; -
La directory
/proc
include delle directory per ogni processo in esecuzione nel sistema che prendono il nome dai relativi PID; -
Il concetto di carico medio del sistema, che è molto utile per controllare l’utilizzo/sovraccarico della CPU.
Per quanto riguarda i log di sistema, dobbiamo ricordare che:
-
Un log è un file in cui vengono registrati gli eventi di sistema. I log sono preziosi per la risoluzione dei problemi;
-
I log sono stati tradizionalmente gestiti da servizi speciali come syslog, syslog-ng o rsyslog. Tuttavia, alcuni programmi utilizzano i propri demoni di log;
-
Poiché i log sono dati variabili, sono conservati in
/var
e, a volte, i loro nomi possono darti un’idea del loro contenuto (kern.log
,auth.log
, etc.); -
La maggior parte dei log sono scritti in testo normale e possono essere letti con un qualsiasi editor di testo purché si disponga delle autorizzazioni appropriate. Tuttavia, alcuni di essi sono binari e devono essere letti utilizzando comandi speciali;
-
Per evitare problemi di spazio su disco, l’utility logrotate esegue la rotazione dei log;
-
Per quanto riguarda il kernel, utilizza una struttura dati circolare, il ring buffer, dove vengono conservati i messaggi di avvio (i vecchi messaggi scompaiono nel tempo);
-
Il gestore di sistema e dei servizi systemd ha sostituito System V init praticamente in tutte le distribuzioni e journald è diventato il servizio di log standard;
-
Per leggere il journal di systemd, è necessaria l’utility
journalctl
.
Comandi utilizzati in questa lezione:
cat
-
Concatena/stampa il contenuto di un file.
dmesg
-
Stampa il kernel ring buffer.
echo
-
Visualizza una riga di testo o una nuova riga.
file
-
Determina il tipo di file.
grep
-
Stampa le righe che hanno corrispondenza con un pattern.
last
-
Mostra un elenco degli ultimi utenti che hanno effettuato l’accesso.
less
-
Visualizza il contenuto di un file una pagina alla volta.
ls
-
Elenca il contenuto di una directory.
journalctl
-
Interroga il journal di
systemd
. tail
-
Visualizza le ultime righe di un file.
Risposte agli Esercizi Guidati
-
Dai un’occhiata al seguente elenco prodotto dal comando
top
e rispondi alle domande di seguito riportate:carol@debian:~$ top top - 13:39:16 up 31 min, 1 user, load average: 0.12, 0.15, 0.10 Tasks: 73 total, 2 running, 71 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.1 us, 0.4 sy, 0.0 ni, 98.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1020332 total, 698700 free, 170664 used, 150968 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 710956 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 605 nobody 20 0 1137620 132424 34256 S 6.3 13.0 1:47.24 ntopng 444 www-data 20 0 364780 4132 2572 S 0.3 0.4 0:00.44 apache2 734 root 20 0 95212 7004 6036 S 0.3 0.7 0:00.36 sshd 887 carol 20 0 46608 3680 3104 R 0.3 0.4 0:00.03 top 1 root 20 0 56988 6688 5240 S 0.0 0.7 0:00.42 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.87 kworker/0:0 (...)
-
Quali processi sono stati avviati dall’utente
carol
?Soluzione: Solo uno:
top
. -
Quale directory virtuale in
/proc
dovresti visitare per cercare i dati riguardanti il comandotop
?Soluzione:
/proc/887
-
Quale processo è stato eseguito per primo? Come l’hai capito?
Soluzione:
systemd
, poiché è quello conPID
#1. -
Completa la seguente tabella specificando in quale zona dell’output di
top
si trovano le seguenti informazioni:Informazioni su … Area di Riepilogo Area delle Attività Memoria
Si
Si
Swap
Si
No
PID
No
Si
Tempo di CPU
Si
Si
Comandi
No
Si
-
-
Quale comando viene utilizzato per leggere i seguenti log binari?
-
/var/log/wtmp
Soluzione:
last
-
/var/log/btmp
Soluzione:
lastb
-
/run/log/journal/2a7d9730cd3142f4b15e20d6be631836/system.journal
Soluzione:
journalctl
-
-
Quali comandi potresti utilizzare, in combinazione con
grep
, per scoprire le seguenti informazioni sul tuo sistema Linux?-
Quando il sistema è stato riavviato l’ultima volta (
wtmp
)Soluzione:
last
-
Quali dischi rigidi sono installati (
kern.log
)Soluzione:
less /var/log/kern.log
-
Quando è avvenuto l’ultimo login (
auth.log
)Soluzione:
less /var/log/auth.log
-
-
Indica i due comandi che potresti utilizzare per visualizzare il kernel ring buffer.
dmesg
ejournalctl -k
(o anchejournalctl --dmesg
). -
Indica dove puoi trovare i seguenti messaggi di log:
-
Jul 10 13:37:39 debian dbus[303]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
X
/var/log/messages
-
Jul 10 11:23:58 debian kernel: [ 1.923349] usbhid: USB HID core driver
/var/log/auth.log
/var/log/kern.log
X
/var/log/syslog
/var/log/messages
X
Jul 10 14:02:53 debian sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0)
/var/log/auth.log
X
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 11:23:58 debian NetworkManager[322]: <info> [1562750638.8672] NetworkManager (version 1.6.2) is starting…
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
X
-
-
Usa
journalctl
per trovare informazioni sulle seguenti unità:Unità Comando ssh
journalctl -u ssh.service
networking
journalctl -u networking.service
rsyslog
journalctl -u rsyslog.service
cron
journalctl -u cron.service
Risposte agli Esercizi Esplorativi
-
Prendi nuovamente in considerazione l’output del comando
top
mostrato negli esercizi guidati e rispondi alle seguenti domande:-
Quali sono i due passaggi per terminare il server web apache?
Prima premi
k
e poi indica un valore perkill
. -
Nell’area di riepilogo, come puoi visualizzare le informazioni sulla memoria fisica e di swap utilizzando delle barre di avanzamento?
Premendo
m
una o due volte. -
Ora, ordina i processi in base all’utilizzo della memoria:
M
-
Ora che le informazioni sulla memoria sono visualizzate con delle barre di avanzamento e che i processi sono ordinati in base all’utilizzo della memoria, salva queste configurazioni in modo da averle come predefinite per la prossima volta che utilizzerai
top
:W
-
Quale file memorizza le impostazioni di configurazione di
top
? Dove si trova? Come puoi verificarne l’esistenza?Il file è
~/.config/procps/toprc
e si trova nella directory home dell’utente (~
). Dato che è un file nascosto (si trova in una directory il cui nome inizia con un punto), possiamo verificarne l’esistenza conls -a
(il comando elenca tutti i file). Questo file può essere generato premendo kbd:[Shift+W] mentre ci si trova intop
.
-
-
Approfondisci il comando
exec
in Bash. Prova a mostrarne il funzionamento: avvia una sessione Bash e trova il processo Bash conps
; esegui poiexec /bin/sh
e cerca di nuovo il processo con lo stesso PID.exec
sostituisce un processo con un altro comando. Nell’esempio di seguito riportato possiamo vedere che il processo Bash viene sostituito da/bin/sh
(invece che dal diventare/bin/sh
un processo figlio):$ echo $$ 19877 $ ps auxf | grep 19877 | head -1 carol 19877 0.0 0.0 7448 3984 pts/25 Ss 21:17 0:00 \_ bash $ exec /bin/sh sh-5.0$ ps auxf | grep 19877 | head -1 carol 19877 0.0 0.0 7448 3896 pts/25 Ss 21:17 0:00 \_ /bin/sh
-
Segui questi passaggi per esplorare gli eventi del kernel e la gestione dinamica dei dispositivi da parte di udev:
-
Collega un’unità USB al tuo computer. Esegui
dmesg
e presta attenzione alle ultime righe. Qual è la riga più recente?Dovresti ottenere qualcosa di simile a
[ 1967.700468] sd 6:0:0:0: [sdb] Attached SCSI removable disk
. -
Tenendo presente l’output del comando precedente, esegui
ls /dev/sd*
e assicurati che la tua unità USB appaia nell’elenco. Qual è l’output?A seconda del numero di dispositivi collegati al tuo sistema, dovresti ottenere qualcosa di simile a
/dev/sda /dev/sda1 /dev/sdb /dev/sdb1 /dev/sdb2
. Nel nostro caso troviamo la nostra unità USB (/dev/sdb
) e le sue due partizioni (/dev/sdb1
e/dev/sdb2
). -
Ora rimuovi l’unità USB ed esegui di nuovo
dmesg
. Che cosa mostra la riga più recente?Dovresti ottenere qualcosa di simile a
[ 2458.881695] usb 1-9: USB disconnect, device number 6
. -
Esegui di nuovo
ls /dev/sd*
e assicurati che il tuo dispositivo sia scomparso dall’elenco. Qual è l’output?Nel nostro caso,
/dev/sda /dev/sda1
.
-