Réponses:
Trois choses peuvent se produire:
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.
Segmentation fault
et vous prétendez qu'il s'est terminé avec succès ...?
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.
Depuis la mmap
page 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 mmap
fonction. Un MAP_PRIVATE
mappage de type est demandé (regardez dans fs/binfmt_elf.c
l'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 dd
s'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 dd
invocation.
Oui. Bien sûr, cela vous coûtera également la plupart de votre système de fichiers, mais vous le savez probablement déjà ...
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é.
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.