NTFS
文件系统 |
---|
虚拟文件系统 |
磁盘文件系统 |
CD/DVD 文件系统 |
Network 文件系统 |
Flash 文件系统 |
NTFS (New Technology File System) 是Windows NT的原生文件系统。 它不仅基于HPFS,还支持访问控制等安全功能。 因为Windows NT完全是Unicode,所以NTFS是Unicode文件系统,每个字符(例如名称)是16位而不是8位。
关于
NTFS不仅为HPFS添加了安全功能。 在NTFS中,有更多的内置冗余。 例如: 在 HPFS 中,清除错误位置的扇区会使整个卷无法访问。 还增加了对文件的多硬链接(multiple hard-links)的支持(在NTFS之前,唯一容易访问的是通过POSIX子系统,但Windows 2000(NT 5)也将其添加到Win32)。
NTFS支持任意数量的文件分叉(与Mac OS非常相似,不同之处在于Mac OS始终为每个文件严格有2个分叉)。
HPFS 规定一个簇总是512字节长,并且一个簇总是一个扇区。 为了性能和与某些(尤其是日本)机器的兼容性,NTFS允许不同大小的扇区。 它还支持多个扇区的簇,这可能会提高性能。
简而言之,ntfs最重要的变化:
- 更好、更安全。
- 指向一个文件的多硬链接。
- 任意数量的分叉。
- 可变的簇和扇区大小(通常会带来更好的性能)。
实现
NTFS可能是最难处理的文件系统之一,尤其是因为缺乏黑客指导和可靠的文档。 自内核2.4以来,在Linux源代码库中可以找到一个只读的稳定驱动程序,而Linux 2.6附带了一个实验性的读写驱动程序。
NTFS-3G项目明显有一个针对Linux/FreeBSD/BeOS的读/写实现,目前处于“测试版”开发阶段。
结构
NTFS格式是围绕“文件”表构建的,这些表允许操作系统存储和读取预定义属性和自定义属性。
NTFS引导扇区类似于其他文件系统,如FAT。
字段 | 类型 |
---|---|
JMP | int8_t[3] |
OEM System | char[8] |
Bytes Per Sector | uint16_t |
Sectors Per Cluster | int8_t |
Reserved Sector Count | uint16_t |
Table Count | int8_t |
Root Entry Count | uint16_t |
Sector Count | uint16_t |
Media Type | int8_t |
Sectors Per Table | uint16_t |
Sectors Per Track | uint16_t |
Heads | uint16_t |
Hidden Sector Count | uint32_t |
Sector Count (32-bit) | uint32_t |
Reserved | uint32_t |
Sector Count (64-bit) | uint64_t |
紧跟其后的是特定于NTFS的报头。
字段 | 类型 |
---|---|
Master File Table Cluster | uint64_t |
Master File Table Mirror Cluster | uint64_t |
Clusters Per Record | int8_t |
Reserved | int8_t[3] |
Clusters Per Index Buffer | int8_t |
Reserved | int8_t[3] |
Serial Number | uint64_t |
Checksum | uint32_t |
使用“主文件表簇(Master File Table Cluster)”和“每个簇的扇区(Sectors Per Cluster)”值,您可以找到主文件表。 此表包含文件系统中每个对象的条目,包括文件、文件夹和表本身。 主文件表中每个记录的大小可以使用启动扇区中的“每个记录的簇数(Clusters Per Record)”和“每个簇的扇区数(Sectors Per Cluster)”字段来计算。
每条记录都以相同的头结构开始。
字段 | 类型 |
---|---|
Record Type | char[4] |
Update Sequence Offset | uint16_t |
Update Sequence Length | uint16_t |
Log File Sequence Number | uint64_t |
Record Sequence Number | uint16_t |
Hard Link Count | uint16_t |
Attributes Offset | uint16_t |
Flags | uint16_t |
Bytes In Use | uint32_t |
Bytes Allocated | uint32_t |
Parent Record Number | uint64_t |
Next Attribute Index | uint32_t |
Reserved | uint32_t |
Record Number | uint64_t |
文件记录的其余部分包含此记录的其他表和数据。 “Attributes Offset”字段包含此记录的属性列表开头的字节偏移 (从记录的开头开始)。
属性的长度可变,但总是以相同的序列开头。
字段 | 类型 |
---|---|
Attribute Type | uint32_t |
如果“Attribute Type”字段包含值0xFFFFFFFF,则标志着属性列表的结束。 否则,属性序列与属性 “记录” 的长度连续。
字段 | 类型 |
---|---|
Attribute Length | uint32_t |
此长度值定义属性记录的总长度,包括 “Attribute Type” 和 “Attribute Length” 字段。