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


43

TL; DR:

レジストリを変更してからWindows 10システムをハードシャットダウンすると、再起動後にレジストリの変更が表示されないことに気付きました。

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

例1:

  • 「1111」というキーを「HKLM \ SOFTWARE」に追加します。次に、電源ボタンを5秒間押し続けることで、ボックスの電源を完全にオフにします。
  • テストキー
  • レジストリを元に戻すと、そのキーとその値はなくなります。
  • テストキーがなくなった
  • (これらの画像はフォーマットのために編集されました)

例2

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

これは、ボックスのハードシャットダウンに相当するようです。

例3:

私は次のときに見知らぬ人の行動を見ます:

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

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

ここで何が起こっているのでしょうか?

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

明確化を望んでいます!


2
「レジストリの変更は、再起動後に表示されません。」-レジストリの変更は、再起動するまで有効になりません。通常、ファイルエクスプローラーのみを再起動する必要があります。それはすべて、再起動が実際に必要な場合にレジストリの変更が意図する動作に依存します。実際のキーは変更されると変更され、質問に答えます。
ラムハウンド

8
ハードシャットダウンとはどういう意味ですか?シャットダウンするまで電源ボタンを押し続けますか?このプロセスは、保留中のディスクキャッシュの書き込みをすべてバイパスします。
DavidPostill

2
@Ramhound私はそれが有効にならないことを知っていますが、なぜそれがディスクに書き込まれなかったのですか?編集を行い、ハードパワーダウンしてから、変更はもうありません。その時点でメモリで有効になったかどうかは関係ありません
Shrout1

2
@ Shrout1-マシンを安全にシャットダウンするのではなく、マシンを強制的にオフにするのはなぜですか?
ラムハウンド

6
@Ramhoundシステムを正常にシャットダウンしないとどうなるかを確認するためのテストを実行しています。ランダムですが、正しく処理されない場合にシステムで何も失われないように、これがメモリにコミットされる方法を正確に知る必要があります。
Shrout1

回答:


54

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


休止状態はシャットダウンとは関係ありません。RAMの内容がディスクにプッシュされ、システムが中断したところから動作が再開されるため、RAMへのサスペンド(スリープ)と密接に関連しています。 。

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

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

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

その場合は、適切なシャットダウンをし、Windowsはディスクに正しくフラッシュワーキングメモリになり、その後、電源を切る前に、きれいにディスクをアンマウントします。

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

shutdown /s /f /t 0

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

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

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


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

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

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

今日では、システム障害やリブートの場合に元に戻すかロールフォワードすることができる操作のログを保持するため、それらをジャーナリングファイルシステムとして認識しています。電源障害からの起動時に、システムはジャーナルをチェックし、各トランザクションについて、実際のファイルデータがディスクに書き込まれて「正常」であるかどうかをチェックします。その場合、トランザクションはロールフォワードされて完了し、そうでない場合は、古いデータにロールバックします。

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

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

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


ありがとうございました!あなたの応答に感謝します:)休止状態をオフにし、再起動して、同じテストを再実行しました。例1の結果は同じで、休止状態ファイルは含まれません。レジストリの変更は、ログオフ/シャットダウン中のある時点でのみ書き込まれるようです。また、システムが、休止状態から復帰するときに「最後の良好な」状態を探していることに同意します。
Shrout1

1
うーん...だから、ディスクへの書き込みキャッシュを強制するsysinternals "sync"をダウンロードしましたが、それは何もしませんでした(ハードシャットオフでキー/値を失います)。また、プロセスエクスプローラーを実行し、RegeditのプロパティでディスクI / Oを確認しました。I / Oは読み取りましたが、書き込みI / Oはありませんでした。これにより、シャットダウンを待っているのではないかと思うようになります。これを明白に示す可能性のある非常に乾燥したM $のドキュメントを知っていますか?あなたのご親切に感謝します!!
Shrout1

11
NTFSジャーナルは、ファイルデータに関する保証を行いません。NTFSメタデータの一貫性を保つためだけであるため、ファイルシステムが破損することはありません。個々のファイルにはまだ部分的な変更が記録されている可能性があり、ファイルが破損します。トランザクションNTFSがありますが、推奨されておらず、使用されることはほとんどありません。これは、データベースエンジンがデータの一貫性のために独自のジャーナルを保持する理由でもあります。参照してくださいblogs.msdn.microsoft.com/oldnewthing/20130101-00/?p=5673
ボブ・

2
@ Shrout1これは、レジストリの変更がライトバックキャッシュで保留されていることを前提としています。代わりにそれらが個別に管理され、これがファイルシステム、キャッシュなどとは無関係であることは完全に可能です。たとえば、前回正常起​​動時の構成は、正常な起動時にのみ更新されます。(レジストリの内部については、変更が保存されるタイミングを特定するのに十分な知識がありません。その後、TxRが関与する可能性があります。)
ボブ

