Come posso rendere il mio disco non mappato in attesa di settori illeggibili


10

Ho un disco con alcuni settori illeggibili in sospeso, secondo smartd. Quale sarebbe il modo più semplice per rimappare il disco e impedire che smartd si lamenti?

Oggi ne ricevo due ogni ora:

10 set 23:15:35 hylton smartd [3353]: dispositivo: / dev / sdc, 1 settori attualmente illeggibili (in sospeso)

Il sistema è un sistema x86 che esegue Ubuntu Linux 9.10 (jaunty). Il disco fa parte di un gruppo LVM. Ecco come smartctl identifica il disco:

Famiglia di modelli: famiglia ATA seriale di seconda generazione Western Caviar
Modello del dispositivo: WDC WD5000AAKS-00TMA0
Numero di serie: WD-WCAPW4207483
Versione del firmware: 12.01C01
Capacità dell'utente: 500.107.862.016 byte

2
Questo problema si è risolto da solo; il disco ha iniziato a lamentarsi più forte, quindi l'ho sostituito.
dkagedal,

Risposte:


15

Un settore illeggibile in sospeso è quello che ha restituito un errore di lettura e che l'unità ha contrassegnato per il remapping alla prima occasione possibile. Tuttavia, non è possibile eseguire il remapping fino a quando non si verifica una delle due cose seguenti:

  1. Il settore viene riletto con successo
  2. Il settore viene riscritto

Fino ad allora, il settore rimane in sospeso. Quindi hai due modi corrispondenti per affrontare questo:

  1. Continua a provare a rileggere il settore fino a quando non ci riesci
  2. Sovrascrivi quel settore con nuovi dati

Ovviamente, (1) non è distruttivo, quindi dovresti probabilmente provarlo prima, anche se tieni presente che se l'unità inizia a guastarsi in modo serio, è probabile che la lettura continua da un'area danneggiata lo faccia fallire molto più rapidamente . Se hai molti settori in sospeso e altri errori e ti preoccupi dei dati sul disco, ti consiglio di metterli fuori servizio e utilizzare l'eccellente strumento ddrescue per recuperare quanti più dati possibili. Quindi scartare l'unità.

Se il settore in questione contiene dati che non ti interessano o che è possibile ripristinare da un backup, la sovrascrittura è probabilmente la soluzione più rapida e semplice. È quindi possibile visualizzare i conteggi riallocati e in sospeso per l'unità per assicurarsi che il settore sia stato curato.

Come scopri a cosa corrisponde il settore nel filesystem? Ho trovato un eccellente articolo sul sito web smartmontools , qui , anche se è abbastanza tecnico ed è specifico per i file system ext2 / 3/4 e reiser.

Un approccio più semplice, che ho usato su una delle mie unità (Mac), è di usare find / -xdev -type f -print0 | xargs -0 ...per leggere tutti i file sul sistema. Prendi nota del conteggio in sospeso prima di eseguire questo. Se il settore si trova all'interno di un file, verrà visualizzato un messaggio di errore dallo strumento utilizzato per leggere i file (ad es. Md5sum) che mostra il percorso verso di esso. Puoi quindi focalizzare le tue attenzioni sulla rilettura di questo file fino a quando non viene letto correttamente. Spesso questo risolverà il problema, se si tratta di un file usato di rado che doveva essere riletto alcune volte. Se l'errore scompare o non si verificano errori nella lettura di tutti i file, controllare il conteggio in sospeso per vedere se è diminuito. In tal caso, il problema è stato risolto leggendo.

Se il file non può essere letto correttamente dopo più tentativi (ad es. 20), è necessario sovrascrivere il file o il blocco all'interno del file per consentire all'unità di riallocare il settore. È possibile utilizzare ddrescue sul file (anziché sulla partizione) per sovrascrivere solo un settore, copiandolo in un file temporaneo e quindi copiandolo di nuovo. Si noti che rimuovere il file a questo punto è una cattiva idea, perché il settore danneggiato andrà nell'elenco gratuito dove sarà più difficile da trovare. Anche la sovrascrittura completa è negativa, perché i settori torneranno nell'elenco gratuito. Devi riscrivere i blocchi esistenti. L' notruncopzione di ddè un modo per farlo.

Se non si riscontrano errori e il conteggio in sospeso non è diminuito, il settore deve essere nella lista dei freelist o in parte dell'infrastruttura del filesystem (ad es. Una tabella di inode). Puoi provare a riempire tutto lo spazio libero con cat /dev/zero >tempfile, quindi controllare il conteggio in sospeso. Se il problema persiste, il problema era nell'elenco gratuito e ora è scomparso.

Se il settore si trova nell'infrastruttura, hai un problema più serio e probabilmente incontrerai degli errori semplicemente camminando sull'albero delle directory. In questa situazione, penso che l'unica soluzione sensata sia quella di riformattare l'unità, usando facoltativamente ddrescue per recuperare i dati se necessario.

