Wiki di Michele

Test dei dischi su Linux

GuidaUltima modifica: 24/10/2026 Verificata il 24/10/2026

Guida completa per riconoscere il tipo di un disco, leggerne lo stato di salute e l'usura, misurarne la velocità e verificarne l'integrità.

Avvertenze prima di iniziare

Strumenti

StrumentoPacchettoA cosa serve
smartctl, smartdsmartmontoolsStato di salute e usura (SMART)
nvmenvme-cliInformazioni e log dei dischi NVMe
hdparmhdparmInformazioni e test di lettura rapido
fiofioBenchmark completo e preciso
iopingiopingLatenza del disco
iostatsysstatStatistiche di I/O in tempo reale
badblockse2fsprogsRicerca dei settori danneggiati
f3f3Rilevare chiavette e schede con capacità falsa
GNOME Dischignome-disk-utilityInterfaccia grafica con SMART e benchmark
KDiskMarkkdiskmarkInterfaccia grafica per fio, in stile CrystalDiskMark

Installazione su Arch e EndeavourOS:

sudo pacman -S smartmontools nvme-cli hdparm fio ioping sysstat f3 gnome-disk-utility

Su Debian e Ubuntu:

sudo apt install smartmontools nvme-cli hdparm fio ioping sysstat f3 gnome-disk-utility

KDiskMark non è presente in tutte le distribuzioni: su Arch verifica con pacman -Ss kdiskmark, altrimenti è disponibile come Flatpak.

1. Riconoscere i dischi e il loro tipo

Elenco dei dischi

lsblk
lsblk -d -o NAME,SIZE,TYPE,ROTA,TRAN,MODEL,SERIAL
lsblk -f
sudo fdisk -l
ls -l /dev/disk/by-id/

Nel secondo comando le colonne importanti sono:

ColonnaSignificato
ROTA1 = disco rotante (HDD), 0 = memoria a stato solido (SSD, NVMe, USB flash)
TRANInterfaccia: sata, nvme, usb, sas, ata
MODELModello, utile per cercare la scheda tecnica

Verifica diretta della rotazione:

cat /sys/block/sda/queue/rotational

Nomi dei dispositivi

NomeTipo
/dev/sda, sdb...Dischi SATA, SAS, USB e SCSI
/dev/nvme0n1SSD NVMe (nvme0 è il controller, n1 il namespace, p1 le partizioni)
/dev/mmcblk0Schede SD e memorie eMMC
/dev/vdaDischi virtuali (macchine virtuali)
/dev/md0RAID software (mdadm)
/dev/dm-0, /dev/mapper/...LVM e volumi cifrati (LUKS)
/dev/loop0File montati come dischi (snap, immagini)

Informazioni dettagliate

sudo smartctl -i /dev/sda
sudo hdparm -I /dev/sda
sudo nvme list
sudo nvme id-ctrl /dev/nvme0

Da smartctl -i leggi:

Tipi di disco

TipoCaratteristiche
HDDPiatti magnetici in rotazione. Economici e capienti, lenti nell'accesso casuale, sensibili a urti e vibrazioni. Si usurano meccanicamente
SSD SATAMemoria flash con interfaccia SATA III: circa 550 MB/s al massimo
SSD NVMeMemoria flash su bus PCIe: da 2000 a oltre 10000 MB/s a seconda della generazione
eMMC / SDMemoria flash economica e lenta, tipica di portatili entry level, schede SBC e fotocamere
Chiavetta / disco USBFlash (o HDD) dietro un adattatore USB: la velocità dipende da USB e dal controller

Tipi di memoria flash

Dalla durata più alta alla più bassa: SLC (1 bit per cella), MLC (2), TLC (3), QLC (4). La maggior parte degli SSD di consumo è TLC o QLC.

Due dettagli che influenzano i test di velocità:

CMR e SMR (solo per HDD)

