Salta al contenuto principale

smartctl: controllare la salute dei dischi con SMART

Inviato da tuxsa il

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] dispositivo

Una 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: Enabled

Con -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 $?
8

Con -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:      0

Gli 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/sda

Con -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 $?
2

Uno 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 brief per 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 (sat per un disco in un contenitore USB, nvme, megaraid,N, 3ware,N per i dischi dietro un controller RAID...); -d test: mostra solo il tipo riconosciuto.
  • -j: output in JSON (con jq, per esempio smartctl -j -H /dev/sda | jq .smart_status.passed: l'esempio è illustrativo). La struttura l'ho vista: l'oggetto smartctl contiene exit_status e l'elenco messages con 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'utente root. Per avere anche i test periodici si aggiunge un'opzione -s con la pianificazione (vedi man 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

  • PASSED non vuol dire sano: leggi gli attributi (-A) e il registro dei test. Un disco con Reallocated_Sector_Ct, Current_Pending_Sector o Offline_Uncorrectable diversi 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 rsync e tar).
  • Serve sudo: senza privilegi smartctl non 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 smartctl dà 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/sda legge il primo disco fisico dietro un controller MegaRAID (l'esempio è illustrativo). Senza -d si 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 long su 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 con update-smart-drivedb, che ha bisogno della rete.
  • Un errore di cavo non è un disco rotto: UDMA_CRC_Error_Count alto, o errori ata nei messaggi di dmesg, 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 -i o -a senza toglierlo (opzione -q noserial di smartctl).

Riepilogo

ComandoCosa fa
sudo smartctl --scanElenca i dischi interrogabili
sudo smartctl -i /dev/sdaModello, serie, capacità, SMART attivo?
sudo smartctl -H /dev/sdaGiudizio sintetico (PASSED / FAILED!)
sudo smartctl -A /dev/sdaAttributi SMART (i contatori)
sudo smartctl -a /dev/sdaTutto il consueto in una volta
sudo smartctl -a /dev/nvme0Salute e usura di un disco NVMe
sudo smartctl -t short /dev/sdaAvvia un test breve (minuti)
sudo smartctl -t long /dev/sdaAvvia un test completo (ore)
sudo smartctl -l selftest /dev/sdaEsito dei test
sudo smartctl -l error /dev/sdaErrori registrati dal disco
sudo smartctl -s on /dev/sdaAttiva SMART
sudo smartctl -d sat -a /dev/sdbDisco in un contenitore USB
sudo smartctl -j -H /dev/sdaOutput in JSON, per gli script