Windows文件系统-NTFS文件系统

Windows作为最流行的个人计算机操作系统,成为了我们学习、工作和生活的一部分。我们几乎每天都会经历打开文件管理器,进入具体磁盘,打开具体文件,而Windows采用文件系统管理着所有的文件和磁盘空间,这个文件系统就是NTFS。

 

NTFS文件系统

文档主要分为两大部分:

1.NTFS文件系统简介

2.文件磁盘位置计算

 

NTFS文件系统简介

NTFS(New Technology File System)是微软1993年推出的用于Windows系统的文件系统,用于代替原来的FAT文件系统,从而提高性能。NTFS自推出以来经历了多个版本的更新,更新历史如下:

Windows文件系统-NTFS文件系统

可见2001年发行3.1版本后,NTFS就再没有更新过了。

 

NTFS数据结构

一个NTFS分区的结构如下图所示:

Windows文件系统-NTFS文件系统

整个分区主要分为三大区域:

1.VBR(Volume Boot Record):非常重要,存储跟引导相关的数据,大小为16个扇区;

2.文件区域:在NTFS的概念里,一切皆为文件,包括元数据文件、常规文件、目录、一切的一切都是文件;

3.BBS(Backup Boot Sector):分区的第一个扇区是分区引导记录,是能否引导系统的关键,所以NTFS用分区的最后一个扇区备份第一个扇区,用于修复损坏的第一个扇区。

 

文件

文件可分为三种类型:元数据文件、常规文件和目录。

元数据文件

任何文件系统都会有元数据用于描述文件信息,信息有如名称、大小、修改时间、存放位置等等,注意的是NTFS元数据也用文件表示,总有16个元数据文件,这些文件的名称都是以$开头,属于隐藏文件。

Windows文件系统-NTFS文件系统

 

查看这些文件:

Windows文件系统-NTFS文件系统

 

MFT(Master File Table)

非常重要的文件,包含了所有文件的元数据,定位文件必须要经过$MFT文件。MFT由一个个文件记录组成,一个文件至少占用一个记录,$MFT文件占用第一个记录。

MFT文件记录(固定大小为1KB)由记录头部和属性组成,记录头部大小为42或48字节,3.1版本之前是42字节,之后是48字节。记录头部数据结构定义如下:

Windows文件系统-NTFS文件系统

文件记录属性分为常驻属性和非常驻属性,常驻属性代表属性的全部内容在文件记录中,非常驻属性代表属性内容超过了文件记录的大小,需要另外开辟空间存储,例如文件内容比较大。

文件记录头部中标明了第一个属性的偏移量,NTFS支持的属性定义在$AttrDef中,每个属性有唯一标识ID,常见的ID有:

Windows文件系统-NTFS文件系统

文件内容

文件内容由属性$DATA描述,由于文件记录的大小固定为1KB,记录头占了48字节,所以留给文件存放内容的空间不会超过976字节。如果文件内容比较少,则全部存在文件记录中,否则另外开辟extents存储。开辟的extents以族为单位,NTFS基本分配单位是族,族大小为4KB。

 

文件磁盘位置计算

借助微软公司提供的工具fsutil可计算出文件的数据分布范围,根据文件的大小,可分为两种情况。

小文件

小文件指的是文件内容可容纳在文件记录中,不用开辟extents存放,也是最不方便计算的情况。

第一步:

获取$MFT文件的磁盘分布范围,方式如下:

Windows文件系统-NTFS文件系统

指令为:fsutil file queryextents 文件路径

输出结果(结果可能为多行,代表文件存放位置不连续):

VCN:虚拟族编号,相对于文件内部的偏移量,单位为族;

:该extent大小,单位为族;

LCN:逻辑族编号,extent相对于分区的偏移量,单位为族。

这样就可以知道$MFT文件在分区的0xc0000(10进制为786432)族(大小4096)处,换算为字节为786432  4096=3221225472,文件大小为0x1640(10进制为5696)族,换算为字节为5696  4096 = 23330816。

 

第二步:

获取文件在$MFT文件的位置,文件参考编号的低4字节就是文件在$MFT文件的位置,求文件参考编号的方法如下:

Windows文件系统-NTFS文件系统

通过fsutil volume filelayout 文件路径 可获取到文件参考编号,0x0007000000005206的低4字节为0x5206,也就是说E:\12.txt的文件记录位于$MFT的第0x5206(10进制为20998)个记录处。

一个文件记录固定为1KB,那么E:\12.txt的文件记录则位于 20998 * 1024 = 21501952 = 0x1481800。

用FTK看看$MFT的0x1481800处是什么内容:

Windows文件系统-NTFS文件系统

字符“FIFE”代表是一个文件记录,第二个紫框表明文件名匹配,第三个紫框是文件内容“helios89”,看看12.txt的内容:

Windows文件系统-NTFS文件系统

可见计算得到的E:\12.txt在$MFT的位置是正确的,知道了$MFT在分区的分布范围,也知道了E:\12.txt在$MFT的位置,通过简单的计算便可知道E:\12.txt在分区的分布范围了。

大文件

大文件指的是文件记录容纳不下文件的内容,需要开辟extents存放,这种文件是最容易计算其数据分布范围的,参考小文件计算的第一步。

分区偏移量

上面的计算结果得到的是文件在分区的偏移量,需要加上分区偏移量才是磁盘的偏移量。分区偏移量可通过FTK软件查看。

方法如下:

选择【File】->【add Evidence Item..】,弹框如下:

Windows文件系统-NTFS文件系统

选择【Physical Drive】【下一步】选择磁盘,点击完成。

在【View】中选择【Properties】显示出属性框

在左侧的【Evidence Tree】中选择一个分区,在属性框中便可查看到分区的偏移量(单位扇区)了,如下图所示:

Windows文件系统-NTFS文件系统

 

结束语

Windows作为最流行的个人计算机操作系统,也证明了NTFS文件系统的强大和稳定。本文档只是对NTFS进行了简单的介绍,还有更多的技术原理值得我们继续研究,让我们继续前进吧。

Windows文件系统-NTFS文件系统

上一篇:Windows共享可能出现的问题以及Linux访问Windows共享的方式


下一篇:【译】.NET 5. 0 中 Windows Form 的新特性