I dischi SMR (Shingled Magnetic Recording) scrivono le tracce sovrapposte: le scritture lunghe e casuali diventano molto lente, e creano problemi in RAID e ZFS. Il sistema non sempre lo rivela: controlla il modello nella scheda tecnica del produttore.

Verificare l'interfaccia effettivamente usata

Un SSD veloce su una porta lenta viene limitato.

SATA:

sudo smartctl -i /dev/sda | grep -i "SATA Version"

L'output SATA 3.3, 6.0 Gb/s (current: 6.0 Gb/s) indica che il collegamento è al massimo. Se è 1.5 Gb/s o 3.0 Gb/s, controlla porta e cavo.

NVMe (generazione e numero di linee PCIe):

sudo lspci -vv | grep -iA 40 "Non-Volatile memory controller" | grep -E "LnkCap:|LnkSta:"
Velocità del collegamentoGenerazione
8GT/sPCIe 3.0
16GT/sPCIe 4.0
32GT/sPCIe 5.0

Un disco con LnkSta: Speed 8GT/s, Width x2 quando il disco è un x4 sta andando a metà della velocità: succede con slot M.2 condivisi o limitati.

USB:

lsusb -t

La velocità in fondo alla riga: 480M (USB 2.0), 5000M (USB 3.0), 10000M (USB 3.1 Gen 2), 20000M (USB 3.2 Gen 2x2). Se un disco USB 3 appare a 480M, è su una porta o un cavo USB 2.

2. Leggere lo stato e l'usura (SMART)

SMART (Self-Monitoring, Analysis and Reporting Technology) è il sistema con cui il disco registra contatori interni su errori, ore di utilizzo, temperatura e usura.

Comandi principali

sudo smartctl --scan
sudo smartctl -H /dev/sda
sudo smartctl -i /dev/sda
sudo smartctl -A /dev/sda
sudo smartctl -a /dev/sda
sudo smartctl -x /dev/sda
sudo smartctl -l error /dev/sda
sudo smartctl -l selftest /dev/sda
OpzioneContenuto
-HEsito generale (PASSED o FAILED)
-iInformazioni sul disco
-ATabella degli attributi SMART
-aTutto il necessario in un colpo solo
-xInformazioni estese, comprese statistiche del dispositivo
-l errorRegistro degli errori
-l selftestRisultati dei self-test

Funziona anche senza sudo se l'utente è nel gruppo disk, ma è più semplice usare sudo.

Dischi dietro adattatori USB

Molti adattatori non espongono SMART in modo automatico. Prova a indicare il tipo:

sudo smartctl -a -d sat /dev/sdb
sudo smartctl -a -d sat,12 /dev/sdb
sudo smartctl -a -d scsi /dev/sdb

Alcuni adattatori non lo supportano affatto.

Dischi dietro RAID hardware

sudo smartctl -a -d megaraid,0 /dev/sda
sudo smartctl -a -d cciss,0 /dev/cciss/c0d0

Il numero è l'indice del disco fisico nel controller.

Leggere la tabella degli attributi

Esempio:

ID# ATTRIBUTE_NAME          FLAG   VALUE WORST THRESH TYPE     UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033 100    100   010    Pre-fail Always   -           0
  9 Power_On_Hours          0x0032 097    097   000    Old_age  Always   -           12345
ColonnaSignificato
VALUEValore normalizzato, di solito parte da 100 (o 253/200) e scende col peggioramento
WORSTIl peggior valore mai registrato
THRESHSoglia: se VALUE scende al di sotto, l'attributo è in errore
TYPEPre-fail (segnale di guasto imminente) oppure Old_age (usura normale)
RAW_VALUEValore reale (settori, ore, gradi...)

I produttori usano numeri e formati diversi: per ogni attributo conta soprattutto il valore grezzo e la sua tendenza nel tempo.

Attributi da guardare negli HDD

