NTFS

来自osdev
跳到导航 跳到搜索
文件系统
虚拟文件系统

VFS

磁盘文件系统
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” 字段。

另见

外部链接

de:NTFS