转自http://blog.csdn.net/yc0188/article/details/812578
走近文件系统系列二:探索Dirty Bit的奥秘
在微软知识库文章KB322275上看到如下的一段话:
The "dirty" bit is a bit in the boot sector (for FAT or FAT32 volumes), or in the MFT (for NTFS volumes), that is checked when Windows starts.
这说明,在FAT文件系统里,Dirty Bit在分区的引导扇区(Boot Sector)中指定;而在NTFS文件系统里,则是在MFT中指定(实际上是$Volume元数据文件)。
作为一名IT Pro,自然不仅仅满足于知道以上的结论。本着“绝知此事要躬行”的精神,本文介绍如何通过工具,找出在$Volume元数据文件中的哪个地方定义了这个Dirty Bit。
名词解释
什么是Dirty Bit?它实际上是文件系统的一个错误状态位,Windows启动时会根据这个状态位来判断文件系统是否出了故障,以确定是否要运行Chkdsk /F来进行磁盘修复。
行为差别
很多用户发现,同样是非法关机,重启时有些系统会自动进行磁盘检测(通常是FAT文件系统),而有些系统则照常启动(通常是NTFS文件系统)。
为什么?
原来不同的文件系统,对于Dirty Bit的设置方法有所区别,这种区别可以套用法律术语来类比:
(1) FAT相当于大陆法体系,实行的是“有罪推定”。在写入数据前,首先假设文件系统是“有罪”的──设置Dirty Bit为1。只有确认数据操作完成以后,才将Dirty Bit设置为0,如果非法关机时,Dirty Bit可能还保留为1,则下次开机会自动进行磁盘扫描。
(2) NTFS相当于英美法体系,实现的是“无罪推定”。只有出现严重的数据不一致,同时无法根据日志功能进行修复,这时候才会将Dirty Bit设置为1。
实验过程
1.工具箱
(1) Winhex:本文将用该工具查看、修改$Volume元数据文件。
下载地址:http://www.x-ways.net/winhex/index-m.html
(2) Fsutil:该命令行工具可以对文件系统进行全方位的管理,本文将用该工具管理NTFS文件系统的Dirty Bit设置,然后借助WinHex来获知磁盘数据的底层信息。
Windows XP/2003自带,对于Windows 2000,可以直接借用XP下的工具。
2.实验步骤
由于Windows对NTFS的元数据文件进行保护,所以我们无法直接在Windows系统里访问$Volume,但是我们可以借助第三方磁盘工具Winhex绕开这个系统限制,来达到目的。
在这个实验里,我们借助Winhex访问NTFS卷的$Volume文件,以确认Dirty Bit到底对应$Volume文件的哪个地方。
(1) 用Winhex打开任意一个卷,例如D盘,即可看到D盘里的所有元数据文件,例如$MFT、$MFTMirr、$Volume等文件。双击其中的$Volume即可打开该文件。
(2) 大家知道,每个NTFS文件都是由若干属性所组成。$Volume 文件具有两个独有的属性,$VOLUME_NAME和$VOLUME_INFORMATION。其中卷标是由$VOLUME_NAME定义,而Dirty bit则是由$VOLUME_INFORMATION属性所定义的。$VOLUME_INFORMATION属性如下图所示,开头的值70H表示该属性的类别,offset 4的值28H定义该属性的长度,相当于十进制的40。
(3) 为了清楚的标识$VOLUME_INFORMATION属性,现将该属性单独截图如下。第三方最左侧的两个字节(offset为32-33)定义了NTFS文件系统的版本号,本例中的值为03 01,代表NTFS 3.1版(Windows XP是3.1版本,而Windows 2000则是3.0)。
(4) 为了找出Dirty Bit到底在哪里,我们可以借助Fsutil命令人为地制造一个Dirty Bit。在命令提示符下运行以下命令:
Fsutil dirty set D:
刷新Winhex的视图,可以看到$VOLUME_INFORMATION属性的值出现了变化,如下图所示。
可以得出这样的猜想:offset 34的字节定义了NTFS文件系统的Dirty Bit设置情况,当该值为01时,代表NTFS文件系统设置了Dirty Bit。
3.逆向验证
为了证实这个结果,需要进行逆向验证。可以将$VOLUME_INFORMATION属性中Offset 34字节的值直接修改为01,看看是否相当于设置Dirty Bit的状态位。
(1) 直接在Winhex里修改Offset 34字节的值,将其设置为01,同时保存所做的设置。
(2) 然后在命令提示符下运行以下命令,查看Dirty Bit的设置状态:
Fsutil dirty query D:
出乎意料的是,命令查询的结果是“卷 - D: 没有损坏”,也就是说Fsutil命令并不认为文件系统设置了Dirty Bit。
(3) 单击开始→关闭计算机→重新启动,发现系统开始自动扫描。看来尽管Fsutil命令并没有认可我们的手动设置,但是实际还是生效的。
4.疑难解答
(1) 为什么Fsutil命令无法查询手动设置Dirty Bit?
可能的答案是,在系统Mount分区的时候,先将重要的元数据文件(包括$Volume)读到内存里,而Fsutil命令会从内存里(而不是磁盘里)读取Dirty Bit的设置情况。手动修改$Volume后,系统并没有重新将新的$Volume读入内存,所以Fsutil命令无法查询Dirty Bit的设置情况。
(2) 如何才能迫使系统重新读入元数据文件?
可以尝试在“磁盘管理”管理单元里删除该卷的盘符(本例为D:),然后重新恢复盘符。设置以后,Fsutil命令果然可以正确读取Dirty Bit的状态了。
(3) 手动设置Dirty Bit,重启系统后会自动运行Chkdsk /F,为什么会提示元数据文件$MFTMirr错误?
$MFTMirr保存着$MFT中前面四个文件记录,其中包括$Volume。前面的实验过程并没有同步修改$MFTMirr中的$Volume,导致两者记录不一致。
实用价值
当然,本文提到手动设置Dirty Bit的方法只是为了实验验证,并没有真正的应用价值,我们没有必要采用这种方法进行手动设置。
明明是正常关机,但是每次开机时会自动询问是否扫描磁盘。遇到这种问题,可以按照以下步骤进行处理(参考KB160963):
(1) 运行Fsutil dirty query DriveLetter命令,检查该磁盘是否设置了Dirty Bit。如果是的话,可能是硬盘本身的问题,请联系硬盘厂商或者计算机经销商进行检测。
如果需要防止系统自动检测标记Dirty Bit的卷,可以运行以下命令进行排除:
chkntfs /x DriveLetter
(2) 检查任务计划、启动项里有没有相应的加载项,有的话删除即可。
(3) 打开注册表编辑器,进入以下注册表项:
HKEY_LOCAL_MACHINE/SYSTEM/CURRENTCONTROLSET/CONTROL/Session Manager
检查其下的多字符串键值BootExecute,是否为类似以下的数值数据:
autocheck autochk /r /??/D:
如果是的话,删除其中/r /??/D:即可。
提示
在NTFS文件系统里,有一句很著名的话“everything on the disk is a file”,所有的文件系统数据,都是文件,包括MFT、引导扇区、甚至还有安全描述符等。
关于NTFS文件系统的元数据文件的描述,可以参考以下的微软官方文档:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/library/TechRef/8cc5891d-bf8e-4164-862d-dac5418c5948.mspx
相关推荐
### Linux 文件系统详解 #### 引言 近年来,随着计算机技术的飞速发展,Linux操作系统以其卓越的性能、高可靠性及高安全性,在全球范围内获得了广泛的认可和支持。它不仅是一款功能强大的操作系统,更因其开放源...
此外,系统读取文件时,文件所在区块的数据会被加载至内存缓冲区,若数据被修改,只有内存中的数据标记为“Dirty”,直到系统同步回写至磁盘,以保持数据一致性。 ##### 3. Superblock Superblock位于文件系统的...
当文件系统挂载时,超级块(superblock)被加载到内存,并被标记为“脏”(dirty),表示有未写回磁盘的改动。任何对超级块的更改首先修改内存中的副本,然后在执行`sync`系统调用时更新磁盘上的超级块。当文件系统...
3. **理论拓展**:探索脏纸编码与其他编码技术的结合,比如纠错码、交织技术等,以提高整个系统的鲁棒性和灵活性。 综上所述,“Writing on dirty paper”不仅是一项具有创新性的理论工作,而且在实际应用中也具有...
包括使用 chkchk utility、使用 SFC 命令、转换文件系统等方法,并提供了一些知识扩展,例如如何检查磁盘错误、如何转换文件系统、如何防止系统自动检测标记 Dirty Bit 等。 一、chkchk utility 解决方法 chkchk ...
这个文件是为那些有兴趣在 Kaggle 数据科学竞赛中使用 MATLAB 的人创建的,称为去噪脏文档。 具体来说,它包含一个有用的功能,用于将图像数据转换为提交所需的 csv 格式。 有关比赛的更多信息,包括提交文件协议,...
在"webrtc-streamer-v0.8.1-dirty-Windows-AMD64-Release.zip"这个压缩包中,我们看到的是一个针对Windows操作系统,AMD64架构的WebRTC流媒体服务器的发行版本。 WebRTC-Streamer是基于WebRTC的开源项目,它提供了...
这个文件可能包含一系列的字体文件,如TrueType (.ttf)、OpenType (.otf)或其他格式,供设计师或者开发者在项目中使用。在IT领域,压缩文件常用于存储和传输大量数据,以减少文件大小和提高效率。 在处理字体时,...
数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2992 标注数量(xml文件个数):2992 标注数量(txt文件个数):...
在计算机系统中,缓存(Cache)是一种用于提高数据访问速度的技术。它通过存储最近频繁使用的数据,减少了处理器等待主存响应的时间。本单元测试主要涉及了Cache的替换算法和写策略,这些都是优化计算机性能的关键...
Dirty Ames
操作系统原理期末试卷主要涵盖操作系统的基础概念、内存管理、进程管理和文件系统等方面的知识点。以下是根据题目内容解析的一些关键知识点: 1. **逻辑地址、线性地址、物理地址**: - 逻辑地址是程序在执行时...
Android 脏墙 [d3.ru] ( ) 博客的 Android 客户端。 谷歌播放链接: : 依赖关系 [Android 网络基础] ( ) [博客适配器] ( ) [面包块] ( )
标题“dirty_liar”似乎与一个特定的字体或者设计元素有关,可能是一个字体库或设计项目的名称。在IT行业中,字体扮演着至关重要的角色,它不仅用于文本的呈现,还在用户体验、品牌识别以及视觉传达中起到关键作用。...
gocryptfs 是一个使用 Go 开发的,加密的覆盖文件系统。gocryptfs 基于 go-fuse FUSE 库和其 LoopbackFileSystem API 构建。gocryptfs 灵感来源于 EncFS,修复了其安全问题,提供更好的性能。gocryptfs 当前只支持 ...
Dirty Cow允许低权限的用户通过一种特定的方式来提升他们的权限,甚至获取root权限,从而对系统造成严重威胁。 1. **环境部署**: 在复现Dirty Cow漏洞之前,你需要设置一个合适的实验环境。这通常包括一个主机...
在Unity3d特效插件“Dirty Lens Effect”中,开发者通常会提供一系列预设参数供用户调整,以适应不同的场景需求。这些参数可能包括: - **污点分布**:控制污点在屏幕上的位置和密度。 - **划痕数量和深度**:添加...
安装npm install dirty-chai --save-dev用法dirty-chai是一个chai。 var chai = require ( 'chai' ) ;var dirtyChai = require ( 'dirty-chai' ) ;var expect = chai . expectchai . use ( dirtyChai ) ;// ......
《PyPI官网下载:ddu_dirty_mnist-1.0.1.tar.gz——探索Python库的奥秘》 PyPI(Python Package Index)是Python开发者的重要资源库,它提供了丰富的Python软件包,使得开发者能够方便地下载、安装和分享代码。在本...