IDNomeSignificato
5Reallocated_Sector_CtSettori danneggiati sostituiti con settori di riserva
187Reported_UncorrectErrori di lettura non correggibili
188Command_TimeoutComandi andati in timeout
196Reallocated_Event_CountNumero di eventi di riallocazione
197Current_Pending_SectorSettori instabili in attesa di riallocazione
198Offline_UncorrectableSettori non correggibili trovati nei test offline
199UDMA_CRC_Error_CountErrori di trasmissione: di solito cavo o connettore, non il disco
10Spin_Retry_CountTentativi di avvio del motore: segnale meccanico
9Power_On_HoursOre di accensione
12Power_Cycle_CountNumero di accensioni
193Load_Cycle_CountParcheggi delle testine (alcuni HDD ne fanno molti per via del risparmio energetico)
194Temperature_CelsiusTemperatura

Regola pratica: valori diversi da zero e in crescita su 5, 187, 197 e 198 sono un segnale serio. Fai subito un backup e sostituisci il disco.

Attributi da guardare negli SSD SATA

I nomi variano molto da produttore a produttore. Cerca quelli simili a questi:

IDNome (esempi)Significato
177Wear_Leveling_Count (Samsung)Usura: VALUE scende da 100 verso 0
231SSD_Life_Left, Remaining_Lifetime_PercVita residua in percentuale
233Media_Wearout_Indicator (Intel)Usura delle celle
202Percent_Lifetime_Remain (Crucial/Micron)Vita residua
169Remaining_Lifetime_PercVita residua (alcuni marchi)
241Total_LBAs_WrittenDati scritti in blocchi
242Total_LBAs_ReadDati letti in blocchi
5Reallocated_Sector_CtBlocchi sostituiti
187 / 174Errori non correggibili / spegnimenti improvvisi
9Power_On_HoursOre di accensione

Per sapere quanti terabyte sono stati scritti:

sudo smartctl -A /dev/sda | grep -i "Total_LBAs_Written"

Con blocchi da 512 byte: TB scritti = RAW_VALUE × 512 / 1.000.000.000.000. Alcuni produttori usano altre unità: verifica con la documentazione o con smartctl -x, che a volte mostra già i dati in terabyte nella sezione "Device Statistics".

Calcolo rapido in shell:

raw=$(sudo smartctl -A /dev/sda | awk '/Total_LBAs_Written/ {print $NF}')
echo "scale=2; $raw * 512 / 10^12" | bc

Dischi NVMe

sudo smartctl -a /dev/nvme0
sudo nvme smart-log /dev/nvme0
sudo nvme smart-log -H /dev/nvme0
sudo nvme error-log /dev/nvme0
sudo nvme id-ctrl /dev/nvme0

Campi principali del registro NVMe:

CampoSignificato
critical_warningAvvisi critici: deve essere 0
temperatureTemperatura attuale
available_sparePercentuale di celle di riserva ancora disponibili
available_spare_thresholdSoglia sotto la quale il disco segnala un problema
percentage_usedPercentuale di vita consumata (può superare 100)
data_units_read / data_units_writtenDati letti e scritti, in unità da 512.000 byte
host_read_commands / host_write_commandsNumero di comandi
power_cyclesNumero di accensioni
power_on_hoursOre di accensione
unsafe_shutdownsSpegnimenti non regolari
media_errorsErrori di integrità dei dati: deve essere 0
num_err_log_entriesVoci nel registro errori
Warning Comp. Temperature TimeMinuti passati sopra la temperatura di avviso
Critical Comp. Temperature TimeMinuti passati sopra la temperatura critica

smartctl -a mostra gli stessi dati con i terabyte già convertiti (ad esempio Data Units Written: 12.345.678 [6,32 TB]).

Per convertire a mano data_units_written:

TB scritti = data_units_written × 512000 / 10^12

Quanta vita resta a un SSD

Il dato più affidabile è Percentage Used per gli NVMe, e l'attributo di usura del produttore (177, 231, 233, 202) per i SATA. Si può confrontare anche con la TBW (Terabytes Written) dichiarata dal produttore nella scheda tecnica:

usura stimata = TB scritti / TBW dichiarata × 100

