Come posso facilmente riparare un singolo blocco illeggibile su un disco Linux?


22

Il mio sistema Linux ha iniziato a generare errori SMART nel syslog. L'ho rintracciato e credo che il problema sia un singolo blocco sul disco. Come posso fare in modo che il disco possa riallocare facilmente quel blocco? Mi piacerebbe sapere quale file è stato distrutto nel processo. (Sono consapevole che se un blocco si guasta su un disco è probabile che ne seguano altri; ho un buon backup in corso e voglio solo provare a far funzionare questo disco.)

La ricerca sul Web porta al Bad block HOWTO , che descrive un processo manuale su un disco non montato. Sembra complicato e soggetto a errori. Esiste uno strumento per automatizzare questo processo in Linux? La mia unica altra opzione è lo strumento diagnostico del produttore , ma presumo che bloccherà il blocco difettoso senza riferire su ciò che è stato distrutto. Nel peggiore dei casi, potrebbero essere metadati del filesystem.

Il disco in questione è la partizione di sistema primaria. Utilizzo di ext3fs e LVM. Ecco il registro degli errori di syslog e il bit rilevante di smartctl.

smartd[5226]: Device: /dev/hda, 1 Currently unreadable (pending) sectors

Error 1 occurred at disk power-on lifetime: 17449 hours (727 days + 1 hours)
... Error: UNC at LBA = 0x00d39eee = 13868782

C'è un dump smartctl completo su pastebin .


