web-dev-qa-db-fra.com

Quand Windows écrit-il les modifications du registre sur le disque?

TL; DR:

J'ai remarqué que si je modifie le registre, puis arrête brutalement mon système Windows 10, le changement de registre n'apparaît pas après le redémarrage.

J'ai également remarqué que la suppression d'un fichier d'hibernation pouvait avoir une incidence sur la capacité d'un outil de récupération Linux à apporter des modifications au registre Windows en mode hors connexion. L'outil semble incapable d'apporter des modifications persistantes après la suppression d'un fichier d'hibernation. Je vais énumérer des exemples spécifiques ci-dessous.

Exemple 1:

  • J'ajoute une clé appelée "1111" dans "HKLM\SOFTWARE". J'ai ensuite éteint mon ordinateur en maintenant le bouton d'alimentation enfoncé pendant 5 secondes.
  •  Test Key
  • Lorsque je récupère le registre, cette clé et ses valeurs ont disparu:
  •  Test Key Gone
  • (Ces images ont été éditées à des fins de formatage)

Exemple 2 :

  • Faire un changement dans le registre (en utilisant regedit)
  • Hibernate le système
  • Démarrez dans un outil de récupération Linux
  • Supprimez le fichier d'hibernation afin de monter le disque.
  • Lire le registre Windows (à partir de l'outil de récupération)
  • Le changement de registre est parti.

Cela semble équivalent à un arrêt brutal de la boîte.

Exemple 3:

Je vois le comportement inconnu lorsque je:

  • Hibernate la boîte
  • Démarrez avec un outil de récupération Linux et supprimez le fichier de mise en veille prolongée.
  • Apporter des modifications au registre (à partir de l'outil de récupération)
  • Redémarrer la boîte

Ces changements ne sont pas reflétés dans le registre non plus.

Alors qu'est-ce qui se passe ici?

  • Quand Windows 10 écrit-il les modifications du registre sur le disque?
  • Pourquoi la suppression d'un fichier d'hibernation (dans l'exemple 3) empêche-t-elle les modifications de registre apportées par l'outil de récupération d'être répercutées au prochain démarrage?

En espérant avoir des éclaircissements!

43
Shrout1

TL; DR: Arrêtez votre système correctement.


L’hibernation n’a rien à voir avec l’arrêt; elle est étroitement liée à la suspension en mémoire vive (veille), à ​​l’exception du contenu de RAM inséré sur le disque afin que celui-ci puisse être relu et que l’opération reprenne exactement où le système s'est arrêté.

Si vous souhaitez que les modifications persistent, vous devez désactiver la mise en veille prolongée et Windows Fastboot (qui est un sous-ensemble de la veille prolongée). Ou vous pouvez réellement reboot plutôt que de mettre en veille prolongée et de redémarrer.

La raison pour laquelle les modifications ne sont pas conservées, c'est parce qu'elles ne sont pas encore écrites sur le disque sauf dans le fichier de veille prolongée. Ce que vous êtes en train de supprimer, ce qui signifie que le système de fichiers devra peut-être se réparer lui-même et revenir à un état "dernier bon connu".

Pendant l'hibernation du système, il y aura plusieurs structures de système de fichiers clés qui n'ont peut-être pas été écrites sur le disque mais qui sont plutôt en RAM. À la sortie de l'hibernation, le système s'attend à ce que le disque soit dans un état très particulier. Il est donc possible que les caches de disque et les fichiers système importants soient enregistrés dans le fichier d'hibernation plutôt que sur le disque lui-même.

Si vous effectuez un arrêt approprié , Windows videra correctement la mémoire de travail sur le disque, puis démontera le disque proprement avant de le mettre hors tension.

Pour forcer un arrêt approprié, ouvrez une invite de commande et tapez

shutdown /s /f /t 0

/s est "shutdown", /f pour forcer, et /t 0 pour signifier "maintenant" (heure = 0 secondes)

Ou vous pouvez simplement désactiver le démarrage rapide et l'hibernation.

En savoir plus sur HowtoGeek: La fermeture ne ferme pas complètement Windows 10 (mais le redémarrage le fait)


En ce qui concerne l’arrêt brutal du problème, il n’est pas garanti que Windows n’écrive aucune modification sur le disque de la même milliseconde (ou même la minute) à laquelle vous effectuez la modification. Il sera presque certainement écrit dans quelques minutes minutes mais la probabilité qu’il soit écrit augmentera avec le temps. Il est peu probable que vous écriviez immédiatement, alors presque au moment où vous apportez le changement, la probabilité augmente brusquement et aura presque certainement été écrite en moins d'une heure.

Cependant, le fait est qu’en forçant un arrêt brutal, vous ne donnez pas au système une chance d’écrire en toute sécurité les modifications apportées sur le disque.

La plupart des systèmes de fichiers modernes sont écrits pour apporter des modifications de la manière la plus sûre possible. Dans le passé, ils ont été qualifiés d '"atomiques", car le changement a eu lieu ou non.

Aujourd'hui, nous les connaissons sous le nom de Systèmes de fichiers Journalled car ils tiennent un journal des opérations qui va se produire et qui peuvent être soit annulées, soit restaurées en cas de défaillance ou de redémarrage du système. Lors du démarrage suite à une panne de courant, le système vérifie le journal et vérifie, pour chaque transaction, si les données de fichier réelles sont écrites sur le disque et sont "correctes". Si c'est le cas, la transition est ensuite poursuivie et terminée. Sinon, elle revient aux anciennes données.

En utilisant cette commande, le disque est presque toujours dans un état facile à réparer.

Mais en forçant votre système à s’éteindre de manière inattendue, vous ne pouvez pas garantir que la transaction a progressé suffisamment loin pour être réparée. Il est donc probable qu’un système d’exploitation tel que Linux ne se soucie pas autant que Windows de l’historique des transactions et qu’il est plus probable. que de ne pas simplement faire des changements qui renvoient tout en arrière plutôt qu'en avant.

Si vous redémarrez sous Windows, vous pourrez peut-être essayer de réparer correctement le disque, car il possède une connaissance plus intime du système de fichiers.

54
Mokubai

Comme indiqué sur la page MSDN pour RegFlushKey :

L'appel RegFlushKey est une opération coûteuse qui affecte considérablement les performances du système car elle consomme de la bande passante et bloque les modifications apportées à toutes les clés par tous les processus de la ruche de registre en cours de vidage jusqu'à la fin de l'opération de vidage. RegFlushKey ne doit être appelé explicitement que lorsqu'une application doit garantir que les modifications du registre sont conservées sur le disque immédiatement après la modification. Toutes les modifications apportées aux clés sont visibles par les autres processus sans qu'il soit nécessaire de les vider sur le disque.

Sinon, le registre dispose d'un mécanisme de «vidage paresseux» qui vide les modifications du registre sur le disque à intervalles réguliers. En plus de cette opération de vidage régulier, les modifications du registre sont également vidées sur le disque lors de l'arrêt du système. Le moyen le plus efficace de gérer les écritures de registre dans le magasin de registres sur disque est de permettre au "fless paresseux" de vider les modifications du registre.

Cela suggère qu'hormis le vidage d'une clé spécifique sur le disque immédiatement (qui verrouille tout le monde en dehors du registre jusqu'à ce que le vidage soit terminé), le registre est automatiquement vidé périodiquement: un délai n'est pas donné, mais vraisemblablement il est au moins plus que le temps que vous avez attendu entre l’écriture de la clé et l’arrêt brutal. De plus, il est vidé à l’arrêt, comme vous l’aviez déjà compris.

Vous pouvez utiliser la fonction RegFlushKey dans le logiciel manipulant ladite clé ou créer un outil supplémentaire pour forcer l'écriture immédiate d'une clé de registre sur le disque, si cela est crucial pour votre cas d'utilisation.

39
user914877

TL; DR: C'est très prudent de le faire au bon moment.

La documentation sur FSCTL_MARK_AS_SYSTEM_Hive dit ceci:

Le code de contrôle FSCTL_MARK_AS_SYSTEM_Hive informe le système de fichiers que le fichier spécifié contient la ruche système du registre. Le système de fichiers doit vider les données système Hive sur le disque à au bon moment pour éviter les blocages et garantir l'intégrité des données.

Je ne crois pas qu'il y ait plus de détails disponibles publiquement que cela.

N'oubliez pas que vider le système de fichiers ne signifie pas vider le registre, car le registre peut effectuer la mise en cache sur haut du système de fichiers. Pour vider d’abord le registre, vous devez faire en sorte que NtFlushKey ou ZwFlushKey soit appelé sur votre clé d’intérêt.

14
Mehrdad