linux- comandi utili e troubleshooting

Una risorsa pratica, approfondita e operativa per diagnosticare e risolvere i problemi più comuni (e meno comuni) su sistemi Linux.


Indice

  1. Boot e avvio
  2. Servizi systemd
  3. Rete e DNS
  4. Firewall
  5. Dischi, mount e filesystem
  6. Processi e risorse
  7. GPU e grafica
  8. Permessi
  9. SELinux e AppArmor
  10. Pacchetti e dipendenze
  11. File e log
  12. Hardware e periferiche
  13. USB, PCI e driver
  14. Problemi di lentezza
  15. Crash di applicazioni
  16. Accesso remoto e SSH
  17. VPN e Tailscale
  18. Container e virtualizzazione
  19. Diagnostica avanzata

1. Boot e Avvio

Il processo di avvio di un sistema Linux moderno è articolato in diverse fasi: firmware (BIOS/UEFI), bootloader (GRUB), kernel, initramfs e infine systemd come PID 1. Un problema in qualsiasi di questi stadi può impedire l'avvio o causare comportamenti anomali. Capire dove si inceppa il processo è il primo passo per risolverlo.

1.1 Controllare i log di avvio

Il modo più diretto per capire cosa succede durante il boot è leggere i log del kernel e di systemd.

# Mostra tutti i messaggi del kernel dall'avvio corrente
journalctl -k

# Mostra i log dell'avvio corrente (kernel + systemd)
journalctl -b

# Mostra i log dell'avvio precedente (utile dopo un crash)
journalctl -b -1

# Mostra i log di due avvii fa
journalctl -b -2

# Elenca gli avvii disponibili nei log
journalctl --list-boots

# Mostra solo gli errori e i messaggi critici dell'avvio corrente
journalctl -b -p err

Il parametro -b (boot) seleziona l'avvio, -p filtra per priorità (0=emergency, 1=alert, 2=crit, 3=err, 4=warning, 5=notice, 6=info, 7=debug).

1.2 Analizzare il tempo di avvio

Se il sistema si avvia lentamente, systemd-analyze è lo strumento giusto per identificare quale unità causa il rallentamento.

# Tempo totale di avvio (firmware + loader + kernel + userspace)
systemd-analyze

# Mostra il tempo impiegato da ogni servizio, ordinato dal più lento
systemd-analyze blame

# Genera un grafico SVG della catena di avvio
systemd-analyze plot > boot-graph.svg

# Mostra la catena critica di dipendenze che rallenta il boot
systemd-analyze critical-chain

# Analizza la catena critica di un servizio specifico
systemd-analyze critical-chain nginx.service

Un output tipico di systemd-analyze è:

Startup finished in 3.102s (firmware) + 1.205s (loader) + 2.341s (kernel) + 12.542s (userspace) = 19.190s

Se userspace è alto, usa blame per trovare il servizio lento.

1.3 Accedere a un sistema che non si avvia: Recovery Mode e GRUB

Quando il sistema non riesce ad avviarsi normalmente, è necessario intervenire dal menu di GRUB o da un live USB.

Accesso alla shell di recovery tramite GRUB:

  1. Riavvia il sistema.
  2. Tieni premuto Shift (BIOS) o Esc (UEFI) per accedere al menu di GRUB.
  3. Seleziona "Advanced options" e poi la voce con "(recovery mode)".
  4. Scegli "root – Drop to root shell prompt".

Modificare i parametri del kernel al volo da GRUB:

  1. Nel menu GRUB, seleziona la voce di avvio e premi e per editarla.
  2. Trova la riga che inizia con linux e aggiungi parametri in fondo.
  3. Premi Ctrl+X o F10 per avviare con i parametri modificati.

Parametri utili da aggiungere:

# Avvio in modalità single-user (shell di root senza rete)
single

# Oppure, equivalente moderno systemd
systemd.unit=rescue.target

# Avvio in emergency target (minimo assoluto, anche meno di rescue)
systemd.unit=emergency.target

# Disabilita plymouth (utile se l'output grafico blocca il boot)
plymouth.enable=0

# Visualizza output verboso del kernel (rimuove "quiet splash")
# Rimuovi "quiet" e "splash" dalla riga del kernel

# Ignora errori su filesystem in sola lettura
ro

1.4 Riparare il filesystem in sola lettura

Se il sistema monta la root in sola lettura (cosa comune durante recovery), è necessario rimontarla in lettura-scrittura prima di poter fare modifiche.

# Rimonta la partizione root in lettura-scrittura
mount -o remount,rw /

# Verifica che ora sia in lettura-scrittura
mount | grep " / "

1.5 Ripristinare GRUB

