脏位(Dirty Bit)是计算机系统中的一个二进制位,用于表示存储段中的数据是否已经被系统硬件修改过。脏位的值可以是 0 或 1,其中 0 表示数据未修改,1 表示数据已修改。
脏位在计算机系统中具有重要的作用,例如:
- 用于追踪数据的修改状态,以便在系统崩溃时进行数据恢复。
- 用于控制数据的写入,以提高系统性能。
在 Windows 系统中,脏位机制由 NTFS 文件系统负责实现。举个例子,如果内存中运行的页面已经被修改但尚未保存到存储设备中,那么脏位的值将被设置为 1。这个设计的目的是让操作系统或检查脏位的应用程序知道,该页面的最终版本尚未永久保存。一旦页面被成功保存,脏位的值将重新变回 0。
在实际使用中,用户有时可能会遇到与脏位相关的错误或问题。因此,本文将深入介绍脏位的概念,包括如何检查脏位的状态以及如何设置或清除脏位的值,以帮助你更全面地理解脏位在 Windows 系统中的作用。
什么是 NTFS 脏位机制
如前所述,脏位是系统内存中的一个二进制位,属于文件系统的元数据,是 NTFS 文件系统特有的功能。用于向其他应用程序、进程或需要查询此位的组件传达一个存储段的数据是否被系统硬件修改过的信息。
NTFS 文件系统的脏位机制通过页面级的脏页位图追踪修改,实现了高效的数据写入与系统崩溃一致性。脏页位图为每个文件单独维护,若一个文件频繁修改,不会干扰其他文件的数据写入。
NTFS 脏位机制的工作原理如下:
- 当某个页面被修改时,相应的脏页位图会标记为 1。
- NTFS 的后台线程会定期检查脏页位图,将那些设置了脏位的页写入磁盘,并清除其脏位,即刷脏操作。
- 在意外断电情况下,NTFS 可以通过扫描脏页位图找到那些设置了脏位的页,只需写入这些部分丢失的数据,加速恢复过程。
- 类似地,文件的元数据,如 MFT,也采用脏位机制,以追踪元数据的修改。
- NTFS 的脏位机制提升了效率,只刷新真正被修改的页,同时增强了数据的完整性保障。
当脏位的值为 0 时,表示它被「清除」;而当值为 1 时,表示脏位被「设置」了。通常情况下,Windows 系统会自动调节脏位的值,但在某些情况下,需要手动干预以完成特定的任务,例如:
- 当尝试进行磁盘碎片整理时,如果收到「无法使用优化」的提示,很可能是因为脏位被设置了。在这种情况下,必须首先清除脏位,然后才能进行驱动器的优化。
无法使用优化
- 此外,如果每次开机时系统都尝试执行磁盘检查,需要频繁按键跳过,很可能是由于脏位被设置而无法自动重置导致的。这时,需要手动将脏位的值设为 0,才能解决这一问题。
在 Windows 中检查卷的脏位状态
在 Windows 计算机上,每个存储段都有其相应的脏位。如果想要检查和确认某个卷是否包含脏位,可以通过「命令提示符」使用fsutil dirty
命令查询脏位并获取其值。以下是操作步骤:
1使用Windows + R
快捷键打开「运行」,输入cmd
,然后按下Ctrl + Shift + Enter
以管理员权限启动「命令提示符」。
2运行以下命令,将 [DriveLetter] 替换为要检查的驱动器盘符,以检查卷的脏位状态:
Fsutil dirty query [DriveLetter]:
在 Windows 中检查卷的脏位状态
如上图所示,所有分区的脏位返回结果都是「没有损坏」,说明脏位值为 0,即内存中的文件内容与磁盘上保存的一致。通过这种方式,可以方便地检查特定卷是否包含脏位。
在 Windows 中设置卷的脏位状态
你不仅可以在 Windows 中查询存储段的脏位状态,还可以将其值从 0 改为 1,即「设置」脏位。与清除或重置脏位相比,设置脏位的操作要简单得多。
以下是为某个分区卷设置脏位值的步骤:
1使用Windows + R
快捷键打开「运行」,输入cmd
,然后按下Ctrl + Shift + Enter
以管理员权限启动「命令提示符」。
2运行以下命令,将 [DriveLetter] 替换为要设置脏位的分区盘符:
fsutil dirty set [DriveLetter]:
3运行以下命令来确认脏位的值是否发生了变化:
fsutil dirty query [DriveLetter]:
在 Windows 中设置卷的脏位状态
如上图所示,脏位的值已经发生了变化,并被设置为 1,命令提示符返回了「卷 – D: 已损坏」。
如何移除和清理脏位
在执行一些任务时,比如对分区进行碎片整理或避免每次启动时都运行 CHKDSK,清除脏位就很有必要。前面我们已经介绍了如何在 Windows 中检查和设置脏位,现在来介绍如何清除它,即将其值从 1 改为 0。
如果是要避免每次启动都运行 CHKDSK 的情况,进行磁盘检查是清除脏位的一种方法。当然,这将需要一些时间,因为 CHKDSK 实用程序需要花费一些时间对存储进行深度扫描。
另外,也可以选择以下任一解决方案来清除脏位。我们建议根据你的具体情况和环境选择最适合的解决方案。
方法 1:通过格式化硬盘来重置脏位
一般而言,即使运行 CHKDSK 扫描也无法解决问题的话,可以通过格式化硬盘来重置脏位。
在执行格式化之前,请务必备份重要数据。你可以使用 Windows 系统映像备份完整数据,或者使用文件历史记录备份个人文件。
成功备份数据后,请按照以下步骤格式化硬盘:
1使用Windows + R
快捷键打开「运行」,执行diskmgmt.msc
打开「磁盘管理」控制台。
2在控制台的底部,右键单击想要格式化的硬盘,然后选择「格式化」。
格式化分区
3确保选择了「执行快速格式化」,然后点击「确定」。
执行快速格式化
4在确认提示时,再次点击「确定」。
确定执行格式化
5当格式化完成时,点击「确定」关闭对话框。
按照这些步骤操作后,脏位会被清理。当启动进入 Windows 时,就不会再反复提示 CHKDSK 扫描了。
方法 2:使用十六进制编辑器重设脏位
十六进制编辑器是一种能够修改和处理各种存储点的基本二进制数据的软件。虽然网上有很多十六进制编辑器可选,但只有少数几个能够写回十六进制数值。在这里,我们选择使用 WinHex。
在使用 WinHex 时,按照以下步骤来重置和清除特定驱动器的脏位值:
1打开 WinHex 官网并下载工具。
2下载完成后,解压文件并以管理员权限运行 WinHex 应用程序。
3在应用程序中,点击顶部菜单中的「工具」,然后选择「打开磁盘」。
使用 WinHex 打开磁盘
4选择目标磁盘并确认。
选择磁盘
5在 WinHex 中搜索十六进制数值80 00 00 00 18
:
- 如果找到
03 01 81 01
则改为03 01 80 00
- 如果找到
03 01 01 00
则改为03 01 00 00
编辑十六进制值
不同磁盘的脏位偏移地址可能不同,使用十六进制编辑器时应特别注意,确保按照正确的方式处理脏位值,以避免潜在的错误或数据损坏。
使用十六进制编辑器清除脏位对一些用户来说可能颇具挑战。如果你每次启动 Windows 时都遇到 CHKDSK 消息,也可以采用以下简单方法来绕过这个问题。
方法 3:使用 CHKNTFS 阻止磁盘检查
当脏位被设置时,一个常见的问题是每次启动 Windows 时都会弹出磁盘检查提示。如果你觉得方法 1 和 2 操作起来比较有风险,另一种绕过 CHKDSK 提示的方法是直接将其禁用。这可以通过 CHKNTFS 命令来实现。
CHKNTFS 用于控制 Windows 启动时是否显示或隐藏自动磁盘检查。要禁用磁盘检查,请按照以下步骤操作:
1使用Windows + R
快捷键打开「运行」,输入cmd
,然后按下Ctrl + Shift + Enter
以管理员权限启动「命令提示符」。
2运行以下命令,将 [DriveLetter] 替换为你启动分区的盘符。
chkntfs /x [DriveLetter]:
使用 CHKNTFS 阻止磁盘检查
如果你之前因为脏位问题在启动时反复看到 CHKDSK 的提示,不论其值如何,现在都不会再被打扰了。
这只是临时解决方法,在文件系统真正出现问题时,该方法可能会掩盖问题并延长故障排查时间。
就个人而言,我在使用 Windows 时从未因为脏位而遇到过任何问题。但有不同用户在不同场景下遇到了相关问题。通常情况下,用户不会直接与脏位打交道。但在故障排查时,又经常陷入一些棘手的情境,只能通过调整脏位的值来解决问题。
本文总结了如何检查脏位的状态,如何在 Windows 中设置脏位,并在需要时进行复位。这将帮助你更好地理解和处理一些疑难问题。希望本文对你的使用体验和故障排除有所帮助。