I dischi si rompono, e quasi sempre senza avvisare. Quasi: molti dischi tengono il conto, dentro di sé, dei propri problemi (settori danneggiati, errori di lettura, ore di funzionamento, temperatura, usura) e sono in grado di raccontarli. Il comando che lo chiede al disco è smartctl. Non sostituisce i backup, ma permette di accorgersi di un disco in difficoltà prima che sia troppo tardi.
Cos'è
SMART (Self-Monitoring, Analysis and Reporting Technology) è un sistema di auto-diagnosi incorporato nei dischi rigidi, nei dischi SSD e nei moduli NVMe. smartctl fa parte del pacchetto smartmontools (su Debian e Ubuntu: sudo apt install smartmontools, vedi l'articolo su apt), che comprende anche smartd, un servizio che controlla i dischi di continuo e manda avvisi. smartctl è lo strumento a riga di comando per interrogare un disco a mano.
Cosa fa
Mostra l'identità del disco (modello, numero di serie, capacità), il suo giudizio di salute, gli attributi SMART (i contatori interni) e i registri degli errori. Può anche far eseguire al disco dei test su sé stesso (brevi, di pochi minuti, o lunghi, di ore) e leggerne l'esito. Un test non cancella né modifica i dati.
Come si usa
$ sudo smartctl [opzioni] dispositivoUna precisazione importante sulle prove. La macchina virtuale che uso per verificare i comandi ha solo dischi virtuali (virtio), che non hanno SMART: smartctl non può leggere nulla di reale. Quindi tutti gli output con dati SMART sono illustrativi, scritti secondo il formato del programma (versione 7.4) con valori inventati: sul tuo disco saranno diversi, e anche il formato può variare un po' da un modello e da una versione all'altra. Ho verificato davvero la ricerca dei dischi, i messaggi d'errore, i codici di uscita, il formato JSON, il database dei modelli noti e le opzioni dell'aiuto. Gli esempi usano web01, il server degli articoli precedenti, con dischi immaginari.
Esempio 1: trovare i dischi
$ sudo smartctl --scan
/dev/sda -d scsi # /dev/sda, SCSI device
/dev/sdb -d scsi # /dev/sdb, SCSI device
/dev/nvme0 -d nvme # /dev/nvme0, NVMe device
$ sudo smartctl -i /dev/vda
/dev/vda: Unable to detect device type
Please specify device type with the -d option.--scan elenca i dischi che smartctl può interrogare, con il tipo da usare con -d. Le prime tre righe sono un esempio illustrativo (due dischi SATA, che il sistema vede come scsi, e un NVMe). Nella macchina di prova l'elenco è vuoto: è la situazione di una macchina virtuale, e smartctl -i /dev/vda risponde Unable to detect device type (vero). Per riconoscere a colpo d'occhio dischi e modelli si usa lsblk -d -o NAME,SIZE,ROTA,TRAN,MODEL (vedi l'articolo relativo), con le colonne ROTA (1 = disco rotante, 0 = SSD) e TRAN (il tipo di collegamento).
Esempio 2: l'identità del disco
$ sudo smartctl -i /dev/sda
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.8.0-31-generic] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Device Model: Example DX4000
Serial Number: EXD1234567
Firmware Version: DX01
User Capacity: 4,000,787,030,016 bytes [4.00 TB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Rotation Rate: 7200 rpm
Form Factor: 3.5 inches
ATA Version is: ACS-4 (minor revision not indicated)
SATA Version is: SATA 3.3, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Sun Nov 8 21:02:11 2026 CET
SMART support is: Available - device has SMART capability.
SMART support is: EnabledCon -i (info) si vede la scheda del disco. Le righe da guardare: il modello e il numero di serie (per riconoscere il disco fisico e per la garanzia), la Rotation Rate (7200 rpm per un disco rotante; per un SSD compare Solid State Device), la velocità del collegamento (6.0 Gb/s è SATA 3: un valore più basso indica un cavo o una porta inadeguati) e soprattutto SMART support is: deve essere Available ed Enabled. Se è Disabled si attiva con sudo smartctl -s on /dev/sda. Per i dischi più comuni compare anche una riga Model Family, presa dal database dei modelli noti (smartctl -P showall lo mostra: nella macchina di prova ho contato 545 famiglie).
Esempio 3: il giudizio di salute
$ sudo smartctl -H /dev/sda
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
$ sudo smartctl -H /dev/sdb
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: FAILED!
Drive failure expected in less than 24 hours. SAVE ALL DATA.
$ echo $?
8Con -H (health) il disco dà un giudizio sintetico: PASSED o FAILED!. Se è FAILED! la regola è semplice: salva subito tutti i dati (vedi rsync per la copia) e sostituisci il disco. Attenzione però al contrario: PASSED non vuol dire che il disco sia sano. Il giudizio scatta solo quando un contatore supera una soglia fissata dal costruttore, spesso troppo tardi: molti dischi si rompono dopo un PASSED. Per questo bisogna leggere anche gli attributi (esempio 4). Il numero stampato da echo $? è il codice di uscita (qui 8: vedi l'esempio 7).
Esempio 4: gli attributi
$ sudo smartctl -A -f brief /dev/sda
=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAGS VALUE WORST THRESH FAIL RAW_VALUE
1 Raw_Read_Error_Rate PO-R-- 100 100 016 - 0
5 Reallocated_Sector_Ct PO--CK 100 100 005 - 0
9 Power_On_Hours -O--C- 091 091 000 - 8310
12 Power_Cycle_Count -O--CK 100 100 000 - 41
187 Reported_Uncorrect -O--CK 100 100 000 - 0
194 Temperature_Celsius -O---K 034 046 000 - 34 (Min/Max 22/46)
197 Current_Pending_Sector -O--C- 100 100 000 - 0
198 Offline_Uncorrectable ----C- 100 100 000 - 0
199 UDMA_CRC_Error_Count -O--C- 200 200 000 - 0È la parte che conta davvero. Ogni riga è un contatore interno. VALUE è il valore "normalizzato" (parte di solito da 100 o da 200 e scende col peggiorare), WORST il peggiore mai raggiunto e THRESH la soglia sotto cui il disco si considera guasto; RAW_VALUE è il dato grezzo (un conteggio reale). I nomi che interessano di più: Reallocated_Sector_Ct (settori danneggiati sostituiti da riserve), Current_Pending_Sector (settori in attesa di essere verificati) e Offline_Uncorrectable (settori illeggibili), Reported_Uncorrect (errori non correggibili) e UDMA_CRC_Error_Count (errori di trasmissione sul cavo, spesso da sostituire il cavo e non il disco). Per questi, un valore grezzo diverso da zero è un campanello d'allarme, anche se VALUE è ancora lontano dalla soglia: se continua a crescere, si cambia il disco. Power_On_Hours sono le ore di accensione (8310 sono circa undici mesi) e Temperature_Celsius la temperatura. Il formato -f brief è più compatto del normale (le colonne di FLAGS sono lettere: la P indica un attributo "pre-guasto", cioè che se scende sotto la soglia annuncia un guasto vicino). I nomi e i numeri degli attributi dipendono dal costruttore: sugli SSD compaiono per esempio contatori di usura (Wear_Leveling_Count, Media_Wearout_Indicator), con significati diversi da marca a marca.
Esempio 5: i dischi NVMe
$ sudo smartctl -a /dev/nvme0 | sed -n 6,30p
=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
SMART/Health Information (NVMe Log 0x02)
Critical Warning: 0x00
Temperature: 38 Celsius
Available Spare: 100%
Available Spare Threshold: 10%
Percentage Used: 4%
Data Units Read: 18,224,771 [9.33 TB]
Data Units Written: 11,903,262 [6.09 TB]
Power On Hours: 5,102
Unsafe Shutdowns: 23
Media and Data Integrity Errors: 0
Error Information Log Entries: 0Gli NVMe (/dev/nvme0, non /dev/nvme0n1, che è lo spazio di nomi e non il dispositivo) non hanno la tabella degli attributi, ma un blocco di informazioni più semplice. Le righe chiave: Critical Warning (deve essere 0x00), Percentage Used (l'usura: 4% vuol dire che il 96% della vita dichiarata è ancora disponibile; sopra il 100% il disco ha superato la durata prevista), Available Spare (la riserva di celle) e Media and Data Integrity Errors (da tenere a zero). Data Units Written è la quantità scritta in totale. Un'osservazione utile per un server: se Percentage Used sale in fretta, i dati scritti sono troppi per quel disco (database, log molto attivi: vedi journalctl e iotop se installato). L'output dell'esempio è illustrativo.
Esempio 6: i test automatici del disco
$ sudo smartctl -t short /dev/sda
=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately ...".
Drive command "Execute SMART Short self-test routine immediately ..." successful.
Testing has begun.
Please wait 2 minutes for test to complete.
Test will complete after Sun Nov 8 21:07:01 2026
Use smartctl -X to abort test.
$ sudo smartctl -l selftest /dev/sda | cut -c1-76
=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours)
# 1 Short offline Completed without error 00% 8310
# 2 Extended offline Completed without error 00% 8142
$ sudo smartctl -t long /dev/sda
$ sudo smartctl -X /dev/sdaCon -t (test) si chiede al disco di eseguire un test: short impiega pochi minuti, long controlla tutta la superficie e può durare molte ore (la durata prevista è scritta nella risposta, e dipende dalla capacità: per un disco da 4 TB sono alcune ore). Il comando ritorna subito: il test lavora in background nel disco, e il risultato si legge dopo con -l selftest (log). Con -X si interrompe un test in corso. Un test lungo è il modo giusto per cercare settori illeggibili: se trova un errore, nel registro compare Completed: read failure con l'indirizzo del primo settore difettoso (LBA_of_first_error, l'ultima colonna, che nell'esempio ho tagliato con cut per non rendere la riga troppo lunga). Durante il test il disco resta utilizzabile, ma può rallentare. Il blocco è illustrativo (compresi i messaggi di -t short, che ho scritto dalla conoscenza del programma; ho abbreviato le due righe più lunghe con i puntini). Ci sono anche gli errori registrati dal disco: sudo smartctl -l error /dev/sda stampa No Errors Logged se è tutto a posto.
Esempio 7: codici di uscita e script
$ sudo smartctl -H /dev/nonesiste
/dev/nonesiste: Unable to detect device type
Please specify device type with the -d option.
$ echo $?
1
$ sudo smartctl -d ata -H /dev/vda
Smartctl open device: /dev/vda failed: Operation not permitted
$ echo $?
2Uno script che controlla tutti i dischi, usando i codici di uscita:
#!/bin/bash
# Controlla lo stato SMART di tutti i dischi e segnala i problemi
PROBLEMI=0
for DISCO in $(smartctl --scan | awk '{print $1}'); do
smartctl -H "$DISCO" > /dev/null 2>&1
STATO=$?
if [ $((STATO & 3)) -ne 0 ]; then
echo "$DISCO: impossibile leggere lo stato SMART (codice $STATO)" >&2
PROBLEMI=$((PROBLEMI + 1))
elif [ $((STATO & 24)) -ne 0 ]; then
echo "$DISCO: SMART segnala un guasto (codice $STATO)" >&2
PROBLEMI=$((PROBLEMI + 1))
fi
done
[ "$PROBLEMI" -eq 0 ] && echo "Tutti i dischi sono a posto"
exit "$PROBLEMI"Il codice di uscita di smartctl non è un semplice "0 va bene, 1 errore": è una maschera di bit, e ogni bit ha un significato (dal manuale del programma). Bit 0 (valore 1): comando non valido; bit 1 (valore 2): impossibile aprire il disco; bit 2 (4): un comando SMART è fallito; bit 3 (8): il disco risulta "in guasto"; bit 4 (16): attributi pre-guasto sotto la soglia; bit 5 (32): attributi sotto la soglia in passato; bit 6 (64): il registro degli errori non è vuoto; bit 7 (128): il registro dei test ha errori. I due primi esempi sono veri e mostrano i codici 1 e 2. Nello script, $((STATO & 3)) isola i bit 0 e 1 (disco non leggibile) e $((STATO & 24)) i bit 3 e 4 (guasto), perché un confronto con -eq 0 sul codice intero sbaglierebbe: un disco con un errore vecchio nel registro dà 64, e non per questo è guasto. Lo script va eseguito come amministratore. L'ho provato nel sandbox con un finto smartctl che restituisce i codici scelti: con 0 per tutti i dischi risponde "Tutti i dischi sono a posto"; con 8 segnala il guasto, con 2 segnala il disco non leggibile, e con 64 non segnala nulla. Si presta a cron (vedi l'articolo su crontab), ma per il controllo continuo c'è smartd (vedi "Opzioni utili").
Opzioni utili
--scan: elenca i dischi;-i: identità;-H: giudizio;-A: attributi (-f briefper una tabella più stretta);-a: tutto il consueto;-x: ancora di più.-l error: errori registrati;-l selftest: esiti dei test;-c: capacità del disco (compresa la durata dei test).-t short,-t long: avvia un test;-X: lo interrompe. Il test non cancella dati.-s on: attiva SMART sul disco;-d tipo: indica il tipo di dispositivo (satper un disco in un contenitore USB,nvme,megaraid,N,3ware,Nper i dischi dietro un controller RAID...);-d test: mostra solo il tipo riconosciuto.-j: output in JSON (conjq, per esempiosmartctl -j -H /dev/sda | jq .smart_status.passed: l'esempio è illustrativo). La struttura l'ho vista: l'oggettosmartctlcontieneexit_statuse l'elencomessagescon gli errori.-P showall: tutto il database dei modelli noti (nella macchina di prova, 5281 righe e 545 famiglie).smartd: il servizio che controlla i dischi di continuo e manda un messaggio all'amministratore; si configura in/etc/smartd.conf. La riga predefinita nel pacchetto di Debian e Ubuntu che ho trovato nel sandbox èDEVICESCAN -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner: controlla tutti i dischi trovati, non risveglia quelli in standby e avvisa l'utenteroot. Per avere anche i test periodici si aggiunge un'opzione-scon la pianificazione (vediman smartd.conf; non l'ho provata qui).lsblk,df,mount,dmesg: il disco visto dal sistema, lo spazio, i montaggi e gli errori di lettura del kernel.
Attenzione a
PASSEDnon vuol dire sano: leggi gli attributi (-A) e il registro dei test. Un disco conReallocated_Sector_Ct,Current_Pending_SectoroOffline_Uncorrectablediversi da zero, in crescita, va tenuto d'occhio o sostituito.- I backup sono un'altra cosa: SMART avvisa solo di una parte dei guasti. Molti dischi si rompono all'improvviso, senza segnali. Se il disco è importante, la copia dei dati deve già esserci (vedi
rsyncetar). - Serve
sudo: senza privilegismartctlnon riesce ad aprire il disco (Permission denied, l'ho visto con un utente senza privilegi). - Nelle macchine virtuali e nei container non c'è SMART: i dischi sono virtuali e
smartctldàUnable to detect device type(verificato). Il controllo va fatto sulla macchina fisica che li ospita, o sul disco vero collegato. - Dietro un controller RAID i dischi vanno indicati con
-d:smartctl -a -d megaraid,0 /dev/sdalegge il primo disco fisico dietro un controller MegaRAID (l'esempio è illustrativo). Senza-dsi legge il disco virtuale, che non ha SMART. Anche i dischi nei contenitori USB richiedono spesso-d sat. - I test lunghi occupano il disco: un
-t longsu un disco molto usato può rallentare i programmi che lo usano. Si programma di notte. Evita l'opzione-C(captive): il test in modalità "captive" può bloccare il disco e non va usato su un disco montato. - I nomi e i significati degli attributi variano: lo stesso numero può significare cose diverse in marche diverse, e i valori grezzi sono spesso codificati in modo particolare dal costruttore. Il database dei modelli (
-P showall) risolve molti casi; per un modello nuovo si aggiorna conupdate-smart-drivedb, che ha bisogno della rete. - Un errore di cavo non è un disco rotto:
UDMA_CRC_Error_Countalto, o erroriatanei messaggi didmesg, indicano spesso un cavo o un connettore da cambiare. Si sostituisce il cavo e si controlla se il contatore smette di crescere (il valore non torna mai a zero). - Il numero di serie è un dato riservato: non pubblicare l'output di
-io-asenza toglierlo (opzione-q noserialdismartctl).
Riepilogo
| Comando | Cosa fa |
|---|---|
sudo smartctl --scan | Elenca i dischi interrogabili |
sudo smartctl -i /dev/sda | Modello, serie, capacità, SMART attivo? |
sudo smartctl -H /dev/sda | Giudizio sintetico (PASSED / FAILED!) |
sudo smartctl -A /dev/sda | Attributi SMART (i contatori) |
sudo smartctl -a /dev/sda | Tutto il consueto in una volta |
sudo smartctl -a /dev/nvme0 | Salute e usura di un disco NVMe |
sudo smartctl -t short /dev/sda | Avvia un test breve (minuti) |
sudo smartctl -t long /dev/sda | Avvia un test completo (ore) |
sudo smartctl -l selftest /dev/sda | Esito dei test |
sudo smartctl -l error /dev/sda | Errori registrati dal disco |
sudo smartctl -s on /dev/sda | Attiva SMART |
sudo smartctl -d sat -a /dev/sdb | Disco in un contenitore USB |
sudo smartctl -j -H /dev/sda | Output in JSON, per gli script |