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 dd
ne 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
dd conv=noerror
pourrait ê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.dd
documents GNUnoerror
comme 'continuer après les erreurs de lecture' ...dd conv=noerror
C'est la norme POSIX mais ça peut être vraiment lentdd conv=noerror
doit ê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 avecconv=notrunc
, ce qui a fait l'affaire pour ignorer les erreurs d'écriture pour moi. unix.stackexchange.com/a/229379/4319dd 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?Réponses:
Je préfère
badblocks
en 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?).Et la liste de blocage:
Et ce qui reste sur le disque après:
Notez que ce ne sont pas vraiment des données aléatoires - le motif est répétitif, donc si vous sautez,
1MiB
vous 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
badblocks
serait d'utiliser une taille de bloc beaucoup plus grande.Je ne sais pas si
ddrescue
cela 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 ...la source
-t random
ou-t 0
- est-ce que badblocks fait alors une seule passe d'écriture? En regardant la page de manuel - il semble que sans-t
elle, 4 passes (pour «0xaa, 0x55, 0xff, 0x00»).-t
vous fournissez sur la ligne de commande. La valeur par défaut est de 4 passes comme vous le dites.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/sdX
titre 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):
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):
et effacer:
Plus d'informations sur cette procédure sont disponibles ici .
la source
/dev/sdX
c'est bien, car si quelqu'un manque une occurrence lors du collage et de la personnalisation, il n'y aura pas de problème.Je vois quatre réponses réalisables ici:
La
hdparm
mé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.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/urandom
plutôt que/dev/zero
; par exemple,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):
Ce sera plus rapide que la
dd
commande, mais pas aussi vite que lahdparm
commande. Voir ci-dessous pourquoi je ne recommande pas cela ...La
badblocks
commande 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:
Et puis, pour réécrire les mauvais blocs, juste quelque chose comme:
Si cette commande fonctionne, si vous êtes courageux, vous pouvez reformater votre disque et l'utiliser à nouveau.
Vous pouvez également exécuter la
badblocks
commande sur le disque deux fois. La deuxième fois, il ne devrait signaler aucun mauvais bloc ...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
hdparm
commande. 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.
la source
a probablement fait l'affaire pour moi.
Les mentionnés
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:
L'ajout d'une coutume
bs=
peut également être souhaité dans certains cas.la source
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
sdd
c'est plus rapide qu'endd
cas 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/
la source