web-dev-qa-db-ja.com

Windowsはいつレジストリの変更をディスクに書き込みますか?

TL; DR:

レジストリを変更してからWindows 10システムを強制終了した場合、再起動後にレジストリの変更が表示されないことに気付きました。

また、休止状態のファイルを削除すると、Linuxの回復ツールがオフライン状態でWindowsレジストリを変更する可能性があることにも気付きました。休止状態ファイルを削除した後に、ツールが永続的な変更を加えることができないようです。以下に具体例を挙げます。

例1:

  • "HKLM\SOFTWARE"に "1111"というキーを追加します。その後、電源ボタンを5秒間押したままにして、ボックスの電源を切ります。
  • Test Key
  • レジストリを元に戻すと、そのキーとその値は消えています。
  • Test Key Gone
  • (これらの画像はフォーマット目的で編集されています)

例2

  • レジストリを変更します(regeditを使用)。
  • システムを休止状態にする
  • Linuxの回復ツールを起動します
  • ディスクをマウントするために休止状態ファイルを削除します。
  • (回復ツールから)Windowsレジストリを読みます
  • レジストリの変更はなくなりました。

これは箱のハードシャットダウンと同等のようです。

例3:

次の場合、見知らぬ人の動作がわかります。

  • 箱を休止状態にする
  • Linuxの回復ツールを起動して休止状態ファイルを削除します
  • (回復ツールから)レジストリに変更を加える
  • ボックスを再起動します

これらの変更はレジストリにも反映されません。

それではここで何が起こっているのですか?

  • Windows 10はいつディスクにレジストリの変更を書き込みますか?
  • 休止状態ファイルを削除すると(例3)、回復ツールによるレジストリの変更が次回の起動時に反映されないのはなぜですか?

明確にしたいと思います!

43
Shrout1

TL; DR:システムを適切にシャットダウンします。


休止状態はシャットダウンとは関係ありません。RAMの内容がディスクにプッシュされて読み込まれ、操作が再開されることを除いて、RAMへのサスペンド(スリープ)と密接に関連しています。システムが中断した正確な場所。

変更を保持したい場合は、休止状態Windows Fastboot(休止状態のサブセット)を無効にする必要があります。または、休止状態にして再起動するのではなく、実際にrebootすることができます。

変更が永続化されない理由は、休止状態ファイル内のディスクにまだ書き込まれていないためですexcept。これを削除します。つまり、ファイルシステムはそれ自体を修復し、「最後の正常な」状態に戻らなければならない可能性があります。

システムが休止状態になっている間、いくつかの重要なファイルシステム構造がディスクに書き出されていない可能性があり、代わりにRAMにあります。システムは、休止状態から再開すると、ディスクが非常に特定の状態にあることを期待し、ディスクキャッシュと重要なシステムファイルが実際のディスクではなく休止状態ファイルに保存される可能性があります。

適切なシャットダウンを行うと、Windowsは作業メモリをディスクに適切にフラッシュし、電源を切る前にディスクをきれいにアンマウントします。

適切なシャットダウンを強制するには、コマンドプロンプトを開いて入力します

shutdown /s /f /t 0

/sは「シャットダウン」、/fは強制、/t 0は「今」を意味します(時間= 0秒)

または、fastbootと休止状態を無効にすることもできます。

詳細は HowtoGeek:シャットダウンしてもWindows 10が完全にシャットダウンしない(ただし、再起動する)


ハードシャットダウンの実行に関連する問題として、Windowsは、変更を加えたのと同じミリ秒(または1分)でディスクに変更を書き込むことが保証されていないことがあります。ほとんど確実に数分分以内に書かれますが、実際に書かれた確率は時間とともに増加します。すぐに書かれる可能性は低いので、nearに変更を加えるまで、確率は急激に増加し、ほぼ確実に1時間以内に書かれます。

ただし、ハードシャットダウンを強制することで、システムに変更を安全にディスクに書き込む機会を与えていないということです。

最新のファイルシステムのほとんどは、可能な限り安全な方法で変更を行うために書かれています。過去には、変化が起こったかそうでないかのように、それらは「アトミック」と呼ばれていました。

今日、それらは Journalled file systems として知られています。なぜなら、システムのイベントで元に戻すかロールフォワードできるwillの操作のログを保持するからです失敗して再起動します。停電からの起動時に、システムはジャーナルをチェックし、各トランザクションについて、実際のファイルデータがディスクに書き込まれ、「正常」であるかどうかをチェックします。そうである場合、トランザクションはロールフォワードされて完了し、そうでない場合は、古いデータにロールバックします。

この順序を使用すると、ディスクはほとんどの場合、簡単に修復できる状態になります。

しかし、システムの電源を予期せずに強制的に停止することにより、トランザクションが修復時にロールフォワードできるほど十分に進行したかどうかを保証できません。また、LinuxなどのオペレーティングシステムはWindowsほどトランザクション履歴を気にせず、すべてを前方にではなく後方にロールする変更を行うだけではありません。

Windowsを再起動すると、ファイルシステムの詳細な知識があるため、ディスクを適切に修復しようとするか、適切に修復できる場合があります。

54
Mokubai

MSDNページのRegFlushKey に記載されているように、

RegFlushKey を呼び出すと、ディスク帯域幅を消費し、レジストリ内のすべてのプロセスによるすべてのキーへの変更をブロックするため、システム全体のパフォーマンスに大きな影響を与える高価な操作です。完了しました。 RegFlushKey は、レジストリの変更が変更後すぐにディスクに保持されることをアプリケーションが保証する必要がある場合にのみ明示的に呼び出す必要があります。キーに加えられたすべての変更は、それらをディスクにフラッシュする必要なしに他のプロセスから見えます。

あるいは、レジストリには、定期的にレジストリの変更をディスクにフラッシュする「遅延フラッシュ」メカニズムがあります。この通常のフラッシュ操作に加えて、レジストリの変更もシステムのシャットダウン時にディスクにフラッシュされます。 'lazy flush'によるレジストリ変更のフラッシュを許可することは、ディスク上のレジストリストアへのレジストリ書き込みを管理するための最も効率的な方法です。

これは、特定のキーをdiskすぐににフラッシュすること(フラッシュが完了するまで他のすべてのユーザーをレジストリからロックアウトすること)とは別に、レジストリが自動的に定期的にフラッシュされることを示します。時間は与えられていませんが、おそらくそれはあなたがキーを書いてからハードシャットダウンするまでの間に待っていた時間以上です。さらに、すでに考え出したように、シャットダウン時にフラッシュされます。

このキーを操作するソフトウェアでRegFlushKey関数を使用するか、またはこれを使用してレジストリキーを直ちにディスクに書き込むように追加のツールを作成することが重要です。

39
user914877

TL; DR:veryこれを実行するのは慎重です適切なタイミングで

FSCTL_MARK_AS_SYSTEM_Hive のドキュメントにはこう書かれています:

FSCTL_MARK_AS_SYSTEM_Hive制御コードは、指定されたファイルにレジストリのシステムHiveが含まれていることをファイルシステムに通知します。デッドロックを回避し、データの整合性を確保するために、ファイルシステムはシステムのHiveデータをちょうど正しいタイミングでディスクにフラッシュする必要があります。

私はこれ以上に公に利用可能な詳細があるとは思わない。

ファイルシステムをフラッシュしても、registryをフラッシュすることを意味するのではないことに注意してください。ファイルシステムのtop最初にレジストリをフラッシュするには、あなたの興味のあるキーに何らかの形でNtFlushKeyまたはZwFlushKeyを呼び出させる必要があります。

14
Mehrdad