Comment ignorer les erreurs d'écriture lors de la remise à zéro d'un disque?


19

Supposons que vous souhaitiez mettre à zéro un disque dur défaillant. Vous souhaitez écraser autant que possible avec des zéros. Ce que vous ne voulez pas, c'est: le processus s'interrompt à la première erreur d'écriture. Comment faire ça?

AFAICS, plain ddne fournit qu'une option pour ignorer les erreurs de lecture. Ainsi, quelque chose comme

dd if=/dev/zero of=/dev/disk/by-id/lousy-vendor-123 bs=128k

n'est pas assez.

ddrescue semble être mieux à ignorer les erreurs - mais quelle serait la ligne de commande optimale avec elle?

Mon essai avec GNU ddrescue:

ddrescue --verbose --force --no-split /dev/zero /dev/disk/by-id/lousy-vendor-123

1
dd conv=noerrorpourrait être une extension GNU, je ne suis pas sûr. En tout cas, ça devrait faire l'affaire. Cependant, la réponse SATA dit au lecteur de s'effacer lui-même vaut la peine d'être effacée pour effacer des disques entiers.
Peter Cordes

1
@PeterCordes, la page de manuel des dddocuments GNU noerrorcomme 'continuer après les erreurs de lecture' ...
maxschlepzig

1
dd conv=noerrorC'est la norme POSIX mais ça peut être vraiment lent
schily

2
dd conv=noerrordoit être pour des erreurs de lecture (selon la page de manuel), pas pour des erreurs d'écriture. Il n'y a rien de mal à le combiner avec conv=notrunc, ce qui a fait l'affaire pour ignorer les erreurs d'écriture pour moi. unix.stackexchange.com/a/229379/4319
imz - Ivan Zakharyaschev

Une simple opération d'écriture sur un disque dur, telle que l'utilisation dd if=/dev/zero of=/dev/sdX, n'effectuerait aucune lecture de disque. Pourquoi pensez-vous que la commande dd "ne suffit pas" ? Quelles "erreurs" rencontrez-vous?
sciure de bois

Réponses:


12

Je préfère badblocksen mode d'écriture destructrice pour cela. Il écrit, il continue de le faire lorsqu'il rencontre des erreurs, et enfin il vous indique où étaient ces erreurs, et ces informations peuvent vous aider à décider quoi faire ensuite (Will It Blend?).

# badblocks -v -b 4096 -t random -o badblocks.txt -w /dev/destroyme
Checking for bad blocks in read-write mode
From block 0 to 2097151
Testing with random pattern: done
Reading and comparing: done
Pass completed, 52105 bad blocks found. (0/52105/0 errors)

Et la liste de blocage:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

Et ce qui reste sur le disque après:

# hexdump -C /dev/destroyme
00000000  be e9 2e a5 87 1d 9e 61  e5 3c 98 7e b6 96 c6 ed  |.......a.<.~....|
00000010  2c fe db 06 bf 10 d0 c3  52 52 b8 a1 55 62 6c 13  |,.......RR..Ubl.|
00000020  4b 9a b8 d3 b7 57 34 9c  93 cc 1a 49 62 e0 36 8e  |K....W4....Ib.6.|

Notez que ce ne sont pas vraiment des données aléatoires - le motif est répétitif, donc si vous sautez, 1MiBvous verrez à nouveau la même sortie.