Esempio: 40 TB scritti su un disco da 600 TBW corrispondono a circa il 6,7 per cento.

Riferimenti indicativi (variano molto per modello):

CapacitàTBW tipica di un SSD TLC consumer
250 / 256 GB75 – 150 TBW
500 / 512 GB150 – 300 TBW
1 TB300 – 600 TBW
2 TB600 – 1200 TBW

Nell'uso desktop normale (circa 10 – 30 GB scritti al giorno) la durata è di molti anni. Un SSD non si spegne al raggiungimento della TBW: il valore è una garanzia, non una scadenza. Si preoccupa però quando:

Come interpretare i risultati

SituazioneAzione
Tutto a zero, PASSEDDisco sano
HDD con 197/198 maggiori di zeroBackup subito, sostituzione consigliata
HDD con 5 maggiore di zero e stabileMonitora; se cresce, sostituisci
199 (UDMA_CRC_Error_Count) in crescitaCambia cavo e porta SATA
NVMe con media_errors > 0Backup e sostituzione
NVMe con critical_warning diverso da 0Urgente: backup immediato
percentage_used oltre 90Pianifica la sostituzione
FAILED o FAILING_NOWBackup immediato
unsafe_shutdowns altiNon è un guasto, ma indica spegnimenti bruschi

Temperatura

sudo smartctl -A /dev/sda | grep -i temp
sudo nvme smart-log /dev/nvme0 | grep -i temp
sensors

Intervalli indicativi:

TipoNormalePreoccupante
HDD30 – 45 °Coltre 50 – 55 °C
SSD SATA25 – 50 °Coltre 70 °C
NVMe30 – 60 °Coltre 70 °C (inizia il throttling, cioè il rallentamento per proteggersi)

Se un NVMe rallenta dopo pochi secondi di carico, la causa è spesso il surriscaldamento: serve un dissipatore.

3. Self-test integrati nel disco

Il disco esegue test interni sulla propria superficie o memoria.

Dischi SATA

sudo smartctl -t short /dev/sda
sudo smartctl -t long /dev/sda
sudo smartctl -t conveyance /dev/sda
sudo smartctl -c /dev/sda
sudo smartctl -l selftest /dev/sda
sudo smartctl -X /dev/sda
TestDurataContenuto
shortcirca 2 minutiControllo elettrico, meccanico e lettura di una parte
long (extended)da 1 a molte oreLettura completa della superficie o della memoria
conveyancepochi minutiDanni da trasporto (solo HDD)

smartctl -c indica quanto durano i test. -X interrompe un test in corso. Il test viene eseguito dal disco e si può continuare a usare il computer; l'esito si legge poi con -l selftest. Un test long termina con Completed without error se va tutto bene, altrimenti riporta il primo LBA danneggiato.

Dischi NVMe

sudo nvme device-self-test /dev/nvme0 -s 1
sudo nvme device-self-test /dev/nvme0 -s 2
sudo nvme self-test-log /dev/nvme0

-s 1 esegue il test breve, -s 2 quello esteso. Non tutti gli NVMe supportano i self-test: in caso contrario il comando restituisce un errore.

4. Test di velocità

Regole per misure affidabili

  1. Prova il disco giusto: i test su una cartella misurano il disco su cui si trova quella cartella.
  2. Usa file grandi (almeno 4 GB, meglio 10 GB o più) per superare le cache.
  3. Evita la cache del sistema: usa direct=1 in fio o oflag=direct in dd.
  4. Disco quasi pieno = prestazioni minori in scrittura (per gli SSD).
  5. Non usare il computer nel frattempo.
  6. Ripeti più volte e fai la media.
  7. Cifratura, compressione e RAID (LUKS, Btrfs con compressione, ZFS) cambiano i risultati: sono parte del sistema reale.
  8. Ricorda la cache SLC degli SSD: scritture brevi sembrano velocissime, quelle lunghe no.

hdparm: lettura rapida

sudo hdparm -t /dev/sda
sudo hdparm -T /dev/sda
sudo hdparm -tT /dev/sda
sudo hdparm -tT /dev/nvme0n1

