Que se passe-t-il si je zéros sur le lecteur où réside dd?

10

Cette commande dd if=/dev/zero of=/dev/sda bs=1Mréussira-t-elle si la commande dd était à l'origine sur / dev / sda? Est-ce que cela se terminera parce que dd est en mémoire à ce moment-là?

agz
la source

Réponses:

40

Trois choses peuvent se produire:

  1. La commande démarre, s'exécute jusqu'à la fin et vous êtes renvoyé à une invite. Étant donné que le disque est effacé, vous ne pouvez pas faire grand-chose après cela, bien que vous puissiez avoir de la chance avec certaines commandes intégrées au shell.
  2. La commande démarre. À un moment donné, il est paginé en raison de la pression de la mémoire. Normalement, ce n'est pas un problème car certaines parties peuvent simplement être rechargées à partir du disque (données inchangées) ou du swap. Cependant, si vous venez de les effacer, la commande dd échouera partiellement lors du remplissage du disque.
  3. La troisième option est quelque chose de BSD. Le MBR sur un disque monté est protégé contre l'écrasement. Même si vous exécutez la commande en tant que root. Il existe des dizaines de distributions Linux, toutes légèrement différentes. Il est fort possible que certains d'entre eux imitent cela.


Jusqu'ici pour la théorie. Maintenant, pour un test pratique.

J'ai installé un nouveau Ubuntu 12.10 sur une machine virtuelle. (Station de travail VMware sur win7-x64, en utilisant les options par défaut et un disque virtuel de 10 Go).

La commande dd s'est terminée avec succès et j'ai été renvoyé à ce qui semblait être une invite de travail. Je pouvais entrer de nouvelles commandes, mais elles échoueraient pour des raisons évidentes.

Capture d'écran de la machine virtuelle Ubuntu après avoir essuyé le disque

Hennes
la source
9
Big +1 pour le test pratique!
Doug Harris
10
Je vois Segmentation faultet vous prétendez qu'il s'est terminé avec succès ...?
Alvin Wong
1
Toujours. Cela rendait le disque illisible. Je pense que c'était l'objectif. Pour les effacements sécurisés, vous devriez vraiment essayer autre chose (comme la commande secure erase).
Hennes
l'une des meilleures réponses que j'ai jamais obtenues. Merci!
agz
6

Une expérience rapide dans une machine virtuelle utilisant Damn Small Linux indique que la commande dd se termine bien, comme prévu; le programme est initialement chargé en mémoire pour s'exécuter et il est très peu logique de charger l'exécutable encore et encore pendant le processus. Finalement, dd se fermera et signalera «plus d'espace sur l'appareil».

Par la suite, le système d'exploitation semble fonctionner normalement à première vue, mais se bloque après la première commande, il ne peut plus s'exécuter pour des raisons évidentes et ne répond plus. Une brève inspection du contenu du disque dur montre que la partition a bien été mise à zéro.

Marcks Thomas
la source
4

Depuis la mmappage sur Linux:

MAP_SHARED Share this mapping.  Updates to the mapping are visible to other processes that map this  file,
           and  are  carried  through  to the underlying file.  The file may not actually be updated until
           msync(2) or munmap() is called.


MAP_PRIVATE
           Create a private copy-on-write mapping.  Updates to the mapping are not visible to other  pro‐
           cesses  mapping  the  same  file,  and  are  not carried through to the underlying file.  It is
           unspecified whether changes made to the file after the mmap() call are visible  in    mapped
           region.

