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
- Boot e avvio
- Servizi systemd
- Rete e DNS
- Firewall
- Dischi, mount e filesystem
- Processi e risorse
- GPU e grafica
- Permessi
- SELinux e AppArmor
- Pacchetti e dipendenze
- File e log
- Hardware e periferiche
- USB, PCI e driver
- Problemi di lentezza
- Crash di applicazioni
- Accesso remoto e SSH
- VPN e Tailscale
- Container e virtualizzazione
- 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:
- Riavvia il sistema.
- Tieni premuto
Shift(BIOS) oEsc(UEFI) per accedere al menu di GRUB. - Seleziona "Advanced options" e poi la voce con "(recovery mode)".
- Scegli "root – Drop to root shell prompt".
Modificare i parametri del kernel al volo da GRUB:
- Nel menu GRUB, seleziona la voce di avvio e premi
eper editarla. - Trova la riga che inizia con
linuxe aggiungi parametri in fondo. - Premi
Ctrl+XoF10per 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:
- Reallocated_Sector_Ct: settori riassegnati. Se non è zero, il disco ha problemi fisici.
- Current_Pending_Sector: settori in attesa di riassegnazione.
- Offline_Uncorrectable: errori non correggibili.
- Temperature: temperatura del disco.
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.