Non scrive nulla, quindi è sicuro. Ripetilo 3 volte.

dd: prova semplice

dd if=/dev/zero of=./prova.bin bs=1M count=4096 oflag=direct status=progress
dd if=./prova.bin of=/dev/null bs=1M iflag=direct status=progress
rm ./prova.bin

Per svuotare la cache prima di una lettura senza direct:

sync
echo 3 | sudo tee /proc/sys/vm/drop_caches

dd è solo un test sequenziale, utile per una prova veloce. Con dati composti da soli zeri alcuni controllori (o filesystem con compressione) falsano il risultato: per misure serie usa fio.

ioping: latenza

ioping -c 10 .
ioping -c 10 /dev/sda
ioping -R /dev/sda
ioping -RL /dev/sda

Valori tipici: HDD alcuni millisecondi, SSD SATA circa 0,1 ms, NVMe sotto 0,1 ms. Su dispositivo grezzo ioping legge soltanto, quindi non distrugge dati.

fio: il benchmark completo

fio simula carichi di lavoro diversi. Prima crea una cartella di prova sul disco da testare:

mkdir -p /mnt/disco/test
cd /mnt/disco/test

Lettura sequenziale (come un file grande):

fio --name=seq-read --filename=./fio.bin --size=4G --rw=read --bs=1M \
    --ioengine=libaio --iodepth=8 --direct=1 --runtime=30 --time_based \
    --group_reporting

Scrittura sequenziale:

fio --name=seq-write --filename=./fio.bin --size=4G --rw=write --bs=1M \
    --ioengine=libaio --iodepth=8 --direct=1 --runtime=30 --time_based \
    --refill_buffers --group_reporting

Lettura casuale a 4 KB (carico tipico del sistema operativo):

fio --name=rand-read --filename=./fio.bin --size=4G --rw=randread --bs=4k \
    --ioengine=libaio --iodepth=32 --numjobs=4 --direct=1 --runtime=30 \
    --time_based --group_reporting

Scrittura casuale a 4 KB:

fio --name=rand-write --filename=./fio.bin --size=4G --rw=randwrite --bs=4k \
    --ioengine=libaio --iodepth=32 --numjobs=4 --direct=1 --runtime=30 \
    --time_based --refill_buffers --group_reporting

Carico misto 70% letture, 30% scritture:

fio --name=mix --filename=./fio.bin --size=4G --rw=randrw --rwmixread=70 --bs=4k \
    --ioengine=libaio --iodepth=32 --numjobs=4 --direct=1 --runtime=30 \
    --time_based --refill_buffers --group_reporting