1
強制的にシャットダウンする理由はありますか?実行中のアプリケーションを強制的に閉じるだけです。これは、他の方法では閉じられないアプリケーションを強制終了すること以外は何も行いません。また、自分が何であるかわからない場合、実行したり、アプリケーションを回復不能な状態にしたりしたことを-私はそれを「適切な」シャットダウンとは本当に呼びません。
-NotThatGuy

39

以下のMSDNページに記載されているRegFlushKeyとおり:

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

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

これは、特定のキーをすぐにディスクフラッシュすること(フラッシュが完了するまで他の全員をレジストリからロックアウトする)を除いて、レジストリは定期的に自動的にフラッシュされることを示唆しています:時間は与えられませんが、少なくともそれ以上ですキーの書き込みとハードシャットダウンの間に待機した時間。さらに、既にわかっていたように、シャットダウン時にフラッシュされます。

RegFlushKey上記のキーを操作するソフトウェアの機能を使用するか、使用状況に応じてレジストリキーをディスクに即座に書き込むための追加ツールを作成できます。


おい!次のMSDN記事へのリンクを投げた場合、これを提供します:Windows 8またはWindows Server 2012でアプリケーションレジストリの変更を保存し、簡単なブロック引用を追加します。あなたの答えは私をその記事へのウサギの穴に導きました、そしてそれは基本的にあなたがした同じことを言います。本当にありがとう!
Shrout1

しかし、ユーザーRegFlushKeyを呼び出す方法を知っている人はいますか?
スコット

@Scottコードで実行する必要があるようです...投稿にリストされているMSDNの記事にはC ++の例があり、他の場所でC#に実装されているのを見ました。コマンドラインから実行できるかどうかはわかりません。
Shrout1

3
@Scott:場合、私はショックを受けるだろうsync しなかったディスクにレジストリをフラッシュします。意味がありません。なぜフラッシュする必要があるファイルシステム(使用されたキャッシュにより、構成マネージャーではなく、周りの他の方法)が突然、構成マネージャーの独自のキャッシュをフラッシュ?上位キャッシュの構造が存在する場合でも、その構造が何であるかさえも知りません。
Mehrdad

1
@Scott方法があります。APIは既にリンクされています。任意のWin32関数を呼び出すためのGUIを提供するツールがあります。事は...それは実装の詳細です。あなたがそれを公開すると、人々はそれを頼りにし、それからあなたはそれを変更することはできません。また、システムディスクはリムーバブルメディアとはまったく異なるものであることにも注意してください。システムディスクは、ハンドルを常に開いておく必要がある多くのこと(ページファイルなど)に使用されます。Windowsはシステムパーティションのアンマウントをサポートしていないため、この「機能」は必要ありません。さらに...コメントを中立に保つようにしてください。あなたはWindowsが嫌いです。
基本的な

14

TL; DR:適切なタイミングでこれを行うことは非常に慎重です。

上のドキュメントにFSCTL_MARK_AS_SYSTEM_HIVEは次のように書かれています:

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

これ以上詳細が公開されているとは思わない。

レジストリはファイルシステムでキャッシュを実行できるため、ファイルシステムのフラッシュはレジストリのフラッシュを意味しないことに注意してください。最初にレジストリをフラッシュするには、何らかの方法で目的のキーを呼び出すか、呼び出す必要があります。NtFlushKeyZwFlushKey


いいね!それが私の新しいお気に入りのMSDN-ism:ちょうどいい瞬間です。私の以前のお気に入りだった「UNIONを含むクエリでTOP句、UNION ALLを指定する場合を除き、ご注意ください、またはINTERSECT演算子。クエリ書き込むことが可能である予期しない結果を返しますが、」この機能」のための婉曲表現だったですひどく壊れており、合理的な人が期待することを行わず、それを修正する代わりに文書化します」。
-davidbak

@davidbak:笑、MSDNの弁護では、ユーザーが依存するべき詳細を提供できるかどうかはわかりません。
Mehrdad

ああ、あなたは正しい。明らかに、これは、MicrosoftがすべてのAPIを文書化することを要求されていた長年のEU和解のフォールアウトとして文書化されたものでした-それらがどれほど内部的であっても。あなたがリンクしたこのページは、「カーネルレベルのコンポーネントのみがこのファイルシステム制御コードを使用できる」とさえ言っており、これは手を離さないための強力なヒントです。それでも、「ちょうどいいタイミング」-いつか「ちょうどいいタイミングでこのメソッドを呼び出す」と私のAPIを文書化して何が起こるか見て
みましょう。...-davidbak

@davidbak:あなたは少し...興奮していると思います。:-P私の推測では、これはファイルレジストリにシステムレジストリハイブを含むファイルを知らせるために文書化されたものです。ディスクにフラッシュされています。しかし、私はこれの証拠を持っていません。それが考えられる理由の1つにすぎません。ただし、ディスクドライバーがこれを知る必要がないのは、私が疑問に思っていることです。
Mehrdad
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.