Se GRUB è corrotto o mancante (ad esempio dopo l'installazione di Windows su un dual boot), è necessario reinstallarlo da un live USB.

# Da live USB: monta la partizione root del sistema installato
mount /dev/sdXY /mnt

# Se c'è una partizione /boot separata, montala
mount /dev/sdXZ /mnt/boot

# Se c'è una partizione EFI (sistemi UEFI), montala
mount /dev/sdXW /mnt/boot/efi

# Monta i filesystem necessari per chroot
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /dev/pts /mnt/dev/pts

# Entra nell'ambiente chroot
chroot /mnt

# Reinstalla GRUB su disco (BIOS/MBR)
grub-install /dev/sda

# Reinstalla GRUB su sistema UEFI
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu

# Rigenera il file di configurazione di GRUB
update-grub
# oppure su sistemi Red Hat:
grub2-mkconfig -o /boot/grub2/grub.cfg

1.6 Problemi con initramfs

L'initramfs è un filesystem temporaneo caricato dal kernel all'avvio. Se è corrotto, il sistema si blocca con un messaggio tipo (initramfs) o BusyBox.

# Da shell initramfs: controlla l'integrità del filesystem
fsck /dev/sdXY

# Rigenera initramfs (da un sistema funzionante o da chroot)
# Ubuntu/Debian:
update-initramfs -u -k all

# Fedora/Red Hat:
dracut --force

# Arch Linux:
mkinitcpio -P

1.7 Controllare i messaggi del kernel (dmesg)

dmesg mostra il ring buffer del kernel, ovvero i messaggi generati dal kernel dall'avvio. È fondamentale per problemi hardware rilevati all'avvio.

# Mostra tutti i messaggi del kernel
dmesg

# Mostra gli ultimi 50 messaggi
dmesg | tail -50

# Mostra solo errori e warning
dmesg --level=err,warn

# Mostra messaggi in tempo reale (follow)
dmesg -w

# Mostra con timestamp leggibile
dmesg -T

# Cerca messaggi relativi a un dispositivo specifico
dmesg | grep -i "sda"
dmesg | grep -i "usb"
dmesg | grep -i "nvidia"

# Cerca messaggi di errore
dmesg | grep -i "error\|fail\|panic\|oops"

2. Servizi systemd

Systemd è il sistema di init e gestore di servizi su praticamente tutte le distribuzioni Linux moderne. Capire come interrogarlo, gestire i servizi e leggere i suoi log è essenziale per qualsiasi attività di troubleshooting.

2.1 Comandi di base per la gestione dei servizi

# Avvia un servizio
systemctl start nome-servizio

# Ferma un servizio
systemctl stop nome-servizio

# Riavvia un servizio (stop + start)
systemctl restart nome-servizio

# Ricarica la configurazione senza riavviare (se supportato)
systemctl reload nome-servizio

# Ricarica se possibile, altrimenti riavvia
systemctl reload-or-restart nome-servizio

# Abilita l'avvio automatico all'avvio del sistema
systemctl enable nome-servizio

# Disabilita l'avvio automatico
systemctl disable nome-servizio

# Abilita e avvia immediatamente
systemctl enable --now nome-servizio

# Disabilita e ferma immediatamente
systemctl disable --now nome-servizio

# Impedisce che un servizio venga avviato (mask)
systemctl mask nome-servizio

# Rimuove il mask
systemctl unmask nome-servizio

2.2 Controllare lo stato dei servizi

# Stato dettagliato di un servizio (con log recenti)
systemctl status nome-servizio

# Elenca tutti i servizi attivi
systemctl list-units --type=service

# Elenca tutti i servizi (anche inattivi e falliti)
systemctl list-units --type=service --all

# Elenca i servizi falliti
systemctl list-units --failed

# Elenca tutte le unità caricate
systemctl list-units

# Elenca i servizi abilitati all'avvio
systemctl list-unit-files --type=service --state=enabled

# Verifica se un servizio è attivo
systemctl is-active nome-servizio

# Verifica se un servizio è abilitato
systemctl is-enabled nome-servizio

# Verifica se un servizio è fallito
systemctl is-failed nome-servizio

2.3 Log dei servizi con journalctl

journalctl è il client per leggere i log di systemd-journald. È il posto principale dove cercare i messaggi di errore di un servizio.

# Log di un servizio specifico
journalctl -u nome-servizio

# Log in tempo reale (follow)
journalctl -u nome-servizio -f

# Log dell'avvio corrente per un servizio
journalctl -u nome-servizio -b

# Log delle ultime 100 righe
journalctl -u nome-servizio -n 100

# Log con priorità errore o superiore
journalctl -u nome-servizio -p err

# Log da una certa data/ora
journalctl -u nome-servizio --since "2024-01-15 10:00:00"

# Log tra due date
journalctl -u nome-servizio --since "1 hour ago" --until "now"

# Log di più servizi insieme
journalctl -u nginx -u php-fpm -u mysql

# Tutti i log dell'avvio corrente
journalctl -b

# Log in formato JSON (utile per parsing)
journalctl -u nome-servizio -o json-pretty

# Dimensione del journal su disco
journalctl --disk-usage

# Pulisci i log più vecchi di 7 giorni
journalctl --vacuum-time=7d

# Limita il journal a 500MB
journalctl --vacuum-size=500M

2.4 Diagnosticare un servizio che non si avvia

Quando systemctl status mostra un servizio in stato failed, il processo di diagnosi segue questi passi:

# 1. Controlla lo stato del servizio
systemctl status nome-servizio

# 2. Leggi i log completi del servizio
journalctl -u nome-servizio --no-pager | tail -50

# 3. Controlla il file di configurazione dell'unità
systemctl cat nome-servizio

# 4. Verifica le dipendenze
systemctl list-dependencies nome-servizio

# 5. Controlla se c'è un file di override
systemctl show nome-servizio

# 6. Modifica il servizio (apre editor)
systemctl edit nome-servizio

# 7. Ricarica il daemon dopo modifiche
systemctl daemon-reload

# 8. Mostra tutte le proprietà di un'unità
systemctl show nome-servizio --all

2.5 Target systemd (equivalenti dei runlevel)

# Mostra il target corrente
systemctl get-default

# Cambia il target di default
systemctl set-default multi-user.target   # equivalente runlevel 3 (no GUI)
systemctl set-default graphical.target    # equivalente runlevel 5 (con GUI)

# Cambia target al volo (senza reboot)
systemctl isolate multi-user.target

# Target principali
# poweroff.target    = spegnimento
# rescue.target      = single user
# multi-user.target  = multiutente senza GUI
# graphical.target   = multiutente con GUI
# reboot.target      = riavvio

# Spegni il sistema
systemctl poweroff

# Riavvia il sistema
systemctl reboot

# Sospendi il sistema
systemctl suspend

# Ibernazione
systemctl hibernate

2.6 Creare un servizio systemd personalizzato

Sapere come strutturare un file di unità è utile sia per creare nuovi servizi che per capire quelli esistenti.

# Esempio: /etc/systemd/system/mia-app.service
[Unit]
Description=La mia applicazione
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=miouser
WorkingDirectory=/opt/mia-app
ExecStart=/opt/mia-app/start.sh
ExecStop=/opt/mia-app/stop.sh
Restart=on-failure
RestartSec=5s
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
# Dopo aver creato il file, ricarica systemd e abilita il servizio
systemctl daemon-reload
systemctl enable --now mia-app.service

3. Rete e DNS

I problemi di rete sono tra i più frequenti su Linux. Possono riguardare la connettività di base, la risoluzione dei nomi, il routing o la configurazione delle interfacce.

3.1 Panoramica delle interfacce di rete

# Mostra tutte le interfacce di rete con indirizzi IP (comando moderno)
ip addr show
ip a       # abbreviato

# Mostra solo le interfacce attive
ip link show up

# Mostra una singola interfaccia
ip addr show eth0

# Mostra la tabella di routing
ip route show
ip r       # abbreviato

# Mostra le regole di routing
ip rule show

# Mostra le statistiche delle interfacce (pacchetti, errori)
ip -s link show eth0

# Comandi legacy (ifconfig) - ancora presenti su molti sistemi
ifconfig
ifconfig eth0

3.2 Test di connettività

# Ping base (4 pacchetti)
ping -c 4 8.8.8.8

# Ping con dimensione pacchetto personalizzata
ping -c 4 -s 1400 8.8.8.8

# Ping a un host per nome (testa anche DNS)
ping google.com

# Traceroute verso una destinazione (mostra il percorso dei pacchetti)
traceroute google.com

# Versione più moderna e informativa di traceroute
mtr google.com

# mtr in modalità report (non interattivo)
mtr --report google.com

# Test di raggiungibilità HTTP senza browser
curl -v https://google.com
wget -q --spider https://google.com && echo "OK" || echo "FAIL"

3.3 Diagnostica DNS

# Risolvi un nome con il resolver di sistema
nslookup google.com

# Query DNS avanzata con dig
dig google.com

# Query per un tipo specifico di record
dig google.com A        # record A (IPv4)
dig google.com AAAA     # record AAAA (IPv6)
dig google.com MX       # record MX (mail)
dig google.com NS       # record NS (nameserver)
dig google.com TXT      # record TXT
dig google.com CNAME    # record CNAME

# Query verso un server DNS specifico
dig @8.8.8.8 google.com

# Risoluzione inversa (da IP a nome)
dig -x 8.8.8.8

# Mostra solo la risposta (senza metadata)
dig +short google.com

# Risoluzione con systemd-resolved
resolvectl query google.com

# Stato del resolver systemd
resolvectl status

# Statistiche DNS (cache hits, ecc.)
resolvectl statistics

# Flush della cache DNS
resolvectl flush-caches

# Controlla il file di configurazione DNS
cat /etc/resolv.conf

# Controlla il file /etc/hosts
cat /etc/hosts

# Controlla l'ordine di risoluzione dei nomi
cat /etc/nsswitch.conf | grep hosts

3.4 Configurare una rete manualmente

A volte è necessario configurare un'interfaccia manualmente, ad esempio in un ambiente di recovery.

# Assegna un indirizzo IP a un'interfaccia
ip addr add 192.168.1.100/24 dev eth0

# Rimuovi un indirizzo IP
ip addr del 192.168.1.100/24 dev eth0

# Attiva un'interfaccia
ip link set eth0 up

# Disattiva un'interfaccia
ip link set eth0 down

# Aggiungi un gateway predefinito
ip route add default via 192.168.1.1

# Rimuovi il gateway predefinito
ip route del default

# Aggiungi una route statica
ip route add 10.0.0.0/8 via 192.168.1.254

# Ottieni un IP via DHCP
dhclient eth0

# Rilascia l'IP DHCP
dhclient -r eth0

3.5 NetworkManager

NetworkManager è il gestore di rete più comune su distribuzioni desktop e server moderni.

# Stato generale di NetworkManager
nmcli general status

# Elenca le connessioni configurate
nmcli connection show

# Elenca i dispositivi di rete
nmcli device status

# Dettagli su un dispositivo
nmcli device show eth0

# Attiva una connessione
nmcli connection up "Nome Connessione"

# Disattiva una connessione
nmcli connection down "Nome Connessione"

# Modifica un'impostazione (es: DNS)
nmcli connection modify "Nome Connessione" ipv4.dns "8.8.8.8 8.8.4.4"

# Riapplica la configurazione senza disconnettersi
nmcli device reapply eth0

# Riavvia NetworkManager
systemctl restart NetworkManager

# Log di NetworkManager
journalctl -u NetworkManager -f

3.6 Porte e connessioni attive

# Mostra tutte le porte in ascolto (TCP e UDP)
ss -tulpn

# Mostra tutte le connessioni stabilite
ss -tp state established

# Alternativa con netstat (potrebbe richiedere net-tools)
netstat -tulpn
netstat -tp

# Mostra chi usa una porta specifica
ss -tulpn | grep :80
lsof -i :80

# Mostra tutte le connessioni aperte da un processo
lsof -p PID -i

# Mostra statistiche di rete
ss -s

# Mostra statistiche TCP dettagliate
cat /proc/net/tcp

4. Firewall

Linux offre principalmente tre sistemi di gestione del firewall: iptables (il classico), nftables (il successore moderno) e i frontend ad alto livello come firewalld (Red Hat/Fedora) e ufw (Ubuntu/Debian).

4.1 UFW (Uncomplicated Firewall) — Ubuntu/Debian

# Stato del firewall
ufw status
ufw status verbose
ufw status numbered   # mostra le regole numerate

# Abilita il firewall
ufw enable

# Disabilita il firewall
ufw disable

# Reimposta le regole predefinite
ufw reset

# Politica di default: nega tutto in entrata, permetti tutto in uscita
ufw default deny incoming
ufw default allow outgoing

# Permetti una porta TCP
ufw allow 80/tcp
ufw allow 443/tcp

# Permetti SSH (porta 22)
ufw allow ssh
ufw allow 22/tcp

# Permetti un intervallo di porte
ufw allow 8000:8080/tcp

# Permetti da un IP specifico
ufw allow from 192.168.1.50

# Permetti da una subnet
ufw allow from 192.168.1.0/24

# Permetti da un IP specifico solo su una porta
ufw allow from 192.168.1.50 to any port 22

# Nega una porta
ufw deny 23/tcp

# Rimuovi una regola per numero
ufw delete 3

# Rimuovi una regola specifica
ufw delete allow 80/tcp

# Log del firewall
ufw logging on
journalctl -u ufw

4.2 firewalld — Fedora/Red Hat/CentOS

# Stato del firewall
firewall-cmd --state

# Elenca tutte le zone
firewall-cmd --list-all-zones

# Zona attiva corrente
firewall-cmd --get-active-zones

# Dettagli sulla zona di default
firewall-cmd --list-all

# Aggiungi un servizio alla zona default (permanente)
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=ssh

# Aggiungi una porta
firewall-cmd --permanent --add-port=8080/tcp

# Rimuovi un servizio
firewall-cmd --permanent --remove-service=http

# Applica le modifiche permanenti
firewall-cmd --reload

# Aggiungi regola solo per la sessione corrente (senza --permanent)
firewall-cmd --add-service=http

# Elenca i servizi disponibili
firewall-cmd --get-services

# Apri porta solo per un IP specifico (rich rule)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.50" port port="22" protocol="tcp" accept'

# Abilita il masquerading (NAT)
firewall-cmd --permanent --add-masquerade

4.3 iptables (classico)

# Elenca tutte le regole
iptables -L -v -n

# Elenca le regole con numeri di riga
iptables -L --line-numbers

# Elenca le regole NAT
iptables -t nat -L -v -n

# Permetti traffico in entrata sulla porta 80
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# Permetti traffico in entrata sulla porta 22 da una subnet
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

# Nega tutto il traffico in entrata di default
iptables -P INPUT DROP

# Permetti connessioni stabilite e correlate
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Salva le regole (Ubuntu/Debian)
iptables-save > /etc/iptables/rules.v4

# Ripristina le regole
iptables-restore < /etc/iptables/rules.v4

# Elimina tutte le regole (FLUSH)
iptables -F

# Elimina una regola specifica
iptables -D INPUT 3   # elimina la terza regola di INPUT

4.4 nftables (il moderno successore di iptables)

# Elenca tutte le tabelle e regole
nft list ruleset

# Elenca una tabella specifica
nft list table ip filter

# Aggiungi una regola (permetti porta 80)
nft add rule ip filter input tcp dport 80 accept

# Salva la configurazione
nft list ruleset > /etc/nftables.conf

# Ripristina la configurazione
nft -f /etc/nftables.conf

5. Dischi, Mount e Filesystem

I problemi relativi a dischi, partizioni e filesystem sono critici perché possono portare a perdita di dati. È fondamentale capire la struttura del disco, controllare la salute dei filesystem e sapere come intervenire in caso di problemi.

5.1 Visualizzare dischi e partizioni

# Elenca tutti i dischi e le partizioni (leggibile)
lsblk

# Mostra anche UUID, filesystem e label
lsblk -f

# Mostra dimensioni in formato leggibile
lsblk -h

# Informazioni dettagliate sulle partizioni
fdisk -l

# Informazioni su un disco specifico
fdisk -l /dev/sda

# Mostra partizioni con UUID
blkid

# Mostra UUID di un dispositivo specifico
blkid /dev/sda1

# Informazioni sul filesystem
df -h          # utilizzo disco per ogni filesystem montato
df -i          # utilizzo inode (importante: un disco "pieno" di inode non è usabile)
du -sh /percorso   # dimensione di una directory

# Trova le directory più grandi in /
du -h --max-depth=1 / | sort -rh | head -20

# Trova le directory più grandi ovunque
du -ah / 2>/dev/null | sort -rh | head -20

5.2 Montare e smontare filesystem

# Monta un dispositivo
mount /dev/sda1 /mnt

# Monta con un filesystem specifico
mount -t ext4 /dev/sda1 /mnt

# Monta con opzioni
mount -o ro /dev/sda1 /mnt          # sola lettura
mount -o rw,noexec /dev/sda1 /mnt  # lettura-scrittura, no esecuzione

# Rimonta con opzioni diverse
mount -o remount,rw /

# Smonta un filesystem
umount /mnt
umount /dev/sda1

# Smonta forzatamente (se il dispositivo è occupato)
umount -f /mnt
umount -l /mnt   # lazy unmount (si smonta appena non è più usato)

# Trova chi sta usando il punto di mount (se umount dice "busy")
fuser -m /mnt
lsof +D /mnt

# Mostra tutti i filesystem montati
mount | column -t
cat /proc/mounts

# Monta tutto ciò che è in /etc/fstab
mount -a

# Verifica la sintassi di /etc/fstab senza montare
mount -a --dry-run  # non sempre disponibile
findmnt --verify    # verifica /etc/fstab

5.3 Configurare /etc/fstab

/etc/fstab è il file che definisce quali filesystem montare automaticamente all'avvio. Un errore qui può impedire l'avvio del sistema.

# Esempio di /etc/fstab:
# UUID=xxxx-xxxx  /           ext4  defaults          0 1
# UUID=xxxx-xxxx  /boot/efi   vfat  umask=0077        0 1
# UUID=xxxx-xxxx  /home       ext4  defaults          0 2
# UUID=xxxx-xxxx  none        swap  sw                0 0
# //server/share  /mnt/share  cifs  credentials=/etc/samba/creds 0 0

# Ottieni gli UUID da usare in fstab
blkid | grep UUID

# Verifica che fstab sia corretto PRIMA di riavviare
findmnt --verify --verbose

# Testa il montaggio di una nuova voce fstab
mount -a

I campi di fstab sono: dispositivo, punto di mount, tipo filesystem, opzioni, dump (backup), pass (ordine fsck; 1=root, 2=altri, 0=mai).

5.4 Controllare e riparare filesystem (fsck)

Importante: non eseguire fsck su filesystem montati in lettura-scrittura. Per la partizione root, farlo da live USB o da recovery mode.

# Controlla un filesystem ext4
fsck /dev/sda1

# Controlla e correggi automaticamente errori non ambigui
fsck -a /dev/sda1

# Forza il controllo anche se il filesystem sembra integro
fsck -f /dev/sda1

# Controlla un filesystem con tipo specifico
fsck -t ext4 /dev/sda1

# Controlla filesystem FAT (chiavette USB, ESP)
fsck.fat -n /dev/sdb1    # -n = solo controllo, non modifica
fsck.fat -a /dev/sdb1    # correggi automaticamente

# Controlla NTFS
ntfsfix /dev/sda2

# Forza fsck all'avvio successivo (crea file marcatore)
touch /forcefsck   # metodo vecchio
# oppure modifica /etc/fstab per avere pass=1 o 2

# Controlla un filesystem btrfs
btrfs check /dev/sda1
btrfs scrub start /
btrfs scrub status /

5.5 LVM (Logical Volume Manager)

# Elenca tutti i volumi fisici
pvdisplay
pvs

# Elenca tutti i volume group
vgdisplay
vgs

# Elenca tutti i volumi logici
lvdisplay
lvs

# Estendi un volume logico di 10GB
lvextend -L +10G /dev/vgname/lvname

# Estendi un volume logico usando tutto lo spazio disponibile
lvextend -l +100%FREE /dev/vgname/lvname

# Dopo aver esteso LV, ridimensiona il filesystem
# Per ext4:
resize2fs /dev/vgname/lvname

# Per xfs (solo espansione, non riduzione):
xfs_growfs /mount/point

# Crea uno snapshot
lvcreate -L 5G -s -n snapshot_name /dev/vgname/lvname

5.6 SMART — Salute del disco fisico

# Controlla lo stato SMART di un disco
smartctl -a /dev/sda

# Esegui un self-test breve
smartctl -t short /dev/sda

# Esegui un self-test lungo (può richiedere ore)
smartctl -t long /dev/sda

# Mostra solo il risultato del test
smartctl -l selftest /dev/sda

# Mostra attributi SMART (cerca valori "FAILING" o vicini al limite)
smartctl -A /dev/sda

# Per SSD NVMe
smartctl -a /dev/nvme0

Valori SMART critici da monitorare:


6. Processi e Risorse

Capire come il sistema usa CPU, RAM e I/O è fondamentale per diagnosticare lentezze e instabilità.

6.1 Monitoraggio in tempo reale

# Monitor interattivo classico
top

# Versione migliorata di top (più leggibile)
htop

# Monitor moderno con supporto GPU, container, ecc.
btop

# Mostra l'utilizzo di I/O per processo
iotop

# Mostra l'utilizzo di rete per processo
nethogs

# Monitora l'utilizzo di CPU, memoria e I/O ogni secondo
vmstat 1

# Statistiche di I/O su disco
iostat -x 1

# Statistiche di rete
sar -n DEV 1

# Panoramica rapida del sistema
uptime   # load average e tempo di attività
free -h  # utilizzo memoria

6.2 Gestire i processi

# Elenca tutti i processi
ps aux

# Elenca i processi in formato ad albero
ps auxf
pstree

# Trova un processo per nome
ps aux | grep nginx
pgrep nginx

# Mostra il PID di un processo per nome
pidof nginx

# Mostra i file aperti da un processo
lsof -p PID

# Mostra tutti i file aperti
lsof

# Mostra i file aperti in una directory
lsof +D /var/log

# Invia un segnale a un processo
kill PID              # SIGTERM (richiesta di chiusura)
kill -9 PID           # SIGKILL (terminazione forzata, non ignorabile)
kill -HUP PID         # SIGHUP (ricarica configurazione)
kill -STOP PID        # SIGSTOP (pausa)
kill -CONT PID        # SIGCONT (riprendi)

# Termina tutti i processi con un nome
killall nginx
pkill nginx

# Termina per pattern
pkill -f "python script.py"

# Cambia la priorità di un processo (nice: -20 alta priorità, 19 bassa)
nice -n 10 comando        # avvia con bassa priorità
renice -n 5 -p PID        # cambia priorità di un processo in esecuzione
renice -n -5 -p PID       # aumenta la priorità (richiede root)

# Esegui un comando in background
comando &

# Manda un processo in background
# (prima premi Ctrl+Z per sospendere, poi)
bg

# Riporta in foreground
fg

# Lista dei job in background
jobs

6.3 Analisi della memoria

# Utilizzo della memoria in formato leggibile
free -h

# Dettagli sulla memoria dal kernel
cat /proc/meminfo

# Processi ordinati per utilizzo di memoria
ps aux --sort=-%mem | head -20

# Oppure con top interattivo: premi M per ordinare per memoria

# Svuota la cache della memoria (solo se necessario, il kernel lo fa autonomamente)
# Valore 1: pagecache, 2: dentries/inodes, 3: entrambi
echo 3 > /proc/sys/vm/drop_caches

# Mostra l'utilizzo di memoria per processo (in MB)
ps aux --sort=-%mem | awk '{print $2, $4, $11}' | head -20

# Informazioni sullo swap
swapon --show
cat /proc/swaps

# Attiva file di swap temporaneo
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

6.4 Analisi del carico e della CPU

# Carico medio del sistema (ultimi 1, 5, 15 minuti)
uptime
cat /proc/loadavg

# Il load average si confronta con il numero di CPU:
# se hai 4 core e load > 4, il sistema è saturo
nproc              # numero di core disponibili
lscpu              # informazioni dettagliate sulla CPU

# Utilizzo CPU per core
mpstat -P ALL 1

# Processi ordinati per CPU
ps aux --sort=-%cpu | head -20

# Mostra statistiche context switch e interrupt
vmstat 1

# Profiling della CPU con perf
perf top                     # processi che usano più CPU in tempo reale
perf stat -p PID             # statistiche CPU per un processo
perf record -g -p PID        # registra per analisi successiva
perf report                  # analizza i dati registrati

7. GPU e Grafica

I problemi grafici su Linux possono riguardare driver mancanti, conflitti tra driver open-source e proprietari, o configurazioni errate del server grafico (Wayland/X11).

7.1 Informazioni sulla GPU

# Mostra informazioni sull'hardware grafico
lspci | grep -i vga
lspci | grep -i display
lspci | grep -i 3d

# Informazioni dettagliate su una GPU specifica
lspci -v -s 00:02.0   # sostituisci con l'indirizzo del dispositivo

# Informazioni generali sulla scheda video (richiede inxi)
inxi -G

# Per GPU NVIDIA (richiede driver NVIDIA installati)
nvidia-smi

# Mostra utilizzo GPU NVIDIA in tempo reale
nvidia-smi -l 1          # aggiorna ogni secondo
watch -n 1 nvidia-smi   # alternativa

# Informazioni dettagliate NVIDIA
nvidia-smi -q

# Per GPU AMD
# Con driver open-source AMDGPU:
cat /sys/class/drm/card0/device/gpu_busy_percent   # utilizzo GPU
cat /sys/class/drm/card0/device/mem_info_vram_used # VRAM usata

# Con radeontop:
radeontop

# Per GPU Intel
intel_gpu_top    # richiede intel-gpu-tools

7.2 Driver NVIDIA

# Controlla il driver NVIDIA attivo
nvidia-smi
lsmod | grep nvidia

# Controlla quale driver è in uso
modinfo nvidia | grep version

# Su Ubuntu: installa il driver consigliato
ubuntu-drivers devices
ubuntu-drivers autoinstall

# Installa una versione specifica
apt install nvidia-driver-535

# Controlla i log di Xorg/Wayland per problemi grafici
journalctl -b | grep -i nvidia
cat /var/log/Xorg.0.log | grep -i EE   # errori
cat /var/log/Xorg.0.log | grep -i WW   # warning

# Verifica che il modulo sia caricato
lsmod | grep nvidia

# Ricarica i moduli NVIDIA
modprobe nvidia
modprobe nvidia_drm
modprobe nvidia_uvm

# Su sistemi con Secure Boot, i moduli devono essere firmati
mokutil --sb-state    # stato Secure Boot

7.3 Driver AMD e Intel

# Controlla il driver AMD in uso
lsmod | grep amdgpu
lsmod | grep radeon

# Log di avvio per la GPU AMD
dmesg | grep -i amdgpu
dmesg | grep -i radeon

# Forza l'uso di amdgpu invece di radeon
# Aggiungi al kernel in /etc/default/grub:
# GRUB_CMDLINE_LINUX_DEFAULT="... amdgpu.si_support=1 amdgpu.cik_support=1"
# poi esegui: update-grub

# Driver Intel
lsmod | grep i915
dmesg | grep i915

# Mostra la versione Mesa (driver open-source)
glxinfo | grep "OpenGL version"
glxinfo | grep "OpenGL renderer"

# Verifica accelerazione hardware
vainfo    # VA-API (decodifica video hardware)
vdpauinfo # VDPAU

7.4 Problemi con il server grafico

# Determina se stai usando X11 o Wayland
echo $XDG_SESSION_TYPE
loginctl show-session $(loginctl | grep $(whoami) | awk '{print $1}') -p Type

# Log di X11
cat /var/log/Xorg.0.log
journalctl | grep Xorg

# Riavvia il server grafico (ATTENZIONE: chiude tutte le app grafiche)
# Su sistemi con display manager:
systemctl restart gdm    # GNOME Display Manager
systemctl restart sddm   # KDE Display Manager
systemctl restart lightdm

# Se il server grafico si blocca completamente
# Usa Ctrl+Alt+F2 (o F3, F4...) per passare a un terminale virtuale
# Poi da lì:
systemctl restart gdm

# Variabili d'ambiente importanti per la grafica
echo $DISPLAY           # display X11 corrente
echo $WAYLAND_DISPLAY   # socket Wayland corrente

8. Permessi

I problemi di permessi sono tra i più comuni su Linux. Capire il sistema di permessi Unix è essenziale per diagnosticare errori "Permission denied".

8.1 Leggere e modificare permessi

# Mostra i permessi di file e directory
ls -la
ls -la /percorso/

# Formato dei permessi: -rwxr-xr--
# - = tipo (- file, d directory, l symlink, b block, c char)
# rwx = permessi del proprietario (read, write, execute)
# r-x = permessi del gruppo
# r-- = permessi degli altri

# Cambia i permessi (notazione ottale)
chmod 755 file     # rwxr-xr-x (standard per eseguibili)
chmod 644 file     # rw-r--r-- (standard per file)
chmod 700 file     # rwx------ (privato al proprietario)
chmod 600 file     # rw------- (file privato, es: chiavi SSH)
chmod 777 file     # rwxrwxrwx (tutti i permessi - da evitare)

# Cambia i permessi (notazione simbolica)
chmod u+x file       # aggiungi esecuzione al proprietario
chmod g-w file       # rimuovi scrittura al gruppo
chmod o=r file       # imposta per altri solo lettura
chmod a+r file       # aggiungi lettura a tutti (all)
chmod ug+rw file     # aggiungi lettura e scrittura a utente e gruppo

# Applica ricorsivamente a una directory
chmod -R 755 /percorso/

# Cambia il proprietario
chown utente file
chown utente:gruppo file
chown -R utente:gruppo /percorso/

# Cambia solo il gruppo
chgrp gruppo file
chgrp -R gruppo /percorso/

8.2 Bit speciali: setuid, setgid, sticky bit

# Setuid (s su bit esecuzione del proprietario)
# Il file viene eseguito con i privilegi del proprietario, non dell'utente corrente
# Es: /usr/bin/passwd ha setuid root
chmod u+s file
chmod 4755 file   # equivalente ottale

# Setgid (s su bit esecuzione del gruppo)
# Su file: esegue con privilegi del gruppo
# Su directory: i nuovi file ereditano il gruppo della directory
chmod g+s directory
chmod 2755 directory

# Sticky bit (t su bit esecuzione degli altri)
# Su directory: solo il proprietario può cancellare i propri file
# Usato tipicamente su /tmp
chmod +t /tmp
chmod 1777 /tmp

# Cerca file setuid/setgid nel sistema (potenziale rischio sicurezza)
find / -perm -4000 -type f 2>/dev/null   # setuid
find / -perm -2000 -type f 2>/dev/null   # setgid

8.3 ACL (Access Control Lists)

Le ACL permettono permessi più granulari rispetto al modello Unix standard.

# Controlla se le ACL sono abilitate sul filesystem
tune2fs -l /dev/sda1 | grep "Default mount options"
# Deve mostrare "acl"

# Mostra le ACL di un file
getfacl file

# Imposta una ACL per un utente specifico
setfacl -m u:username:rw file

# Imposta una ACL per un gruppo
setfacl -m g:groupname:r file

# Rimuovi una ACL
setfacl -x u:username file

# Rimuovi tutte le ACL
setfacl -b file

# Imposta ACL di default su una directory (ereditati dai nuovi file)
setfacl -d -m u:username:rw /directory

# Copia le ACL da un file a un altro
getfacl file1 | setfacl --set-file=- file2

8.4 Attributi estesi

# Mostra gli attributi estesi di un file
lsattr file
lsattr -R /directory   # ricorsivo

# Imposta il flag immutable (nemmeno root può modificare/cancellare il file)
chattr +i file

# Rimuovi il flag immutable
chattr -i file

# Append-only (si può solo aggiungere contenuto, non modificare/cancellare)
chattr +a file

# Flag comuni:
# i = immutable (non modificabile, non cancellabile, non rinominabile)
# a = append-only
# e = extent format (gestione blocchi)
# S = sincronizzazione immediata su disco

9. SELinux e AppArmor

SELinux e AppArmor sono sistemi di Mandatory Access Control (MAC) che aggiungono un livello di sicurezza extra oltre ai permessi Unix standard. Spesso causano problemi apparentemente inspiegabili: un processo non riesce ad accedere a un file nonostante i permessi Unix siano corretti.

9.1 SELinux (Red Hat, Fedora, CentOS, Rocky Linux)

# Controlla se SELinux è attivo e in quale modalità
getenforce
# Output: Enforcing, Permissive, Disabled

# Stato dettagliato
sestatus

# Modalità di SELinux:
# Enforcing: applica le policy e nega le azioni non permesse
# Permissive: registra le violazioni ma non le blocca (utile per debug)
# Disabled: disabilitato completamente

# Cambia temporaneamente la modalità (non persiste al reboot)
setenforce 0   # Permissive
setenforce 1   # Enforcing

# Cambia la modalità permanentemente
# Modifica /etc/selinux/config e imposta SELINUX=permissive o SELINUX=enforcing
# Richiede reboot

# Visualizza le negazioni SELinux in tempo reale
tail -f /var/log/audit/audit.log | grep "denied"

# Oppure usa ausearch
ausearch -m avc -ts recent

# Genera una policy per permettere un'azione negata
# Prima metti SELinux in modalità permissiva, poi riproduci l'azione negata
# Poi analizza i log e genera la policy:
audit2allow -a -M mia-policy
semodule -i mia-policy.pp

# Controlla il contesto SELinux di un file
ls -Z file
ls -Z /percorso/

# Controlla il contesto SELinux di un processo
ps aux -Z
ps -Z -p PID

# Cambia il contesto SELinux di un file
chcon -t httpd_sys_content_t /var/www/html/miofile.html

# Ripristina il contesto SELinux di default
restorecon -v /var/www/html/miofile.html
restorecon -Rv /var/www/html/   # ricorsivo

# Elenca i moduli SELinux
semodule -l

# Permetti ai servizi di fare cose comuni (boolean)
# Es: permettere ad Apache di connettere al network
setsebool -P httpd_can_network_connect on
setsebool -P httpd_can_network_connect_db on

# Elenca tutti i boolean
getsebool -a
getsebool -a | grep httpd

9.2 AppArmor (Ubuntu, Debian, openSUSE)

# Controlla se AppArmor è attivo
systemctl status apparmor
aa-status

# Mostra i profili caricati e la loro modalità
aa-status

# Modalità AppArmor:
# enforce: applica le restrizioni
# complain: registra le violazioni ma non le blocca

# Metti un profilo in modalità complain (per debug)
aa-complain /etc/apparmor.d/usr.sbin.nginx

# Rimetti un profilo in enforce
aa-enforce /etc/apparmor.d/usr.sbin.nginx

# Visualizza le violazioni AppArmor
journalctl -b | grep "apparmor"
grep "DENIED" /var/log/syslog
grep "apparmor" /var/log/kern.log

# Ricarica un profilo dopo una modifica
apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx

# Disabilita un profilo specifico
aa-disable /etc/apparmor.d/usr.sbin.nginx
# (crea un symlink in /etc/apparmor.d/disable/)

# Riabilita un profilo
rm /etc/apparmor.d/disable/usr.sbin.nginx
apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx

# Analizza i log per generare suggerimenti di profilo
aa-logprof

# Crea un nuovo profilo interattivamente
aa-genprof /path/to/programma

10. Pacchetti e Dipendenze

La gestione dei pacchetti è diversa tra le distribuzioni. I problemi più comuni sono dipendenze rotte, pacchetti corrotti e database dei pacchetti inconsistente.

10.1 APT — Debian, Ubuntu e derivate

# Aggiorna la lista dei pacchetti
apt update

# Aggiorna tutti i pacchetti installati
apt upgrade

# Aggiornamento completo (rimuove pacchetti obsoleti se necessario)
apt full-upgrade

# Installa un pacchetto
apt install nome-pacchetto

# Rimuovi un pacchetto (mantieni i file di configurazione)
apt remove nome-pacchetto

# Rimuovi un pacchetto e i suoi file di configurazione
apt purge nome-pacchetto

# Rimuovi i pacchetti non più necessari
apt autoremove

# Cerca un pacchetto
apt search parola-chiave

# Informazioni su un pacchetto
apt show nome-pacchetto

# Elenca i pacchetti installati
dpkg -l
dpkg -l | grep nome-parziale

# Controlla se un pacchetto è installato
dpkg -l nome-pacchetto

# Elenca i file installati da un pacchetto
dpkg -L nome-pacchetto

# Trova a quale pacchetto appartiene un file
dpkg -S /percorso/al/file
apt-file search /percorso/al/file   # richiede apt-file

# Reinstalla un pacchetto corrotto
apt install --reinstall nome-pacchetto

# Ripara le dipendenze rotte
apt --fix-broken install
dpkg --configure -a

# Forza la configurazione di pacchetti in attesa
dpkg --configure -a

# Pulisci la cache dei pacchetti scaricati
apt clean        # rimuove tutti i pacchetti scaricati
apt autoclean    # rimuove solo le versioni obsolete

# Risolvi dipendenze bloccate
apt -f install

# Blocca un pacchetto da aggiornamenti automatici
apt-mark hold nome-pacchetto
apt-mark unhold nome-pacchetto
apt-mark showhold

# Installa una versione specifica
apt install nome-pacchetto=1.2.3-4

# Scarica solo il file .deb senza installare
apt download nome-pacchetto

# Installa un .deb locale
dpkg -i pacchetto.deb
apt install ./pacchetto.deb   # risolve le dipendenze automaticamente

10.2 DNF/YUM — Fedora, Red Hat, CentOS, Rocky Linux

# Aggiorna la lista dei metadati e aggiorna tutto
dnf upgrade

# Installa un pacchetto
dnf install nome-pacchetto

# Rimuovi un pacchetto
dnf remove nome-pacchetto

# Cerca un pacchetto
dnf search parola-chiave

# Informazioni su un pacchetto
dnf info nome-pacchetto

# Elenca i pacchetti installati
dnf list installed

# Trova a quale pacchetto appartiene un file
dnf provides /percorso/al/file

# Elenca i file di un pacchetto installato
rpm -ql nome-pacchetto

# Controlla l'integrità di un pacchetto RPM
rpm -V nome-pacchetto

# Ripara il database RPM
rpm --rebuilddb

# Rimuovi i pacchetti orfani
dnf autoremove

# Pulisci la cache
dnf clean all

# Elenca i repository configurati
dnf repolist

# Abilita/disabilita un repository
dnf config-manager --enable nome-repo
dnf config-manager --disable nome-repo

# Installa un .rpm locale
dnf install ./pacchetto.rpm
rpm -ivh pacchetto.rpm

# Blocca un pacchetto
dnf versionlock add nome-pacchetto

10.3 Pacman — Arch Linux e derivate

# Aggiorna il database e tutti i pacchetti
pacman -Syu

# Installa un pacchetto
pacman -S nome-pacchetto

# Rimuovi un pacchetto
pacman -R nome-pacchetto

# Rimuovi pacchetto e dipendenze non più necessarie
pacman -Rs nome-pacchetto

# Cerca un pacchetto
pacman -Ss parola-chiave

# Informazioni su un pacchetto
pacman -Si nome-pacchetto         # pacchetto nei repository
pacman -Qi nome-pacchetto         # pacchetto installato

# Elenca i pacchetti installati
pacman -Q
pacman -Qe   # solo quelli installati esplicitamente

# Trova a quale pacchetto appartiene un file
pacman -Qo /percorso/al/file

# Elenca i file installati da un pacchetto
pacman -Ql nome-pacchetto

# Rimuovi i pacchetti orfani
pacman -Rns $(pacman -Qtdq)

# Pulisci la cache
pacman -Sc    # rimuove versioni obsolete
pacman -Scc   # rimuove tutta la cache

# Ripara il database
pacman -Dk
pacman-db-upgrade

# Reinstalla un pacchetto
pacman -S nome-pacchetto --overwrite='*'

# AUR (con yay o paru)
yay -S nome-pacchetto-aur
yay -Syu   # aggiorna anche i pacchetti AUR

11. File e Log

Saper navigare, cercare e analizzare file di log è una delle abilità più utili nel troubleshooting Linux.

11.1 Trovare file

# Trova file per nome (case-sensitive)
find /percorso -name "nomefile.txt"

# Trova file per nome (case-insensitive)
find /percorso -iname "*.log"

# Trova file modificati nelle ultime 24 ore
find /percorso -mtime -1

# Trova file modificati più di 7 giorni fa
find /percorso -mtime +7

# Trova file per dimensione (maggiori di 100MB)
find / -size +100M -type f

# Trova file per proprietario
find /percorso -user username

# Trova file con permessi specifici
find /percorso -perm 644
find /percorso -perm -u+s   # setuid

# Trova e cancella file (usa con cautela!)
find /percorso -name "*.tmp" -delete
find /percorso -name "*.tmp" -exec rm {} \;

# Trova file per tipo
find /percorso -type f   # file normali
find /percorso -type d   # directory
find /percorso -type l   # symlink

# Cerca contenuto nei file (grep)
grep "testo" file
grep -r "testo" /percorso/     # ricorsivo
grep -ri "testo" /percorso/    # case-insensitive
grep -l "testo" /percorso/*    # solo i nomi dei file con corrispondenza
grep -n "testo" file           # con numero di riga
grep -v "testo" file           # linee che NON contengono il testo
grep -A 5 "testo" file         # 5 righe dopo la corrispondenza
grep -B 5 "testo" file         # 5 righe prima
grep -C 5 "testo" file         # 5 righe prima e dopo

# Cerca più velocemente con ripgrep
rg "testo" /percorso/

# locate (usa un database pre-costruito, più veloce di find)
locate nomefile
updatedb   # aggiorna il database di locate (root)

11.2 Leggere e seguire i log

# Mostra le ultime 50 righe di un file
tail -n 50 /var/log/syslog

# Segui un file in tempo reale
tail -f /var/log/syslog

# Segui più file contemporaneamente
tail -f /var/log/syslog /var/log/auth.log

# Mostra le prime righe
head -n 20 /var/log/syslog

# Scorre un file lungo (q per uscire, / per cercare)
less /var/log/syslog

# File di log principali
/var/log/syslog          # log generale del sistema (Debian/Ubuntu)
/var/log/messages        # log generale (Red Hat/Fedora)
/var/log/auth.log        # autenticazioni (Debian/Ubuntu)
/var/log/secure          # autenticazioni (Red Hat/Fedora)
/var/log/kern.log        # messaggi del kernel
/var/log/dmesg           # messaggi kernel all'avvio
/var/log/apt/history.log # storia installazioni APT
/var/log/dpkg.log        # operazioni dpkg
/var/log/nginx/          # log Nginx
/var/log/apache2/        # log Apache
/var/log/mysql/          # log MySQL
/var/log/Xorg.0.log      # log del server X

# Log con journalctl (systemd)
journalctl              # tutti i log
journalctl -f           # segui in tempo reale
journalctl -n 100       # ultime 100 righe
journalctl -p err       # solo errori
journalctl --since today
journalctl --since "2024-01-15 08:00:00" --until "2024-01-15 10:00:00"
journalctl -u servizio  # log di un servizio specifico

11.3 Analizzare i log

# Conta le occorrenze di un pattern
grep "error" /var/log/syslog | wc -l

# Conta occorrenze per tipo
grep -o "ERROR\|WARNING\|INFO" /var/log/app.log | sort | uniq -c | sort -rn

# Trova IP che compaiono più spesso (es: analisi log Apache)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# Filtra per data nei log
grep "Jan 15" /var/log/syslog

# Estrai campi specifici con awk
awk '{print $1, $2, $3}' /var/log/nginx/access.log

# Mostra gli ultimi 100 tentativi di login SSH falliti
grep "Failed password" /var/log/auth.log | tail -100

# Cerca errori segmentation fault nei log
dmesg | grep "segfault"
journalctl | grep "segfault\|SIGSEGV"

11.4 Operazioni sui file

# Crea un link simbolico
ln -s /percorso/originale /percorso/link

# Crea un hard link
ln /percorso/originale /percorso/link

# Mostra dove punta un symlink
readlink -f /percorso/link

# Controlla il tipo di un file
file nomefile

# Mostra gli attributi dettagliati di un file
stat nomefile

# Differenza tra due file
diff file1 file2
diff -u file1 file2   # formato unified (più leggibile)

# Differenza ricorsiva tra due directory
diff -r dir1/ dir2/

# Copia mantenendo permessi, timestamp e link simbolici
cp -a sorgente/ destinazione/
rsync -av sorgente/ destinazione/

# Copia sicura con verifica (checksum)
rsync -av --checksum sorgente/ destinazione/

# Trova file duplicati (richiede fdupes)
fdupes -r /percorso/

# Calcola checksum di un file
md5sum file
sha256sum file
sha512sum file

12. Hardware e Periferiche

Capire l'hardware rilevato dal sistema è spesso il primo passo per diagnosticare problemi con dispositivi che non funzionano.

12.1 Panoramica dell'hardware

# Panoramica completa dell'hardware (richiede lshw)
lshw
lshw -short    # formato compatto
lshw -class cpu
lshw -class memory
lshw -class disk
lshw -class network

# Informazioni sulla CPU
lscpu
cat /proc/cpuinfo

# Informazioni sulla memoria RAM
dmidecode -t memory
free -h

# Informazioni sul sistema (motherboard, BIOS, ecc.)
dmidecode -t system
dmidecode -t baseboard
dmidecode -t bios

# Panoramica hardware con inxi (molto leggibile)
inxi -Fxz       # Full info, extra, anonimizza serial
inxi -C         # solo CPU
inxi -M         # solo scheda madre
inxi -G         # solo GPU
inxi -N         # solo rete
inxi -D         # solo dischi

# Informazioni sui dispositivi PCI
lspci
lspci -v        # verboso
lspci -vvv      # molto verboso
lspci -k        # mostra il driver del kernel associato

# Informazioni sui dispositivi USB
lsusb
lsusb -v        # verboso
lsusb -t        # albero USB

12.2 Temperatura e sensori hardware

# Installa e rileva i sensori (richiede lm-sensors)
# Prima rileva i chip di monitoraggio:
sensors-detect   # risponde yes a tutte le domande

# Mostra le temperature
sensors

# Mostra temperature in tempo reale
watch -n 2 sensors

# Temperatura delle unità disco
hddtemp /dev/sda
smartctl -A /dev/sda | grep Temp

# Temperatura GPU NVIDIA
nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader

# Temperatura GPU AMD
cat /sys/class/drm/card0/device/hwmon/hwmon*/temp1_input
# (dividi per 1000 per ottenere °C)

# Velocità delle ventole
sensors | grep fan

12.3 Gestione dell'energia

# Stato batteria (laptop)
upower -e                    # elenca le sorgenti di alimentazione
upower -i /org/freedesktop/UPower/devices/battery_BAT0

# Informazioni dettagliate sulla batteria
cat /sys/class/power_supply/BAT0/capacity
cat /sys/class/power_supply/BAT0/status
cat /sys/class/power_supply/BAT0/health

# Governatori CPU (gestione frequenza)
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

# Cambia governatore (performance, powersave, ondemand, schedutil)
echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# Con cpupower (più comodo)
cpupower frequency-info
cpupower frequency-set -g performance

# TLP (gestione avanzata del risparmio energetico)
systemctl status tlp
tlp-stat

13. USB, PCI e Driver

I problemi con dispositivi USB e PCI spesso si risolvono caricando il driver giusto o risolvendo conflitti tra moduli del kernel.

13.1 Moduli del kernel

# Elenca i moduli caricati
lsmod

# Cerca un modulo specifico
lsmod | grep usb
lsmod | grep nvidia
lsmod | grep bluetooth

# Informazioni su un modulo
modinfo nome-modulo
modinfo usbhid

# Carica un modulo
modprobe nome-modulo

# Carica un modulo con parametri
modprobe nome-modulo param=valore

# Scarica un modulo
modprobe -r nome-modulo
rmmod nome-modulo

# Scarica un modulo e le sue dipendenze
modprobe -rv nome-modulo

# Mostra le dipendenze di un modulo
modprobe --show-depends nome-modulo

# Ricarica un modulo
modprobe -r nome-modulo && modprobe nome-modulo

# Blacklist un modulo (impedisce il caricamento automatico)
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
# poi aggiorna initramfs:
update-initramfs -u   # Debian/Ubuntu
dracut --force        # Red Hat/Fedora

# Parametri persistenti per un modulo
echo "options nome-modulo param=valore" >> /etc/modprobe.d/nome-modulo.conf

13.2 Dispositivi USB

# Elenca i dispositivi USB connessi
lsusb
lsusb -v | less   # dettagli completi

# Mostra l'albero USB (hub, controller, dispositivi)
lsusb -t

# Monitora i dispositivi USB in tempo reale
udevadm monitor --subsystem-match=usb

# Mostra eventi udev (utile per debug di periferiche)
udevadm monitor

# Informazioni udev su un dispositivo
udevadm info -a -n /dev/sda
udevadm info -q all -n /dev/ttyUSB0

# Trova i log relativi a un dispositivo USB
dmesg | grep -i usb | tail -30
journalctl -b | grep -i usb

# Forza la re-enumerazione di un dispositivo USB
# (senza scollegarlo fisicamente)
echo "0" > /sys/bus/usb/devices/usb1/authorized
echo "1" > /sys/bus/usb/devices/usb1/authorized

# Mostra le regole udev
ls /etc/udev/rules.d/
ls /lib/udev/rules.d/

# Testa le regole udev
udevadm test /sys/class/block/sda

13.3 Firmware e driver mancanti

# Controlla se ci sono driver non caricati per mancanza di firmware
dmesg | grep -i "firmware"
dmesg | grep -i "failed to load"
journalctl -b | grep -i "firmware"

# Su Debian/Ubuntu installa i firmware non-liberi
apt install firmware-linux firmware-linux-nonfree
apt install linux-firmware

# Firmware WiFi comuni
apt install firmware-iwlwifi         # Intel WiFi
apt install firmware-realtek         # Realtek
apt install firmware-atheros         # Atheros

# Su Fedora/Red Hat (installare il repo RPM Fusion prima)
dnf install iwl7260-firmware         # Intel 7260
dnf install linux-firmware

# Controlla quale firmware è necessario
dmesg | grep "Direct firmware load"
# Es: "Direct firmware load for iwlwifi-7260-17.ucode failed"

# Verifica che il firmware sia nel posto giusto
ls /lib/firmware/
ls /lib/firmware/iwlwifi*

14. Problemi di Lentezza

Un sistema Linux lento può avere cause molto diverse: CPU saturata, memoria esaurita, I/O su disco lento, o swapping eccessivo.

14.1 Diagnosi rapida della lentezza

# Panoramica immediata: carico, memoria, processi
uptime && free -h && ps aux --sort=-%cpu | head -10

# Carico del sistema negli ultimi 1, 5, 15 minuti
cat /proc/loadavg

# Se load average > numero di core, il sistema è saturo
nproc   # numero di core

# Identificare il collo di bottiglia
# 1. CPU: usa top o htop, controlla %us e %sy
# 2. RAM: controlla se c'è swap in uso (free -h)
# 3. I/O: usa iotop o iostat
# 4. Rete: usa nethogs o iftop

14.2 Diagnosi CPU

# CPU in uso processo per processo
top     # premi P per ordinare per CPU
htop    # più leggibile

# Controlla se la CPU è in modalità risparmio energetico
cpupower frequency-info | grep "current CPU frequency"

# Forza la modalità performance
cpupower frequency-set -g performance

# Controlla i thermal throttling (riduzione frequenza per surriscaldamento)
dmesg | grep -i "throttle"
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq

# Monitoraggio con perf
perf top   # processi che usano più CPU

14.3 Diagnosi memoria e swap

# Utilizzo memoria con dettaglio
free -h
cat /proc/meminfo | head -30

# Lo swap in uso è spesso segnale di RAM insufficiente
# MemAvailable basso = poca memoria libera
# SwapUsed alto = sistema sta usando swap

# Processi che usano più memoria
ps aux --sort=-%mem | head -15

# Controlla la "swappiness" (quanto il kernel swappa proattivamente)
cat /proc/sys/vm/swappiness
# Default: 60, per server spesso si abbassa a 10-20
echo 10 > /proc/sys/vm/swappiness   # temporaneo
# Per renderlo permanente: aggiungi vm.swappiness=10 in /etc/sysctl.conf

# Controlla se c'è un memory leak
# Monitora un processo nel tempo:
watch -n 5 "ps aux | grep nome-processo | awk '{print \$6}'"

# Mostra il consumo di RAM per ogni processo (RSS = memoria fisica)
ps aux --sort=-rss | awk '{print $1, $2, $6/1024 "MB", $11}' | head -20

# OOM Killer: controlla se il kernel ha terminato processi per mancanza di memoria
dmesg | grep -i "oom"
journalctl | grep -i "out of memory"
grep -i "killed process" /var/log/syslog

14.4 Diagnosi I/O su disco

# Mostra l'utilizzo di I/O per ogni processo
iotop

# Solo i processi attivi
iotop -o

# Statistiche di I/O per dispositivo (aggiorna ogni secondo)
iostat -x 1

# Valori importanti in iostat:
# %util: percentuale di utilizzo del disco (>80% = saturo)
# await: tempo medio di attesa per I/O (ms)
# svctm: tempo di servizio effettivo
# r/s, w/s: read/write per secondo

# Controlla se il disco è il collo di bottiglia
# Classifica processi per I/O
pidstat -d 1   # richiede sysstat

# Benchmark velocità del disco
dd if=/dev/zero of=/tmp/test bs=1G count=1 oflag=direct
dd if=/tmp/test of=/dev/null bs=1G count=1 iflag=direct

# Con hdparm
hdparm -Tt /dev/sda

# Controlla la modalità I/O scheduler
cat /sys/block/sda/queue/scheduler

# Cambia I/O scheduler
echo "mq-deadline" > /sys/block/sda/queue/scheduler
# Schedulatori disponibili: mq-deadline, kyber, bfq, none

14.5 Diagnosi rete

# Mostra il traffico di rete per interfaccia
iftop
iftop -i eth0

# Mostra il traffico per processo
nethogs
nethogs eth0

# Statistiche di rete dettagliate
sar -n DEV 1 5

# Controlla la velocità dell'interfaccia di rete
ethtool eth0 | grep Speed
ip link show eth0

# Test velocità di rete (richiede iperf3)
# Sul server:
iperf3 -s
# Sul client:
iperf3 -c INDIRIZZO_SERVER

# Test latenza verso un host
ping -c 100 8.8.8.8 | tail -5   # mostra statistiche

15. Crash di Applicazioni

Quando un'applicazione crasha, Linux può generare file di core dump che permettono di analizzare lo stato del programma al momento del crash.

15.1 Configurare i core dump

# Controlla il limite attuale per i core dump
ulimit -c

# Abilita i core dump illimitati (per la sessione corrente)
ulimit -c unlimited

# Controlla dove vengono salvati i core dump
cat /proc/sys/kernel/core_pattern

# Con systemd-coredump (configurazione moderna)
# I core dump vengono salvati automaticamente e accessibili con:
coredumpctl list

# Mostra i crash recenti
coredumpctl list

# Analizza un crash specifico
coredumpctl info PID
coredumpctl debug PID   # apre gdb sul core dump

# Mostra i log di un crash
coredumpctl show PID

15.2 Analizzare i crash

# Analisi con gdb
gdb /percorso/al/programma core

# Dentro gdb:
# bt          = backtrace (stack delle chiamate al momento del crash)
# bt full     = backtrace dettagliato
# info regs   = registri della CPU
# list        = mostra il codice sorgente
# quit        = esci

# Analizza i log di sistema per il crash
dmesg | grep "segfault"
journalctl | grep -i "segfault\|SIGSEGV\|killed\|oom"

# Analisi con strace (traccia le system call di un processo)
strace -p PID              # attach a un processo in esecuzione
strace programma           # avvia e traccia dall'inizio
strace -e trace=file programma   # traccia solo le syscall sui file
strace -o output.txt programma   # salva l'output su file

# Analisi con ltrace (traccia le chiamate alle librerie)
ltrace programma

# Verifica le librerie necessarie a un programma
ldd /percorso/al/programma

# Controlla se una libreria è mancante
ldd /percorso/al/programma | grep "not found"

# Librerie dinamiche caricate da un processo in esecuzione
cat /proc/PID/maps | grep "\.so"

# Verifica l'integrità di un eseguibile
file /percorso/al/programma
checksec --file=/percorso/al/programma   # richiede checksec

15.3 Applicazioni che non si avviano

# Avvia l'applicazione da terminale per vedere l'output di errore
nome-applicazione

# Controlla le variabili d'ambiente
env | grep -i nome-app
echo $LD_LIBRARY_PATH
echo $PATH

# Controlla i permessi dell'eseguibile
ls -la /percorso/al/programma

# Verifica che l'eseguibile sia compatibile con il sistema
file /percorso/al/programma
# Es: "ELF 64-bit LSB executable, x86-64" = richiede sistema 64-bit

# Controlla le librerie mancanti
ldd /percorso/al/programma

# Cerca nel journal i messaggi dell'applicazione
journalctl | grep nome-applicazione
journalctl _EXE=/percorso/al/programma

# Controlla gli errori X11/Wayland
LIBGL_DEBUG=verbose nome-applicazione
GTK_DEBUG=all nome-applicazione 2>&1 | head -50
QT_DEBUG_PLUGINS=1 nome-applicazione

16. Accesso Remoto e SSH

SSH è il protocollo standard per l'accesso remoto sicuro. I problemi con SSH sono tra i più frustranti perché possono bloccare l'accesso al sistema.

16.1 Configurazione e diagnosi SSH

# Connessione base
ssh utente@host
ssh utente@host -p 2222   # porta non standard

# Connessione con verbosità (utile per debug)
ssh -v utente@host    # verbose
ssh -vv utente@host   # più verbose
ssh -vvv utente@host  # massima verbosità

# Connessione con una chiave specifica
ssh -i ~/.ssh/chiave_privata utente@host

# Connessione con port forwarding locale
ssh -L 8080:localhost:80 utente@host

# Connessione con port forwarding remoto
ssh -R 9090:localhost:80 utente@host

# SOCKS proxy tramite SSH
ssh -D 1080 utente@host

# Esegui un comando remoto senza shell interattiva
ssh utente@host "comando"

# Copia file con SCP
scp file.txt utente@host:/percorso/
scp -r directory/ utente@host:/percorso/

# Copia file con rsync (più efficiente)
rsync -avz file.txt utente@host:/percorso/
rsync -avz -e "ssh -p 2222" directory/ utente@host:/percorso/

# Stato del servizio SSH
systemctl status sshd

# Log SSH
journalctl -u sshd -f
grep "sshd" /var/log/auth.log | tail -50

# File di configurazione SSH server
cat /etc/ssh/sshd_config

# Verifica la configurazione senza riavviare
sshd -t

16.2 Gestione chiavi SSH

# Genera una coppia di chiavi (RSA 4096 bit)
ssh-keygen -t rsa -b 4096 -C "commento@esempio"

# Genera chiave Ed25519 (più moderna e sicura)
ssh-keygen -t ed25519 -C "commento@esempio"

# Copia la chiave pubblica su un host remoto
ssh-copy-id utente@host
ssh-copy-id -i ~/.ssh/chiave_pubblica.pub utente@host

# Aggiungi manualmente la chiave pubblica
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys

# Permessi corretti per i file SSH
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/config

# Controlla le chiavi SSH dell'agente
ssh-add -l

# Aggiungi una chiave all'agente
ssh-add ~/.ssh/chiave_privata

# Usa il file ~/.ssh/config per semplificare le connessioni
# Esempio di ~/.ssh/config:
# Host mioserver
#     HostName 192.168.1.100
#     User username
#     Port 2222
#     IdentityFile ~/.ssh/chiave_specifica
#     ServerAliveInterval 60

16.3 Problemi comuni con SSH

# Problema: "Connection refused"
# Causa: il server SSH non è in ascolto
systemctl start sshd
ss -tulpn | grep :22

# Problema: "Permission denied (publickey)"
# Causa: chiave non accettata
# Controlla i permessi su authorized_keys
ls -la ~/.ssh/authorized_keys
# Deve essere: -rw-------

# Controlla il log del server
journalctl -u sshd | grep "username"

# Abilita autenticazione con password temporaneamente
# In /etc/ssh/sshd_config:
# PasswordAuthentication yes
systemctl reload sshd

# Problema: "Host key verification failed"
# Causa: la chiave del server è cambiata
ssh-keygen -R hostname    # rimuovi la vecchia chiave dal known_hosts
# oppure
ssh -o StrictHostKeyChecking=no utente@host

# Problema: connessione che cade
# Aggiungi a ~/.ssh/config:
# ServerAliveInterval 60
# ServerAliveCountMax 3
# oppure al server in /etc/ssh/sshd_config:
# ClientAliveInterval 60
# ClientAliveCountMax 3

# Problema: "Too many authentication failures"
# Causa: troppi tentativi con chiavi diverse
ssh -o IdentitiesOnly=yes -i ~/.ssh/chiave utente@host

# Controlla gli accessi SSH falliti
grep "Failed password" /var/log/auth.log
grep "Invalid user" /var/log/auth.log

# Trova gli IP che tentano attacchi brute force
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -20

16.4 Fail2ban — protezione brute force

# Stato di fail2ban
fail2ban-client status

# Stato della jail SSH
fail2ban-client status sshd

# Sblocca un IP bannato
fail2ban-client set sshd unbanip 192.168.1.100

# Banna manualmente un IP
fail2ban-client set sshd banip 192.168.1.100

# Log di fail2ban
tail -f /var/log/fail2ban.log
journalctl -u fail2ban -f

17. VPN e Tailscale

Le VPN permettono di creare reti private sicure. Tailscale è una soluzione moderna basata su WireGuard che semplifica enormemente la configurazione.

17.1 WireGuard

# Controlla lo stato di WireGuard
wg show
wg show all

# Mostra le interfacce WireGuard
ip link show type wireguard

# Attiva un'interfaccia WireGuard
wg-quick up wg0

# Disattiva un'interfaccia WireGuard
wg-quick down wg0

# Stato del servizio
systemctl status wg-quick@wg0

# Abilita all'avvio
systemctl enable wg-quick@wg0

# Configurazione tipica /etc/wireguard/wg0.conf:
# [Interface]
# PrivateKey = ...
# Address = 10.0.0.1/24
# ListenPort = 51820
#
# [Peer]
# PublicKey = ...
# AllowedIPs = 10.0.0.2/32
# Endpoint = 1.2.3.4:51820
# PersistentKeepalive = 25

# Genera una coppia di chiavi WireGuard
wg genkey | tee privatekey | wg pubkey > publickey
cat privatekey
cat publickey

# Mostra statistiche di trasferimento
wg show wg0 transfer

# Log WireGuard
dmesg | grep wireguard
journalctl | grep wireguard

17.2 Tailscale

# Stato di Tailscale
tailscale status

# Connetti a Tailscale
tailscale up

# Connetti con autenticazione a un server specifico
tailscale up --login-server https://mio-headscale.example.com

# Disconnetti
tailscale down

# Mostra l'IP Tailscale del dispositivo corrente
tailscale ip

# Mostra gli IP di tutti i dispositivi nella rete
tailscale status

# Ping un altro nodo Tailscale
tailscale ping nome-nodo

# Mostra informazioni sul nodo corrente
tailscale status --self

# Controlla la connettività con un nodo
tailscale ping --c 5 nome-nodo

# Abilita il nodo come exit node (router per tutto il traffico)
tailscale up --advertise-exit-node

# Usa un exit node specifico
tailscale up --exit-node=nome-nodo

# Abilita SSH tramite Tailscale (senza dover aprire porte)
tailscale up --ssh

# Log di Tailscale
journalctl -u tailscaled -f
tailscale debug

# Stato del servizio
systemctl status tailscaled

# Riavvia il servizio
systemctl restart tailscaled

17.3 OpenVPN

# Connetti a un server OpenVPN
openvpn --config /percorso/al/client.ovpn

# Come servizio
systemctl start openvpn@client    # usa /etc/openvpn/client.conf
systemctl enable openvpn@client

# Stato
systemctl status openvpn@client

# Log
journalctl -u openvpn@client -f
tail -f /var/log/openvpn/openvpn.log

# Verifica l'interfaccia VPN
ip addr show tun0

# Controlla il routing VPN
ip route | grep tun0

18. Container e Virtualizzazione

Docker, Podman e sistemi di virtualizzazione come KVM sono ormai comuni anche su workstation e server Linux.

18.1 Docker

# Stato del servizio Docker
systemctl status docker

# Informazioni generali su Docker
docker info
docker version

# Elenca i container in esecuzione
docker ps

# Elenca tutti i container (anche fermati)
docker ps -a

# Elenca le immagini
docker images

# Avvia un container
docker run -it ubuntu bash
docker run -d -p 80:80 --name mio-nginx nginx

# Ferma un container
docker stop container-id

# Riavvia un container
docker restart container-id

# Rimuovi un container
docker rm container-id

# Rimuovi un'immagine
docker rmi immagine

# Log di un container
docker logs container-id
docker logs -f container-id          # segui in tempo reale
docker logs --tail 100 container-id  # ultime 100 righe

# Entra in un container in esecuzione
docker exec -it container-id bash
docker exec -it container-id sh

# Copia file da/verso un container
docker cp file.txt container-id:/percorso/
docker cp container-id:/percorso/file.txt .

# Statistiche di utilizzo risorse
docker stats

# Ispeziona un container
docker inspect container-id

# Ispeziona la rete Docker
docker network ls
docker network inspect bridge

# Pulizia generale (container, immagini, volumi non usati)
docker system prune
docker system prune -a      # rimuove anche immagini non usate
docker system prune --volumes

# Docker Compose
docker compose up -d         # avvia in background
docker compose down          # ferma e rimuove
docker compose logs -f       # log di tutti i servizi
docker compose ps            # stato dei servizi
docker compose restart servizio

18.2 Podman

# Podman è compatibile con Docker ma rootless per default
podman ps
podman images
podman run -it fedora bash
podman logs container-id
podman exec -it container-id bash
podman stats

# Podman può eseguire come servizio systemd
systemctl --user status podman.socket

# Genera un file systemd per un container
podman generate systemd --name container-id > ~/.config/systemd/user/mio-container.service

# Pods (gruppo di container)
podman pod create --name mio-pod
podman pod start mio-pod
podman pod stop mio-pod
podman pod ps

18.3 KVM/QEMU e libvirt

# Verifica il supporto di virtualizzazione hardware
egrep -c '(vmx|svm)' /proc/cpuinfo   # >0 = supportata
kvm-ok   # richiede cpu-checker su Ubuntu

# Stato del servizio libvirt
systemctl status libvirtd

# Elenca le macchine virtuali
virsh list          # solo quelle in esecuzione
virsh list --all    # tutte

# Avvia una VM
virsh start nome-vm

# Ferma una VM
virsh shutdown nome-vm   # spegnimento pulito
virsh destroy nome-vm    # spegnimento forzato

# Sospendi e riprendi una VM
virsh suspend nome-vm
virsh resume nome-vm

# Consola di una VM
virsh console nome-vm

# Informazioni su una VM
virsh dominfo nome-vm
virsh dumpxml nome-vm

# Snapshot di una VM
virsh snapshot-create-as nome-vm snap1 "Descrizione"
virsh snapshot-list nome-vm
virsh snapshot-revert nome-vm snap1

# Rete virtuale
virsh net-list --all
virsh net-start default
virsh net-autostart default

19. Diagnostica Avanzata

19.1 Analisi del sistema con systemd-analyze e strumenti avanzati

# Verifica la salute generale del sistema
systemctl --failed          # servizi falliti
journalctl -p err -b        # errori dall'ultimo avvio
dmesg -l err,crit,alert,emerg   # errori critici del kernel

# Analisi del sistema con systemd-analyze security
systemd-analyze security nome-servizio

# Panoramica delle risorse del sistema
sar -u 1 5    # CPU
sar -r 1 5    # RAM
sar -d 1 5    # disco
sar -n DEV 1 5  # rete

19.2 Profiling e tracing avanzato

# perf — profiling del kernel e delle applicazioni
perf top                    # uso CPU in tempo reale
perf stat comando           # statistiche di esecuzione
perf record -g comando      # registra per analisi
perf report                 # analizza il report

# strace — traccia le system call
strace -p PID               # attach a processo in esecuzione
strace -c comando           # conta le syscall
strace -T comando           # mostra il tempo per ogni syscall
strace -e openat comando    # traccia solo apertura file

# ltrace — traccia chiamate a librerie
ltrace comando
ltrace -p PID

# ftrace — tracing del kernel
# Attiva un tracer
echo "function" > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/tracing_on
cat /sys/kernel/debug/tracing/trace | head -50
echo 0 > /sys/kernel/debug/tracing/tracing_on

# bpftrace — tracing moderno con eBPF
# Controlla le system call aperte
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'

# Conta le syscall per processo
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'

19.3 Analisi della memoria avanzata

# valgrind — rileva memory leak e accessi non validi
valgrind --leak-check=full --show-leak-kinds=all comando

# AddressSanitizer (richiede ricompilazione con -fsanitize=address)
# Rileva buffer overflow, use-after-free, ecc.

# Analisi del pool di memoria del kernel
cat /proc/slabinfo
slabtop   # monitor interattivo del slab cache

# Analisi delle pagine di memoria
cat /proc/buddyinfo
cat /proc/pagetypeinfo

# Huge pages
cat /proc/meminfo | grep Huge
cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

19.4 Analisi di rete avanzata

# tcpdump — cattura il traffico di rete
tcpdump -i eth0                  # cattura su eth0
tcpdump -i any                   # su tutte le interfacce
tcpdump -i eth0 port 80          # solo porta 80
tcpdump -i eth0 host 8.8.8.8    # solo traffico verso/da IP
tcpdump -i eth0 -w cattura.pcap  # salva su file
tcpdump -r cattura.pcap          # leggi il file

# wireshark in modalità CLI
tshark -i eth0
tshark -i eth0 -f "port 443"
tshark -r cattura.pcap -Y "http"

# nmap — scansione di rete
nmap 192.168.1.1              # scansione base
nmap -sV 192.168.1.1          # rileva versioni dei servizi
nmap -O 192.168.1.1           # rileva sistema operativo
nmap -p 1-1000 192.168.1.1    # scansiona le prime 1000 porte
nmap -A 192.168.1.0/24        # scansione aggressiva di subnet
nmap --script vuln 192.168.1.1  # controlla vulnerabilità note

# netcat — test di porte e connessioni
nc -zv 192.168.1.1 80          # test di connettività TCP
nc -zvu 192.168.1.1 53         # test UDP
nc -l 8080                     # ascolta su porta 8080
echo "test" | nc host 80       # invia dati a una porta

19.5 Hardening e sicurezza

# Controlla gli utenti con shell di login
cat /etc/passwd | grep "/bin/bash\|/bin/sh\|/bin/zsh"

# Controlla chi può fare sudo
cat /etc/sudoers
ls /etc/sudoers.d/

# Controlla le sessioni attive
who
w
last           # storia dei login
lastlog        # ultimo login di ogni utente
lastb          # login falliti

# Controlla i cron job
crontab -l                    # cron job dell'utente corrente
crontab -l -u username        # cron job di un utente specifico
ls /etc/cron.d/
ls /etc/cron.daily/
ls /etc/cron.weekly/
cat /etc/crontab

# Controlla i processi in esecuzione come root
ps aux | awk '$1 == "root"'

# Controlla le porte in ascolto
ss -tulpn

# Verifica integrità del sistema con aide (se installato)
aide --check

# Controlla file recentemente modificati (ultimi 24 ore)
find / -mtime -1 -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null | head -50

# Controlla i file SUID/SGID
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null

# Analisi dei log di sicurezza
grep "sudo" /var/log/auth.log | tail -50
grep "FAILED" /var/log/auth.log | tail -50

19.6 Troubleshooting con strumenti di sistema

# Controlla i limiti di sistema (ulimit)
ulimit -a          # mostra tutti i limiti
ulimit -n          # limite file descriptor aperti
ulimit -u          # limite processi
ulimit -s          # dimensione stack

# Aumenta il limite di file descriptor
ulimit -n 65536

# Modifica i limiti di sistema permanentemente
# /etc/security/limits.conf:
# username soft nofile 65536
# username hard nofile 65536
# * soft nproc 100000
# * hard nproc 100000

# Parametri del kernel (sysctl)
sysctl -a                          # mostra tutti i parametri
sysctl kernel.hostname             # mostra un parametro
sysctl -w kernel.hostname=nuovo    # modifica al volo
sysctl -p                          # applica /etc/sysctl.conf

# Parametri utili per troubleshooting
sysctl vm.swappiness               # aggressività swap
sysctl net.core.somaxconn          # max connessioni in coda
sysctl fs.file-max                 # max file descriptor globali
sysctl kernel.pid_max              # max PID

# Informazioni sullo spazio degli inode
df -i
# Se "IUse%" è al 100%, il disco è "pieno" di inode anche se ha spazio

# Trova directory con molti file piccoli
find / -xdev -printf '%h\n' 2>/dev/null | sort | uniq -c | sort -rn | head -20

# Controlla le connessioni TCP in stato TIME_WAIT (comune nei server web)
ss -tan state time-wait | wc -l

# Azzera le statistiche delle interfacce di rete
ip -s -s link set eth0 statistics

# Informazioni sui cgroup (gestione risorse per processo/container)
systemd-cgtop                    # monitor interattivo cgroup
cat /sys/fs/cgroup/memory/memory.usage_in_bytes  # uso memoria cgroup

# Verifica la frammentazione del filesystem
e2fsck -fn /dev/sda1 2>/dev/null | grep "fragmented"

Appendice: Comandi di Emergenza Rapida

Una raccolta di comandi da usare quando il sistema non risponde o si comporta in modo anomalo.

# Il sistema è completamente bloccato: Magic SysRq keys
# (richiede supporto nel kernel e /proc/sys/kernel/sysrq = 1)
# Alt+SysRq+R - prendi il controllo della tastiera
# Alt+SysRq+E - invia SIGTERM a tutti i processi
# Alt+SysRq+I - invia SIGKILL a tutti i processi
# Alt+SysRq+S - sincronizza i filesystem
# Alt+SysRq+U - rimonta tutti i filesystem in sola lettura
# Alt+SysRq+B - riavvia il sistema
# La sequenza sicura: R-E-I-S-U-B (Remember Everything Is Saved Under Boot)

# Verifica rapidamente lo stato del sistema
echo "=== LOAD ===" && uptime
echo "=== MEMORIA ===" && free -h
echo "=== DISCO ===" && df -h
echo "=== ERRORI ===" && journalctl -p err -b --no-pager | tail -20
echo "=== PROCESSI TOP CPU ===" && ps aux --sort=-%cpu | head -6
echo "=== PORTE IN ASCOLTO ===" && ss -tulpn

# Script di diagnostica rapida
for cmd in "uptime" "free -h" "df -h" "ss -tulpn" "systemctl --failed"; do
    echo ">>> $cmd"
    eval $cmd
    echo
done

Questa guida copre le situazioni più comuni nel troubleshooting Linux. Ogni sistema è diverso: distribuzioni, kernel, configurazioni e workload possono influenzare i comandi disponibili e il loro comportamento. Quando un comando non è disponibile, spesso esiste un pacchetto da installare o un'alternativa equivalente.