NTFS文件系统
# NTFS 文件系统
# 1. 概述
NTFS (New Technology File System),是 Windows NT 环境的文件系统。新技术文件系统是 Windows NT 家族(如,Windows 2000、Windows XP、Windows Vista、Windows 7 和 windows 8.1)等的限制级专用的文件系统(操作系统所在的盘符的文件系统必须格式化为 NTFS 的文件系统,4096 簇环境下)。NTFS 取代了老式的 FAT 文件系统。
NTFS 对 FAT 和 HPFS 作了若干改进,例如,支持元数据,并且使用了高级数据结构,以便于改善性能、可靠性和磁盘空间利用率,并提供了若干附加扩展功能。NTFS 文件系统拥有以下特点:
- 安全性高:NTFS 支持基于文件或目录的 ACL,并且支持加密文件系统(EFS)。
- 可恢复性:NTFS 支持基于原子事务概念的文件恢复,比较符合服务器文件系统的要求。
- 文件压缩:NTFS 支持基于文件或目录的文件压缩,可以很方便的节省磁盘空间。
- 磁盘配额:NTFS 支持磁盘配额,可针对系统中每个用户分配磁盘资源。
# 2. NTFS 文件系统的结构
当用户将硬盘的一个分区格式化为 NTFS 分区时,就建立了一个 NTFS 文件系统。NTFS 文件系统同 FAT32 文件系统一样,也是用“簇”为存储单位,一个文件总是占用一个或多个簇。
NTFS 文件系统使用逻辑簇号(LCN)和虚拟簇号(VCN)对分区进行管理。
- 逻辑簇号:既对分区内的第一个簇到最后一个簇进行编号,NTFS使用逻辑簇号对簇进行定位。
- 虚拟簇号:既将文件所占用的簇从开头到尾进行编号的,虚拟簇号不要求在物理上是连续的。
NTFS 文件系统一共由 16 个“元文件”构成,它们是在分区格式化时写入到硬盘的隐藏文件(以 ”$” 开头),也是 NTFS 文件系统的系统信息。
NTFS 的 16 个元文件介绍:
序号 | 元文件 | 功能 |
---|---|---|
0 | $MFT | 主文件表本身,是每个文件的索引 |
1 | $MFTMirr | 主文件表的部分镜像 |
2 | $LogFile | 事务型日志文件 |
3 | $Volume | 卷文件,记录卷标等信息 |
4 | $AttrDef | 属性定义列表文件 |
5 | $Root | 根目录文件,管理根目录 |
6 | $BitMap | 位图文件,记录了分区中簇的使用情况 |
7 | $Boot | 引导文件,记录了用于系统引导的数据情况 |
8 | $BadClue | 坏簇列表文件 |
9 | $Quota(NTFS4) | 在早期的 Windows NT 系统中此文件为磁盘配额信息 |
10 | $Secure | 安全文件 |
11 | $UpCase | 大小写字符转换表文件 |
12 | $Extend metadata directory | 扩展元数据目录 |
13 | $Extend$Reparse | 重解析点文件 |
14 | $Extend$UsnJrnl | 加密日志文件 |
15 | $Extend$Quota | 配额管理文件 |
16 | $Extend$ObjId | 对象ID文件 |
# 3. $MFT 元文件
在 NTFS 文件系统中,磁盘上的所有数据都是以文件的形式存储,其中包括元文件。
每个文件都有一个或多个文件记录,每个文件记录占用两个扇区,而 MFT 元文件就是专门记录每个文件的文件记录。
NTFS 文件系统是通过 MFT 元文件专门记录每个文件的文件记录。由于 NTFS 文件系统是通过 MFT 来确定文件在磁盘上的位置以及文件的属性,所以 MFT 是非常重要的,MFT 的起始位置在 DBR 中有描述。MFT 的文件记录在物理上是连续的,并且从0开始编号。MFT 的文件记录在物理上是连续的,并且从0开始编号。MFT 的前 16 个文件记录总是元文件的,并且顺序是固定不变的。
# 4. MFT 偏移地址计算
说明 | 数值 |
---|---|
MBR 开始扇区 | 63 |
每个扇区的字节总数 | 512 |
簇大小 | 8 |
每个 MFT 记录的簇数 | 1 |
MFT 的开始簇号 | 786432 |
- 每个 MFT 字节总数 = 簇大小 * 每个扇区内的字节总数 = 8 * 512 = 4096
- MBR 开始扇区字节总数 = MBR 起始扇区 * 每个扇区内的字节总数 = 63 * 512 = 32256
- MFT 的开始位置的字节总数 = MBR 开始扇区字节总数 + MFT 的开始簇号 * 每个 MFT 字节总数 = 32256 + 786432 * 4096 = 3221257728
- 将 3221257728 转换为十六进制,即得到 MFT 开始位置偏移地址 C0007E00
# 5. 遍历分区文件列表的思路
- 定位 DBR,通过 DBR 可得到 “$MFT” 的起始簇号及簇大小; 2. 定位并找到 “MFT” 后,在其中寻找根目录的文件记录,一般在5号文件记录; 3. 在 90H 属性中得到 B+ 树索引的根节点文件信息,重点在 A0 属性上。通过属性中的 “Run List” 定位到其数据流; 4. 从 “Run List” 定位到起始簇后,再分析索引项可以得到文件名等信息; 5. 从索引项中可以获取 “MFT” 的参考号; 6. 进入到 “MFT” 的参考号; 7. 进入到 “MFT” 找到对应的文件记录; 8. 然后再根据 80H 属性中的数据流就,可以找到文件真正的数据了。