Windows 何时将注册表更改写入磁盘?

Windows 何时将注册表更改写入磁盘?

总结:

我注意到,如果我更改注册表,然后硬关闭我的 Windows 10 系统,则重新启动后注册表更改不会出现。

我还注意到,删除休眠文件会影响 Linux 恢复工具在离线状态下更改 Windows 注册表的能力。删除休眠文件后,该工具似乎无法进行持久更改。我将在下面列出具体示例。

示例 1:

  • 我在“HKLM\SOFTWARE”中添加了一个名为“1111”的键。然后我按住电源按钮 5 秒钟,强制关闭我的盒子。
  • 测试密钥
  • 当我重新拉回注册表时,该项及其值都消失了:
  • 测试密钥丢失
  • (这些图片因格式问题已被编辑)

示例 2

  • 更改注册表(使用 regedit)
  • 使系统休眠
  • 启动 Linux 恢复工具
  • 删除休眠文件以便挂载磁盘。
  • 读取 Windows 注册表(来自恢复工具)
  • 注册表更改已消失。

这看起来相当于对盒子进行硬关闭。

示例 3:

我懂了陌生人当我:

  • 休眠盒子
  • 启动 Linux 恢复工具并删除休眠文件
  • 更改注册表(从恢复工具)
  • 重启盒子

这些更改也没有反映在注册表中。

那么这里发生了什么事?

  • Windows 10 何时将注册表更改写入磁盘?
  • 为什么删除休眠文件(示例 3)会导致恢复工具所做的注册表更改无法在下次启动时反映出来?

希望得到一些澄清!

答案1

据记载MSDN 页面RegFlushKey

呼唤注册表刷新键是一项昂贵的操作,它会严重影响整个系统的性能,因为它会消耗磁盘带宽并阻止所有进程对正在刷新的注册表配置单元中的所有键进行修改,直到刷新操作完成。注册表刷新键仅当应用程序必须保证注册表更改在修改后立即保存到磁盘时才应显式调用。对键所做的所有修改对其他进程都是可见的,无需将其刷新到磁盘。

另外,注册表具有“延迟刷新”机制,该机制会定期将注册表修改刷新到磁盘。除了此定期刷新操作外,注册表更改也会在系统关闭时刷新到磁盘。允许“延迟刷新”刷新注册表更改是管理注册表写入磁盘上的注册表存储的最有效方法。

这表明除了将特定键刷新到磁盘之外立即地(这会将其他所有人锁定在注册表之外,直到刷新完成),注册表会定期自动刷新:没有给出时间,但大概至少比您在写入密钥和硬关机之间等待的时间要长。此外,正如您已经知道的那样,它会在关机时刷新。

RegFlushKey如果这对您的使用情况至关重要,您可以使用软件中操作所述密钥的功能,或者使用它创建一个附加工具来强制立即将注册表项写入磁盘。

现已不复存在的“在 Windows 8 或 Windows Server 2012 上保存应用程序注册表更改”Microsoft 支持文章(archive.org 链接在此处)指出以下内容:

为了最大限度地提高性能,Windows 8 和 Windows Server 2012 中的注册表更新不会立即刷新到磁盘。相反,注册表会定期将修改后的注册表数据刷新到磁盘。此外,系统关闭时,修改后的注册表数据会保存到磁盘。在大多数情况下,这些机制足以确保注册表修改安全地到达磁盘。

由于注册表更改不会立即刷新到磁盘,因此,如果应用程序修改注册表后机器立即断电,则应用程序的注册表更改可能不会被保存。如果发生这种情况,应用程序可能会在系统重新启动时观察到以下影响:

  • 应用程序所做的注册表更改可能不可见
  • 新安装的驱动程序可能不再显示已安装,需要重新安装
  • 新卸载的驱动程序仍会安装,需要再次卸载

应用程序或安装程序可以使用 RegFlushKey API 请求将其注册表修改立即写入磁盘。但是,调用 RegFlushKey 是一项昂贵的操作,会严重影响系统范围的性能。应用程序和安装程序只有在必须保证其注册表修改立即保存到磁盘时才应调用此 API。

此外,摘录自Mokubai 的回应