Tieni d'occhio il disco. La riallocazione settoriale è un ottimo canarino nella miniera di carbone , potenzialmente in grado di avvisare tempestivamente di un guasto. Agendo tempestivamente puoi prevenire una frana successiva catastrofica e molto dolorosa. Non sto suggerendo che alcune riallocazioni settoriali siano un'indicazione che è necessario eliminare l'unità. Tutte le unità moderne devono essere riallocate. Tuttavia, se l'unità non è molto vecchia (<1 anno) o si ottengono nuove riallocazioni frequenti (> 1 / mese), si consiglia di sostituirla al più presto.

Non ho prove empiriche per dimostrarlo, ma la mia esperienza suggerisce che i problemi del disco possono essere ridotti leggendo l'intero disco una volta ogni tanto, o da uno dddei dischi non elaborati o leggendo tutti i file che utilizzano find. Quasi tutti i problemi del disco che ho riscontrato negli ultimi anni sono emersi per primi in file usati raramente o su macchine che non sono molto utilizzate. Ciò ha senso anche in modo euristico, in quanto se un settore viene riletto frequentemente, l'unità ha la possibilità di riallocare quando rileva per la prima volta un problema minore con quel settore piuttosto che aspettare fino a quando il settore è completamente illeggibile. L'unità non è in grado di fare nulla con un settore a meno che l'host non vi acceda in qualche modo, leggendolo o scrivendolo o eseguendo uno dei test SMART.

Mi piacerebbe sperimentare l'idea di un cron job notturno o settimanale che legge l'intero disco. Attualmente sto usando un "RAID povero" in cui ho un secondo disco rigido nella macchina e ogni notte eseguo il backup del disco principale. In un certo senso, questo è in realtà meglio del mirroring RAID, perché se eseguo il goof ed elimino un file per errore, posso ottenere immediatamente la versione di ieri dal disco di backup. D'altra parte, credo che un controller RAID hardware faccia un ottimo lavoro in background per monitorare, segnalare e risolvere i problemi del disco non appena emergono. Il mio attuale script di backup usa rsyncper evitare la copia di dati che non sono cambiati, ma in considerazione della necessità di rileggere tutti i settori, forse sarebbe meglio copiare tutto o avere uno script separato che legge l'intero disco grezzo ogni settimana.


2
Se si eseguono backup (la risincronizzazione su un disco interno non conta;)), tutti i dati vengono (ri) letti in determinati intervalli di tempo (a seconda della pianificazione del backup completo / incrementale). RAID o rsync non sono sostituti del backup. E tra l'altro, credo che tu abbia troppa fiducia nei fornitori Hardware-RAID. ;)
maxschlepzig,

@maxschlepzig: hai ragione. Ho anche un regime di backup separato. Tuttavia, la mia esperienza è stata che la probabilità di perdita di dati a causa di un guasto dell'unità supera di gran lunga tutti gli altri rischi messi insieme (furto, incendio, ecc.). I moderni dischi rigidi hanno una scarsa affidabilità che al giorno d'oggi sono completamente paranoico. Quindi la mia seconda unità interna è una parte importante della mia strategia.
Neil Mayhew,

Ho letto e riletto il contenuto del disco utilizzato dd if=/dev/sda ...e i settori sono ancora in sospeso, hai idea del perché?
dmansfield,

@dmansfield, se non hai riscontrato errori, non sono sicuro del perché. Ho notato che solo il valore grezzo è accurato nell'output intelligente, quindi se si osservasse solo il valore "cotto", è possibile che non ci siano settori in sospeso.
Neil Mayhew,


1
  1. Esegui il backup dei tuoi dati
  2. Rimuovere questo dispositivo dal gruppo LVM
  3. dd if=/dev/zero of=/dev/sdc bs=4k- questo cancellerà tutti i dati su/dev/sdc
  4. Includilo di nuovo nel gruppo LVM
  5. Ripristina il tuo backup

3
0. Avere un backup. :-)
Steven D

Ma questo è un errore di lettura in sospeso, quindi non dovrebbe essere sufficiente leggere tutti i settori?
dkagedal,

1
@dkagedal: No, il firmware dell'HD ha già rilevato che non è in grado di leggere questo settore. Non ha modo di recuperarlo (da solo, oltre forse a riprovare e riprovare e avere fortuna ad un certo punto ... speriamo che non vengano restituiti i dati danneggiati) e quindi imposta questo errore SMART. Ma se il firmware rileva una scrittura su quel settore specifico, mappa questo settore via (e non lo utilizza più) e invece mappa un settore di riserva (funzionante) a questo indirizzo.
maxschlepzig,

@dkagedal: a volte solo una o due letture aggiuntive riporteranno il settore. Altre volte, nulla lo riporterà. Inoltre, l'unità decide internamente se rimappare il settore o riutilizzarlo, in base alla gravità dell'errore originale e se può rileggerlo correttamente dopo averlo scritto. L'unico modo per dirlo è guardare il conteggio riallocato per l'unità. Credo che le unità utilizzino un checksum abbastanza esteso per garantire che quando i dati vengono letti non siano danneggiati, quindi puoi essere ragionevolmente sicuro di un settore che non è stato riassegnato.
Neil Mayhew,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.