NTFS文件系统MFT属性
从上一节可以知道,MFT中的每一项从38开始到最后的1023(从0开始)地址为MFT项的属性.
MFT每项中的属性按使用可分为常驻属性和非常驻属性。由于属性的千差成别,所有属性的结构部分相同,和MFT项类似,属性的前16个字节结构是相同的,16个字节之后因属性不同而不同。
常规属性类型
常用的属性类型如下,其可含有常驻和非常驻属性。
常驻属性类型 | MFT属性名 | 描述 |
---|---|---|
10 | $STANDARD_IFORMATION | 标准属性,包含文件的基本属性,只读 创建时间、最后访问时间等属性。 |
20 | $ATTRIBUTE_LIST | 属性列表 |
30 | $FILE_NAME |
文件名属性(UNICODE编码) |
40 | $OBJECT_ID | 对象ID属性,文件或目录的16字节唯一标志 |
50 | $SECURITY_DESCRIPTOR | 安全描述符属性,文件的访问控制安全属性 |
60 | $VOLUME_NAME | 卷名属性 |
70 | $VOLUME_INFORMATION | 卷信息属性 |
80 | $DATA |
文件的数据属性 |
90 | $INDEX_ROOT |
索引根属性 |
A0 | $INDEX_ALLOCATION |
是90属性的扩展版(90属性只能在MFT内记录文件列表,A0属性将文件列表记录到数据区可以记录更多的文件) |
B0 | $BITMAP | 位图属性 |
C0 | $REPARSE_POINT | 重解析点属性 |
D0 | $EA_INFORMATION | 扩展属性信息 |
E0 | $EA 扩展属性 | |
100 | $LOGGED_UTILITY_STREAM EFS加密属性 |
其中标记的为比较重要的。
常驻属性结构头
常驻属性拥有共同的属性头,如下表:
字节偏移 | 字节数 | 含义 |
---|---|---|
00~03 | 4 | 属性类型 |
04~07 | 4 | 属性的长度字节数,包括属性头 |
08~08 | 1 | 是否为常驻属性标志00-常驻01-非常驻 |
09~09 | 1 | 属性名长度,没有属性名为0 |
0A~0B | 2 | 属性名位置偏移 |
0C~0D | 2 | 标志(0表示非压缩、加密、稀蔬 |
0E~0F | 2 | 属性ID标识 |
10~13 | 4 | 属性内容大小(不包括属性头) |
14~15 | 2 | 属必内容相对于本属性头起始位置的偏移,也即属性头的长度 |
16~16 | 1 | 索引标志 |
17~17 | 1 | 保留未用 |
非常驻属性
非常驻属性因为在存储的是可增长的数据流,故它的属性头与常驻属性的0x10偏移地址后不同。
字节偏移 | 字节数 | 含义 |
---|---|---|
00~03 | 4 | 属性类型 |
04~07 | 4 | 属性的长度字节数,包括属性头 |
08~08 | 1 | 是否为常驻属性标志00-常驻01-非常驻 |
09~09 | 1 | 属性名长度,没有属性名为0 |
0A~0B | 2 | 属性名位置偏移 |
0C~0D | 2 | 标志(0表示非压缩、加密、稀蔬 |
0E~0F | 2 | 属性ID标识 |
10~17 | 8 | 簇流的起始VCN(虚拟簇号:Virtual Cluster Number) |
18~1F | 8 | 簇流的结束VCN |
20~21 | 2 | 簇流列表相对于本属性头起始处的偏移 |
22~23 | 2 | 压缩单位大小 |
24~27 | 4 | 未用 |
28~2F | 8 | 为属性内容分配的空间大小的字节数,是簇的整数倍 |
30~37 | 8 | 该属性的内容实际占用字节数,即属性的实际有效大小 |
38~3F | 8 | 属性内容初始大小 |
属性内容
我们在里可以看到,不同的属性内容大小不同。
那么属性内容是怎么存储的呢?这里使用以下规则:
- 常驻属性由于内容大小固定,故存储在MFT的项中。
- 非常驻属性存储在用户数据区中,但在MFT的项中记录着的它簇的起始地址,结束地址和实际内容的大小。
簇流
在非常驻性性中有一个名词叫簇流。簇流就是一组连续的扇区,簇流的内容包括1个或多个流项,流项的内容包括起始簇号和流长度。
我们知道文件存储时有时会跨簇进行存储,即文件的内容在磁盘中存储不连续,簇流就是用于记录这些不连续的流空间的。
我们可以假设一个文件存储在簇号91,92,93,95,96,98,99这些簇中,那么簇流中就应该有3项流项,第一部分描述流项的起始地址为91,长度为3;第二项的起始地址为95,长度为2;第三部分的起始地址为98,长度为2.
VCN(虚拟簇号)和LCN(逻辑簇号)区别
NTFS文件系统在描述某一簇时使用虚拟簇号和逻辑簇号来表示。VCN我们可以认为是文件内部的编号,从0开始,而LCN逻辑簇号是从全文件虚拟开始进行编号,也是从0开始。VCN是局部的,LCN是全局的。
VCN的意义
由于文件系统内部使用的是VCN,故在使用时需先将VCN转化成LCN来进行寻址。那么VCN到底有什么意义了?其实是这样的,当一个文件和属性碎片化和严重时,这时一个MFT项无法容纳下它的簇流列表,故需要再次给其分配相同的MFT项,而MFT项中有簇流需要有先后顺序,这时VCN就派上用场了(小的当然在前了,大的在后),而LCN就无法确定其先后顺序。