Latenza con un solo accesso alla volta (la più vicina all'uso reale quotidiano):

fio --name=latenza --filename=./fio.bin --size=4G --rw=randread --bs=4k \
    --ioengine=libaio --iodepth=1 --numjobs=1 --direct=1 --runtime=30 \
    --time_based --group_reporting

Al termine elimina il file:

rm ./fio.bin

Parametri principali:

ParametroSignificato
--rwread, write, randread, randwrite, randrw
--bsDimensione del blocco (4k per accessi casuali, 1M per sequenziali)
--sizeDimensione del file di prova
--iodepthRichieste contemporanee in coda (queue depth)
--numjobsProcessi in parallelo
--direct=1Bypassa la cache del sistema
--ioenginelibaio (diffuso) o io_uring (più moderno)
--runtime / --time_basedDurata del test in secondi
--refill_buffersRiempie i buffer con dati casuali ad ogni scrittura, evitando falsi risultati con compressione
--group_reportingUnisce i risultati dei processi
--readonlyImpedisce qualunque scrittura (obbligatorio per sicurezza su dispositivi)

Come leggere il risultato:

read: IOPS=95.2k, BW=372MiB/s (390MB/s)(11.0GiB/30001msec)
     lat (usec): min=60, max=3400, avg=335.2
     clat percentiles (usec):
      |  1.00th=[  120], 50.00th=[  310], 99.00th=[  900], 99.99th=[ 2100]

Test di sola lettura su un dispositivo intero (nessuna scrittura):

sudo fio --name=lettura-disco --filename=/dev/nvme0n1 --readonly --rw=read --bs=1M \
    --ioengine=libaio --iodepth=8 --direct=1 --runtime=30 --time_based

Non eseguire mai fio con --rw=write o --rw=randwrite su /dev/... a meno che il disco non sia vuoto o destinato alla cancellazione.

Verificare la cache SLC con una scrittura lunga

Per capire come si comporta un SSD quando la cache finisce:

fio --name=sostenuta --filename=./fio.bin --size=100G --rw=write --bs=1M \
    --ioengine=libaio --iodepth=8 --direct=1 --refill_buffers \
    --write_bw_log=sostenuta --log_avg_msec=1000

Serve spazio libero superiore alla dimensione del file. Il file sostenuta_bw.1.log contiene la velocità secondo per secondo: al calo improvviso, la cache è esaurita. Un test di questo tipo scrive centinaia di gigabyte: ripetilo con parsimonia.

Strumenti grafici

Valori di riferimento

Sono ordini di grandezza, non garanzie:

DiscoLettura sequenzialeCasuale 4K (Q1)
HDD 5400 – 7200 giri80 – 200 MB/scirca 0,5 – 1 MB/s (100 – 200 IOPS)
SSD SATA450 – 560 MB/s25 – 50 MB/s
NVMe PCIe 3.0 x4fino a circa 3500 MB/s40 – 70 MB/s
NVMe PCIe 4.0 x4fino a circa 7000 MB/s60 – 100 MB/s
NVMe PCIe 5.0 x4fino a circa 14000 MB/s80 – 150 MB/s
Chiavetta USB 2.020 – 35 MB/smolto basse
USB 3.0 (5 Gbps)100 – 450 MB/sdipende dal supporto
USB 3.2 Gen 2 (10 Gbps)fino a circa 1000 MB/s
Scheda microSD10 – 100 MB/smolto basse

Se i risultati sono molto inferiori al previsto, controlla in ordine:

  1. Il collegamento (porta, cavo, linee PCIe) con i comandi della sezione 1
  2. La temperatura (throttling)
  3. Lo spazio libero e lo stato del disco (cache SLC piena, SMR)
  4. Il filesystem, la cifratura o la compressione
  5. Il risparmio energetico e lo scheduler di I/O
  6. Gli errori nel registro del kernel (sezione 6)

Monitorare l'I/O in tempo reale

iostat -xz 1
iostat -xm 2 /dev/sda
sudo iotop
sudo iotop -oPa

In iostat -x guarda r/s, w/s, rMB/s, wMB/s, await (latenza media) e %util (percentuale di utilizzo: vicino al 100% indica un disco saturo).

iotop -o mostra solo i processi che stanno facendo I/O.

Scheduler di I/O attuale:

cat /sys/block/nvme0n1/queue/scheduler
cat /sys/block/sda/queue/scheduler

La voce tra parentesi quadre è quella attiva (di solito none per gli NVMe e mq-deadline o bfq per gli altri).

5. Test di integrità

badblocks: cercare settori danneggiati

sudo badblocks -sv /dev/sdb
sudo badblocks -sv -b 4096 /dev/sdb
sudo badblocks -nsv /dev/sdb
sudo badblocks -wsv /dev/sdb
ModalitàEffetto
(nessuna)Sola lettura: sicuro, ma non rileva tutto
-nLettura e scrittura non distruttiva: lenta, il disco non deve essere montato
-wScrittura distruttiva: cancella tutto, solo per dischi vuoti

Opzioni utili: -s mostra l'avanzamento, -v è verboso, -b 4096 imposta la dimensione del blocco (consigliato per dischi grandi), -o file salva l'elenco dei blocchi difettosi.

Su un HDD il test di sola lettura per 4 TB richiede molte ore. Non usarlo sugli SSD in modalità di scrittura: consuma celle senza utilità, perché il controller gestisce da solo i blocchi difettosi. Per gli SSD sono più adatti i self-test SMART.

Controllo del filesystem

Il filesystem deve essere smontato (o si deve avviare dalla chiavetta live).

sudo umount /dev/sdb1
sudo e2fsck -f /dev/sdb1
sudo e2fsck -fn /dev/sdb1
sudo fsck -f /dev/sdb1
sudo xfs_repair -n /dev/sdb1
sudo btrfs check --readonly /dev/sdb1
sudo fsck.vfat -n /dev/sdb1
sudo ntfsfix -n /dev/sdb1

Btrfs: scrub

Verifica i checksum di tutti i dati con il filesystem montato:

sudo btrfs scrub start /mnt/dati
sudo btrfs scrub status /mnt/dati
sudo btrfs device stats /mnt/dati

device stats mostra errori di lettura, scrittura e corruzione: tutti i contatori devono essere a zero.

RAID software (mdadm) e ZFS

cat /proc/mdstat
sudo mdadm --detail /dev/md0
echo check | sudo tee /sys/block/md0/md/sync_action
sudo zpool status
sudo zpool scrub nomepool

f3: chiavette e schede con capacità falsa

Alcune chiavette o schede economiche dichiarano più spazio di quello reale. f3 lo verifica scrivendo e rileggendo dati.

Sul filesystem montato (non distruttivo, riempie lo spazio con file di prova):

f3write /media/utente/CHIAVETTA
f3read /media/utente/CHIAVETTA

Se f3read segnala settori corrupted o overwritten, la capacità è falsa. Poi elimina i file *.h2w creati.

Per verificare rapidamente un dispositivo non montato, distruttivo:

sudo f3probe --destructive --time-ops /dev/sdb

6. Leggere gli errori del kernel

Gli errori di I/O compaiono nel registro del kernel prima ancora che SMART li segnali.

sudo dmesg | grep -iE "ata[0-9]|nvme|I/O error|blk_update_request|medium error|reset"
journalctl -k -p err -b
journalctl -k -b | grep -iE "ata[0-9]|nvme|I/O error"

Segnali tipici di guai:

MessaggioSignificato probabile
blk_update_request: I/O error, dev sda, sector ...Errore di lettura o scrittura: disco o cavo
ata1: hard resetting linkProblemi di comunicazione: cavo, porta, alimentazione o disco
ata1.00: failed command: READ FPDMA QUEUEDErrori di lettura o trasmissione
nvme nvme0: I/O ... timeout, abortingNVMe che non risponde: firmware, alimentazione o guasto
EXT4-fs errorCorruzione del filesystem
Buffer I/O error on devErrori ricorrenti: backup immediato

Cambia cavo SATA e porta prima di dare la colpa al disco, soprattutto se SMART mostra errori CRC (attributo 199) e nessun settore danneggiato.

7. Monitoraggio continuo con smartd

smartd controlla periodicamente i dischi e avvisa in caso di problemi.

Attivazione

sudo systemctl enable --now smartd
systemctl status smartd

Su Debian e Ubuntu il servizio può chiamarsi smartmontools.

Configurazione: /etc/smartd.conf

DEVICESCAN -a -o on -S on -s (S/../.././02|L/../../7/03) -m root

Significato:

Per una notifica diversa da una email, usa -M exec con uno script personalizzato.

Controllo dei log di smartd:

journalctl -u smartd -b

Verificare la configurazione

sudo smartd -q onecheck

8. TRIM per gli SSD

Il TRIM comunica all'SSD quali blocchi sono liberi, mantenendo prestazioni e durata.

lsblk -D
systemctl status fstrim.timer
sudo systemctl enable --now fstrim.timer
sudo fstrim -av

Con LUKS il TRIM è disabilitato per impostazione predefinita (per motivi di sicurezza): va abilitato esplicitamente con l'opzione discard in /etc/crypttab e con la consapevolezza che rivela quali blocchi sono liberi.

Salva come salute-dischi.sh ed eseguilo come root:

#!/usr/bin/env bash
if [ "$EUID" -ne 0 ]; then
    echo "Esegui con sudo"
    exit 1
fi

for d in $(lsblk -dno NAME,TYPE | awk '$2=="disk" && $1 !~ /^(loop|zram|ram)/ {print $1}'); do
    echo "=============================="
    echo "/dev/$d"
    lsblk -dno SIZE,MODEL,ROTA,TRAN "/dev/$d"
    smartctl -H -i "/dev/$d" | grep -E "Device Model|Model Number|Serial Number|Rotation Rate|overall-health|Health Status"
    smartctl -A "/dev/$d" | grep -iE "Percentage Used|Available Spare:|Media and Data|Critical Warning|Reallocated_Sector|Current_Pending|Offline_Uncorrectable|Reported_Uncorrect|Wear_Leveling|Power_On_Hours|Temperature|Data Units Written|Total_LBAs_Written|UDMA_CRC"
done

Esecuzione:

chmod +x salute-dischi.sh
sudo ./salute-dischi.sh

10. Procedura consigliata per un disco sospetto

  1. Backup dei dati importanti
  2. Identifica il disco: lsblk -d -o NAME,SIZE,ROTA,TRAN,MODEL
  3. Stato generale: sudo smartctl -a /dev/sdX (o nvme smart-log)
  4. Errori del kernel: journalctl -k -p err -b
  5. Avvia un test lungo: sudo smartctl -t long /dev/sdX, poi leggi -l selftest
  6. Se i risultati sono dubbi, cambia cavo e porta e ripeti
  7. Controlla il filesystem con fsck in sola lettura
  8. Misura la velocità con fio e confronta con i valori attesi
  9. Se i contatori peggiorano nel tempo, sostituisci il disco

Problemi comuni

ProblemaCausa e rimedio
smartctl non vede il disco USBProva -d sat; alcuni adattatori non supportano SMART
SMART support is: UnavailableDisco virtuale, RAID hardware (-d megaraid,N) o adattatore non compatibile
Permission deniedServono i privilegi di root: usa sudo
Il test fio fallisce con direct=1Il filesystem non supporta O_DIRECT (tmpfs, alcune configurazioni ZFS): togli --direct=1 e usa file molto più grandi della RAM
Velocità di scrittura molto basse dopo qualche secondoCache SLC esaurita, throttling termico o disco SMR
Velocità di lettura dimezzata su NVMeCollegamento PCIe a meno linee o generazione inferiore: controlla lspci -vv
Disco USB lentoPorta USB 2.0 o cavo non adatto: controlla lsusb -t
Percentage Used già alto in un disco nuovoDisco usato o ricondizionato venduto come nuovo
Power_On_Hours non realisticoAlcuni dischi lo contano in minuti o in mezzore: verifica con smartctl -x

Riepilogo dei comandi

lsblk -d -o NAME,SIZE,TYPE,ROTA,TRAN,MODEL,SERIAL
sudo smartctl -a /dev/sda
sudo smartctl -a /dev/nvme0
sudo nvme smart-log /dev/nvme0
sudo smartctl -t short /dev/sda
sudo smartctl -t long /dev/sda
sudo smartctl -l selftest /dev/sda
sudo hdparm -tT /dev/sda
ioping -c 10 .
fio --name=prova --filename=./fio.bin --size=4G --rw=randread --bs=4k --iodepth=32 --direct=1 --runtime=30 --time_based
sudo badblocks -sv /dev/sdb
sudo e2fsck -fn /dev/sdb1
sudo btrfs scrub start /mnt/dati
sudo fstrim -av
journalctl -k -p err -b

Vedi anche: df-du (spazio occupato), journalctl (log del kernel), systemctl (gestire smartd e fstrim.timer), grub (se un disco guasto impedisce l'avvio).

Tag

comandidischihddlinuxssd

Suggerisci una correzione