系统休眠时,可能会有几个关键文件系统结构未写入磁盘,而是存储在 RAM 中。系统从休眠状态恢复时,会认为磁盘处于非常特殊的状态,磁盘缓存和重要系统文件可能会保存到休眠文件而不是实际磁盘中……

链接 How To Geek 文章该回复非常有启发性:

快速启动将传统关机过程与休眠相结合。启用快速启动后,Windows 10 会丢弃所有打开的程序和文件(就像在传统关机过程中一样),但会将 Windows 内核的状态保存到磁盘(就像在休眠过程中一样)。下次启动 PC 时,Windows 会恢复内核并启动系统的其余部分。

在快速启动/混合关机和刷新键延迟之间,大部分问题都解决了。如果系统设法将修改存储在内存中但尚未刷新到磁盘,那么它将在混合关机时保存在休眠文件中,或者在硬关机时被丢弃。如果恢复工具丢弃了休眠文件,那么更改也将不复存在。

答案2

TL;DR:正确关闭您的系统。


休眠与关机无关,它与挂起到 RAM(睡眠)密切相关,不同之处在于,RAM 的内容被推送到磁盘,以便重新读入并从系统停止的位置恢复运行。

如果您希望更改保留,则需要禁用休眠模式Windows Fastboot(休眠的一个子集)。或者你也可以重启而不是休眠然后重新启动。

更改未持久化的原因是它们尚未写入磁盘除了在休眠文件中。您正在删除该文件,这意味着文件系统可能必须自行修复并返回到“上次已知的良好”状态。

系统处于休眠状态时,可能会有几个关键文件系统结构未写入磁盘,而是存储在 RAM 中。系统从休眠状态恢复时,会认为磁盘处于非常特殊的状态,磁盘缓存和重要系统文件可能会保存到休眠文件而不是实际磁盘中。

如果你做了正确关闭然后 Windows 将正确地将工作内存刷新到磁盘,然后在关机前干净地卸载磁盘。

要强制正确关机,请打开命令提示符并输入

shutdown /s /f /t 0

/s是“关机”,/f强制,/t 0表示“现在”(时间 = 0 秒)

或者您可以禁用快速启动和休眠模式。

阅读更多HowtoGeek:关机无法完全关闭 Windows 10(但重启可以)


与您执行硬关机相关的问题是,Windows 不能保证在您进行更改的同一毫秒(甚至一分钟)内将任何更改写入磁盘。它几乎肯定会在几毫秒内写入分钟但随着时间的推移,它被真正写出来的可能性会增加。那么它不太可能立即被写出来靠近当你做出改变的时候,可能性会急剧增加,而且几乎肯定会在一小时内写完。

但问题是,强制硬关机会导致系统没有机会安全地将更改写入磁盘。

大多数现代文件系统都以尽可能安全的方式进行更改。过去,它们被称为“原子”,因为更改要么发生,要么没有发生。

今天我们称之为日志文件系统因为他们会记录操作将要发生系统故障并重新启动时,可以恢复或向前滚动。从电源故障启动时,系统会检查日志,并针对每个事务检查实际文件数据是否已写入磁盘并且“完好”。如果是,则事务向前滚动并完成,如果不是,则回滚到旧数据。

通过使用此顺序,磁盘几乎总是处于易于修复的状态。

但是,通过强制系统意外关闭电源,您无法保证事务是否已经进展到足以在修复后向前回滚的程度,并且 Linux 等操作系统可能不会像 Windows 那样关心事务历史记录,并且更有可能只是做出使所有内容向后回滚而不是向前回滚的更改。

如果您重新启动 Windows,它可能会尝试或能够正确修复磁盘,因为它对文件系统有更深入的了解。

答案3

TL;DR:是的非常小心地做这件事在正确的时刻

文档FSCTL_MARK_AS_SYSTEM_HIVE有话要说:

控制FSCTL_MARK_AS_SYSTEM_HIVE代码通知文件系统指定的文件包含注册表的系统配置单元。文件系统必须刷新系统配置单元数据到磁盘时机已到以避免死锁并确保数据完整性。

我认为没有比这更详细的公开信息了。

请记住,冲洗文件系统并不意味着冲洗注册表,因为注册表可以执行缓存顶部文件系统。要首先刷新注册表,您需要以某种方式触发NtFlushKeyZwFlushKey调用您感兴趣的密钥。

相关内容