Les exécutables sont mappés en mémoire par le noyau via un appel interne à la mmapfonction. Un MAP_PRIVATEmappage de type est demandé (regardez dans fs/binfmt_elf.cl'arborescence des sources du noyau).

Cela se résume donc au comportement de mmap: si les modifications dans le fichier, ou le périphérique de bloc sous-jacent auquel ce fichier est référencé, sont propagées aux pages du mappage qui ont déjà été paginées et sont présentes.

Cette page est basée sur les normes de l'API, plutôt que sur le comportement du noyau, d'où le "non spécifié". Le comportement réel est que les modifications apportées au fichier ne sont pas propagées aux pages déjà présentes. Bien sûr, si le programme passe soudainement à une page de code qui n'a pas été paginée et que l'effacement a déjà eu lieu, il obtiendra une page de tous les zéros.

Mais, très probablement, au moment où il dds'efface, il a paginé dans toutes les pages de code dont il a besoin pour continuer la boucle d'effacement. Il est possible qu'une fois la boucle terminée, elle puisse frapper du code qui se trouve dans une page non présente: comme, par exemple, une fonction s'étend sur une limite de page, donc pour atteindre l'instruction de retour, une page doit être récupérée.

Mais cette page peut également être mise en cache à partir d'une précédente ddinvocation.

Kaz
la source
1

Oui. Bien sûr, cela vous coûtera également la plupart de votre système de fichiers, mais vous le savez probablement déjà ...

Aaron Miller
la source
0

J'ai fait une erreur récemment. J'avais l'intention de créer une img de 2 Go sur la carte SD, mais je l'ai fait par erreur dd if=rasberrypi.img of=/dev/sda. J'ai réalisé mon erreur et annulé le DD, mais à ce moment-là ~ 600 Mo (sur un disque avec ~ 500 Go utilisé) avaient été écrits. La table de partition a été ruinée.

Le bureau (avec 10 Go de mémoire et plus pendant des semaines) a continué à fonctionner pendant quelques heures si rien ne se passait. Géré pour obtenir les fichiers importants récemment modifiés dans Dropbox, parcourus normalement dans Chrome. En fait, je pouvais exécuter le dd sur la carte SD comme je l'avais voulu à l'origine, a bien fonctionné.

Après quelques heures, mon système de fichiers est passé en mode lecture seule et des programmes aléatoires ont commencé à mourir. J'ai été transféré dans de nombreux autres systèmes, je pouvais continuer à utiliser ces sessions, mais faire une nouvelle session a donné une erreur qu'il ne pouvait pas trouver le programme ssh. À ce moment, je pouvais basculer les onglets ouverts en chrome, mais le contenu des onglets semble avoir "bloqué". Si je rafraîchis, je reçois un écran blanc pour toujours. rsyslogd prenait 100% de processeur (1 cœur) pour une raison quelconque, il était probablement difficile de comprendre pourquoi il ne pouvait pas vider les journaux sur le disque ... peut-être.

J'ai eu une vidéo de 350 Mo ouverte (et mise en pause) dans VLC, je pouvais toujours la lire et passer à n'importe quelle partie de la vidéo. Probablement depuis son téléchargement récent.

Je pourrais arrêter le système normalement en utilisant l'interface graphique, aucune erreur.

Donc, cela ne répond pas exactement à votre question, mais indique ce qui se passe si vous effacez le début du disque.

La plupart des choses sur le disque peuvent toujours être récupérées, mais je ne vais pas déranger puisque (espérons-le) tout ce qui m'importe est sauvegardé.

sajal
la source
-1

Très probablement, il ne se terminera pas, car un autre composant en cours d'exécution demandera un fichier manquant et paniquera le noyau. si vous voulez vraiment mettre le disque à zéro, utilisez un CD live; sinon vous ne pouvez jamais garantir le résultat.

Frank Thomas
la source
2
Demander un fichier manquant ne paniquera pas le noyau. Si c'était le cas, les machines tomberaient en panne si elles n'avaient qu'un seul disque non fiable.
David Schwartz
@DAvid Schwartz, si tel était le cas, alors #rm -rf / supprimerait en fait tout le système de fichiers. Je sais par expérience que ce n'est pas le cas. le système ne peut pas fonctionner longtemps entièrement à partir du ram, à moins qu'une sorte de technologie de disque virtuel ne soit implémentée, ce qui n'est pas standard.
Frank Thomas
@FrankThomas: Le noyau a-t-il paniqué?
David Schwartz
oui, fermeture de l'écran noir.
Frank Thomas