Il essaiera également de vérifier en lisant les données, donc si vous avez un disque qui prétend réussir à écrire mais renvoie des données erronées lors de la lecture, il trouvera également ces erreurs. (Assurez-vous qu'aucun autre processus n'écrit sur le disque pendant l'exécution de badblocks pour éviter les faux positifs.)

Bien sûr, avec un disque mal cassé, cela peut prendre trop de temps: il n'y a pas de code qui le ferait sauter complètement les zones défectueuses. La seule façon d'y parvenir badblocksserait d'utiliser une taille de bloc beaucoup plus grande.

Je ne sais pas si ddrescuecela fait mieux; il est censé le faire dans l'autre sens (récupérer le plus de données possible le plus rapidement possible). Vous pouvez le faire manuellement pour dd / ddrescue / badblocks en spécifiant le premier / dernier bloc ...


1
Si j'utilise -t randomou -t 0- est-ce que badblocks fait alors une seule passe d'écriture? En regardant la page de manuel - il semble que sans -telle, 4 passes (pour «0xaa, 0x55, 0xff, 0x00»).
maxschlepzig

2
Il fait un passage pour chacun que -tvous fournissez sur la ligne de commande. La valeur par défaut est de 4 passes comme vous le dites.
frostschutz

13

Si le disque n'est pas connecté par USB, envisagez d'utiliser hdparm(version> 9.31) pour effectuer un effacement sécurisé ATA du disque. Cette commande provoque le microprogramme du lecteur pour effacer le contenu du disque, y compris les blocs défectueux.

Avertissement: utilisez la bonne lettre de lecteur - je l'ai montré à /dev/sdXtitre d'exemple - ne vous contentez pas de copier / coller.

Tout d'abord, vérifiez qu'il comprend les commandes ATA (la plupart des disques fabriqués au cours de la dernière décennie ou plus devraient le faire):

$ sudo hdparm -I /dev/sdX
.
# lots of other info here...
.
Security: 
    Master password revision code = 65534
        supported
    not enabled
    not locked
    not frozen
    not expired: security count
        supported: enhanced erase
    202min for SECURITY ERASE UNIT. 202min for ENHANCED SECURITY ERASE UNIT.

Les deux dernières lignes de l'extrait montrent qu'il est pris en charge.

Par conséquent, ajoutez un mot de passe au lecteur (une exigence apparemment):

$sudo hdparm --user-master u --security-set-pass p /dev/sdX
security_password="p"

et effacer:

$sudo hdparm --user-master u --security-erase p /dev/sdX
security_password="p"

/dev/sdX:
Issuing SECURITY_ERASE command, password="p", user=user

Plus d'informations sur cette procédure sont disponibles ici .


Cela peut fonctionner sur USB si vous êtes chanceux, et votre pont USB <-> SATA peut passer par des commandes SATA non standard (et le pilote Linux + hdparm sait comment le faire sur ce modèle). De plus, pour écrire des exemples, /dev/sdXc'est bien, car si quelqu'un manque une occurrence lors du collage et de la personnalisation, il n'y aura pas de problème.
Peter Cordes

@Peter Cordes - A moins que vous n'ayez 24 disques ... Non, idiot moi! Merci, je l'ai changé en sdX, cela m'apprendra à précipiter une réponse!
garethTheRed

2
La page liée répertorie de nombreuses mises en garde liées au matériel / firmware avec cette méthode ... un peu effrayant
maxschlepzig

Il montre en effet quelques mises en garde! Tout ce que je peux dire, c'est que cela a fonctionné pour moi sans aucun problème.
garethTheRed

2

Je vois quatre réponses réalisables ici:

  1. La hdparmméthode publiée par garethTheRed est probablement la meilleure si vous êtes connecté directement à votre ordinateur. Apparemment, cependant, si vous l'essayez connecté via USB, vous pouvez briquer votre disque. Si vous faites cela pour un lecteur dont vous êtes sur le point de vous débarrasser, cela peut être une bonne chose. Cependant, vous souhaiterez probablement sécuriser l'effacement avant de le supprimer.

  2. La technique rapportée par imz - Ivan Zakharyaschev fonctionnera, mais peut être très lente. Je suggère que si vous ne voulez pas que les données soient récupérables, utilisez /dev/urandomplutôt que /dev/zero; par exemple,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. Je déconseille ce qui suit. Pour quelque chose de plus rapide qui fait la même chose, utilisez la technique rapportée par maxschlepzig (dans la question):

    ddrescue --verbose --force --nosplit /dev/urandom /dev/sdX
    

    Ce sera plus rapide que la ddcommande, mais pas aussi vite que la hdparmcommande. Voir ci-dessous pourquoi je ne recommande pas cela ...

  4. La badblockscommande fonctionnera également, mais vous ne pouvez pas randomiser les données de cette façon, et encore une fois, elle sera très lente.

Enfin, je m'en voudrais de ne pas mentionner la première raison pour laquelle les gens veulent effacer complètement un disque parce qu'ils sont sur le point de s'en débarrasser. Dans ce cas, si vous ne l'avez pas déjà fait, vous voudrez peut-être essayer de récupérer le disque en premier. Si vous lisez un bloc et qu'il renvoie l'erreur d'E / S, la prochaine fois que vous écrivez dans le même bloc, le disque tentera de réaffecter un bloc différent à partir d'une liste de réserve. Une fois la liste de réserve pleine, vous obtiendrez des erreurs d'E / S lors des écritures. C'est à ce moment que vous devez vraiment jeter le lecteur.

Vous pouvez donc faire quelque chose de simple comme:

dd if=/dev/sdX of=/dev/null conv=noerror

Et puis, pour réécrire les mauvais blocs, juste quelque chose comme:

dd if=/dev/zero of=/dev/sdX bs=128k

Si cette commande fonctionne, si vous êtes courageux, vous pouvez reformater votre disque et l'utiliser à nouveau.

Vous pouvez également exécuter la badblockscommande sur le disque deux fois. La deuxième fois, il ne devrait signaler aucun mauvais bloc ...

badblocks -v -s -w -t random /dev/sdX
badblocks -v -s -w -t random /dev/sdX

Cela prendra plus de temps, mais est plus fiable.

Il convient également de noter qu'aucune des techniques ne fait vraiment d'effacement sécurisé, à l'exception de la hdparmcommande. Rappelez-vous tous ces mauvais blocs? Ceux-ci ont encore certaines de vos données d'origine presque intactes. Un expert en récupération de données pourrait y accéder pour voir une petite quantité de ce qui était auparavant sur votre disque dur.

En ce qui concerne ddrescue et pourquoi je déconseille cela, j'ai l'antidote suivant:

Le problème est que ddrescure sera TROP bon pour ignorer les erreurs. J'avais un disque dur qui, de manière cohérente avec dd, avait baissé la vitesse d'écriture à environ 102 Go et commencé à produire des erreurs d'écriture à 238 Go. J'ai été assez impressionné par le fait que ddrescue a continué à parcourir le disque à une vitesse constante, ne signalant même aucune erreur. 17 heures plus tard, quand il était à 1300 Go quand j'ai remarqué que le voyant du lecteur lui-même a cessé de clignoter. Une vérification rapide a révélé que l'ensemble du boîtier USB était hors ligne. J'ai sorti le lecteur du berceau. J'ai remarqué que ddrescue était heureux de signaler qu'il copiait toujours sans erreur, même avec le disque entre mes mains. J'ai branché le disque sur une autre machine et j'ai trouvé que c'était maintenant une brique.

Je ne blâme pas ddrescue d'avoir fait du disque une brique. Le lecteur échouait et allait devenir une brique. Je trouve juste que ddrescue dérangeant ne donne même pas le nombre d'erreurs d'écriture qu'il ignore. Dans cette utilisation, ddrescue vous laisse penser qu'il a complètement réussi, indépendamment de tous les échecs d'écriture. Le fait est qu'il n'aurait pas dû pouvoir continuer à pleine vitesse dans la section au ralenti. La raison pour laquelle la section était lente est que de nombreux blocs avaient été déplacés par le lecteur, ce qui provoquait de nombreuses recherches lors de l'accès à cette section. C'est donc probablement le moment où la sortie de ddrescue est devenue fictive.


1
«Pour effacer en toute sécurité, vous devez écraser plusieurs fois le même bloc avec des données aléatoires.» - pouvez-vous étayer votre réclamation avec une référence (c'est-à-dire un article révisé par des pairs qui montre la récupération de données à zéro sur des disques durs modernes)? De plus, le firmware du disque dur est une boîte noire. Comment savez-vous que la commande de suppression sécurisée ATA n'est pas simplement implémentée en tant que modèle d'écriture zéro sur chaque secteur?
maxschlepzig

Juste l'inverse. Il semble qu'en 2006, un certain nombre d'études ont montré que les écritures multiples à l'ancienne ne sont plus nécessaires avec les lecteurs modernes, car les lecteurs modernes stockent les données si denses qu'une seule écriture est tout aussi efficace.
user6856

1
dd conv=notrunc

a probablement fait l'affaire pour moi.

Les mentionnés

dd conv=noerror

doit être pour les erreurs de lecture (selon la page de manuel). Il n'y a rien de mal à combiner les deux.

Ma commande complète pour mettre à zéro un disque ressemblait à ceci:

dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/zero of=/dev/sda

L'ajout d'une coutume bs=peut également être souhaité dans certains cas.


1

Une méthode rapide et mature est à utiliser sdd.

Si vous souhaitez simplement détruire tout le contenu, appelez:

sdd -inull bs=1m of=/dev/rdsk/cXdXtXp0 -noerror

Utilisez toujours l'interface du pilote de disque "brut".

Si vous souhaitez réparer un disque et conserver autant que possible l'ancien contenu, appelez:

sdd if=/dev/rdsk/cXdXtXp0 of=/dev/rdsk/cXdXtXp0 bs=1m -noerror

Cela remplacera tous les blocs illisibles par des zéros au niveau de 512 octets. Vous pouvez modifier le nombre de nouvelles tentatives via try=#, la valeur par défaut est 2.

Notez que sddc'est plus rapide qu'en ddcas d'erreurs car il essaie d'abord de lire avec la taille de bloc fournie et en cas d'erreurs, il lit avec 512 octets. S'il y a des erreurs de lecture, sdd effectue des recherches aléatoires et des lectures factices pour calmer le micrologiciel du lecteur.

Les fonctionnalités améliorées de récupération d'erreurs ont été développées dans les années 1980 alors que je travaillais pour le deuxième plus grand OEM de Sun-Microsystems.

Le code source SDD est inclus dans les outils Schily:

http://sourceforge.net/projects/schilytools/files/

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.