Ho pensato che il firmware del disco mappasse automaticamente il blocco danneggiato in lettura, quindi teoricamente è già stato fatto. Come indicato di seguito, esegui fsck (o l'equiv corretto per il tuo FS) per assicurarti che l'overlay FS sia ancora stabile.
BuildTheRobots,

2
La mia comprensione è che il firmware del disco rimappa solo il blocco in scrittura , non in lettura. Quindi ho davvero bisogno di forzare una scrittura sul blocco in questione.
Nelson,

1
Alla fine ho ritirato questo disco. Ha funzionato bene per diversi mesi, ma dopo il 5 ° errore di lettura ho rinunciato.
Nelson,

Risposte:


12

Potresti provare hdparm --write-sector <LBA> /dev/ice.

Non conosco altri modi per farlo - devi convertire manualmente l'LBA in blocchi di filesystem (come hai già trovato)


Ooh, questa è una nuova bandiera! Ciò si occuperà sicuramente di riallocare il blocco danneggiato. Ora tutto ciò di cui ho bisogno è un modo semplice per trovare ciò che bloccherà.
Nelson,

3
Avendo usato questo metodo per riparare un disco, posso dire che questo è il metodo corretto. Forzare una scrittura nel settore in questione costringerà il disco a confrontarsi con il settore e (a) ottenere una scrittura corretta, oppure (b) finire con un brutto secondo permanente insieme a una rimappatura.
Avery Payne,


È strano che questo processo iterativo (di ricerca del prossimo settore danneggiato tramite SMART e costringendolo a riassegnare) non sia automatizzato con una semplice utility! ..
imz - Ivan Zakharyaschev

32

Scrivevo il firmware del disco per WD e una volta scrissi il firmware che riassegnava i blocchi danneggiati.

Innanzitutto, la maggior parte dei blocchi danneggiati viene rilevata nelle letture, non nelle scritture. Le scritture vengono eseguite alla cieca, il che significa che i dati vengono scritti senza essere controllati. Quindi su una scrittura se il supporto è male, non lo saprai fino a quando l'host non farà una lettura in quel settore. C'è una piccola parte del settore (l'intestazione del settore) che viene letta nelle scritture per individuare il settore corretto, in modo che se si verifica un errore nella lettura dell'intestazione del settore, l'unità riassegnerà il settore e lo scriverà con i dati ricevuti dal comando di scrittura. Ma la stragrande maggioranza dei blocchi danneggiati viene rilevata nelle letture e solo perché una scrittura ha successo in un settore non significa che i media siano buoni o che il settore sia stato riassegnato.

Ora sulla riassegnazione dei blocchi danneggiati (chiamata anche riallocazione). Sì, normalmente l'unità tenterà di riassegnare un settore se l'errore è abbastanza grave (ovvero, l'errore ECC è abbastanza grave) ma l'unità potrebbe ancora recuperare i dati dopo la correzione ECC. Di solito questo viene fatto automaticamente. L'unica eccezione è che l'host avrebbe potuto in precedenza dire all'unità di non effettuare riallocazioni automatiche, ma ciò avviene raramente.

Quindi cosa succede se l'unità esegue una lettura e non riesce a recuperare i dati? Niente. L'errore viene segnalato all'host, ma non viene effettuata alcuna riassegnazione. Il problema è che l'unità potrebbe riassegnare il settore, ma non ha la minima idea di quali dati scrivere nel settore appena riassegnato. Se avesse appena scritto un mucchio di zeri, diciamo, e poi il settore fosse stato letto di nuovo, avrebbe restituito tutti gli zeri senza alcuna indicazione che i dati non fossero validi. Questa è essenzialmente la stessa cosa della corruzione dei dati. L'unità non può contare sull'host che tiene traccia degli errori per una serie di motivi (ad esempio, cosa succede se l'unità è stata spostata su un nuovo host?), Quindi il miglior modo di agire è di non fare nulla quando i dati possono " essere recuperato.

Le unità moderne, tuttavia, salveranno la posizione del settore danneggiato quando non può essere riallocata. Il numero di settori danneggiati in attesa di riallocazione è disponibile nei dati SMART. Ciò che accade è se una scrittura viene eseguita in uno dei settori danneggiati in attesa di riallocazione, la riallocazione viene eseguita perché l'unità ora ha dati validi per scrivergli dopo la riallocazione. Quindi, quando la gente dice che scrivere in un brutto settore lo riallocerà, questa è solo metà della storia. L'unità deve essere letta per prima in modo che l'unità possa scoprire tutti i settori danneggiati che non possono essere riallocati automaticamente. In questo modo è possibile scrivere un'intera unità e i dati SMART diranno che non ci sono settori danneggiati in attesa di riallocazione, ma non è stata necessariamente cancellata l'unità di tutti i settori danneggiati. Quindi, se vuoi davvero cancellare un'unità di tutti i settori danneggiati,

Esistono altri modi per gestire blocchi danneggiati che non possono essere riallocati. Se l'unità fa parte di una configurazione RAID ridondante (ovvero, tranne RAID 0), il software RAID dovrebbe recuperare automaticamente i dati per un settore danneggiato dalle altre unità e scriverli nel settore riallocato. I dischi SCSI hanno un comando esplicito di riassegnazione dei blocchi che l'host può utilizzare per forzare la riassegnazione anche quando non ci sono dati validi da scrivere sul blocco, ma il suo utilizzo è piuttosto basso.


1
Potrebbe anche valere la pena ricordare che almeno alcuni HDD Seagate supportano Write-Read-Verify, che può essere attivato utilizzando hdparm -R(presupponendo un hdparm abbastanza recente). Ciò comporta una notevole penalizzazione delle prestazioni di scrittura (dimezzando il throughput di scrittura e la scrittura IOPS, perché ogni scrittura ora incorre in una lettura successiva) ma se l'hardware lo supporta e il carico di lavoro è pesante, allora potrebbe essere una misura preventiva molto praticabile .
un CVn

2

Penso che tutto ciò che devi fare è:

e2fsck -c /dev/hda1

assumendo / dev / hda1 è la partizione (non montata). O:

e2fsck -c -c /dev/hda1

per eseguire un test di lettura / scrittura (più lento) non distruttivo. Dovrà comunque essere smontato. Non credo che questo ti fornirà dettagli su eventuali dati persi.


Ma è un peccato che non sembri utilizzare le informazioni di SMART sui blocchi danneggiati. Mi chiedo perché non esiste uno strumento fsck che utilizzi le informazioni di blocco errate di SMART e cerchi di evitarle o di riparare i file interessati come descritto in smartmontools.sourceforge.net/badblockhowto.html o serverfault.com/a/106130/68972 . ..
imz - Ivan Zakharyaschev,

2

Michael lo ha corretto e nella maggior parte dei casi direi che è sufficiente sostituire l'unità che costa poco. Tuttavia, se non si dispone di backup e non è possibile ottenere dati importanti dall'unità o si desidera semplicemente tentare di riparare l'unità, è possibile provare a utilizzare spinrite al massimo livello.

Avevo un drive per laptop che ha iniziato a fare qualche rumore qualche anno fa. Badblocks ha mostrato che l'unità aveva 118 blocchi o così male visibili all'utente finale. Dato che avevo già una copia di SpinRite, ho deciso di provarlo prima di acquistare un nuovo disco. Dopo aver eseguito spinrite sull'unità, i badblock hanno mostrato 0 blocchi danneggiati e i rumori si sono fermati. Da allora il disco funzionava da oltre due anni.


Nelson hai intenzione di votare in basso ogni risposta che non è quella che vuoi sentire? Un'unità sana rimodella automaticamente un blocco danneggiato. Se devi fare tutto il possibile per forzare questo, l'unità non è più in salute e deve essere sostituita.
3dinfluenza

No, ho votato in negativo solo una risposta perché non ha risposto alla mia domanda. Hai suggerito lo spinrite, grazie! La mia comprensione è che un impulso sano non rimappa un settore danneggiato fino a quando non viene scritto. Sto cercando di trovare il modo più semplice per forzare una scrittura. Andare al suggerimento di Matthew e vedere se fsck è abbastanza intelligente da farlo.
Nelson,

Mi dispiace di essere saltato alle conclusioni lì dopo aver visto 2 risposte votate rapidamente e tu hai risposto all'altra risposta che pensavo fossi tu.
3dinfluenza

2
È corretto che il rimappamento del settore danneggiato si verifichi quando una scrittura non riesce in un blocco. Se hai solo un blocco danneggiato per quanto riguarda il file system, fsck potrebbe risolvere il tuo problema se il blocco in questione è un blocco di metadati. fsck scansiona e corregge errori nei metadati. Quindi non fornisce garanzie sui dati stessi. I filesystem di prossima generazione come BTRFS e ZFS possono rilevare e se si dispone di errori di ridondanza dei dati corretti. Spinrite lo forzerebbe anche mentre legge, quindi scrive i dati invertiti, rilegge, quindi inverte i dati su ogni blocco come parte della sua scansione.
3dinfluenza

1

Se si dispone di backup e si sa che si tratta di un errore logico e non fisico, il modo migliore per farlo è quello di azzerare il disco.

Vorrei usare MHDD è abbastanza facile da usare e finché ricordi di impostare il tuo HDD in Bios sull'emulazione IDE e poi di nuovo su AHCI quando il tuo lavoro è finito non hai nulla di cui preoccuparti.

Una volta avviato su MHDD, seleziona il tipo di unità nel comando ERASE e conferma la tua scelta.

Prendi te stesso, questo potrebbe richiedere del tempo.

Dopo che l'azionamento è stato azzerato, eseguire scan (f4) con Remap impostato su ON (l'impostazione predefinita è disattivata). Se ci sono ancora problemi con l'unità (ciò significherebbe che c'è un danno fisico sul piatto e l'unità è su una pendenza verso il basso stedy) questa opzione li "risolverà" mappando l'area danneggiata su parti sane dell'unità.

Se non ci sono errori UNC, allora congratulazioni con te e il tuo disco possono ancora essere amici per gli anni a venire.


-1

Se il disco non funziona, sostituirlo. Non vale il rischio che cada di più.


Ero esplicito nel sapere che il disco era danneggiato e che avevo dei backup per evitare il rischio.
Nelson,

2
Questo significa solo che sei disposto a giocare d'azzardo. Non penso che ciò significhi che non dovrebbe essere sostituito, solo che sei disposto a ignorare quel consiglio. Dubito che qualsiasi backup possa salvare il tuo sistema da se stesso mentre il disco cade a pezzi e le cose diventeranno molto traballanti man mano che le cose si degradano.
Michael Graff,

3
Questa risposta dovrebbe essere un commento ... La domanda è specifica ed esaustiva. E quindi questa non è una risposta.
Pitto,
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.