在灾备项目组做CDP(Continual Data Protection),刚刚入门,最近看了下关于磁盘的操作,记录一下DeviceIoControl()。
NTFS中的文件结构
NTFS文件系统中,磁盘文件存储管理的最小单位是簇(Cluster)。一个簇由连续的若干个扇区构成。对于一个文件来说,我们将其在磁盘上占用的连续的簇称为簇流(Cluster Runs,不知道怎么翻译,有人称之为簇流,我也就这么叫吧),一个文件可以占用多个簇流。当文件的内容较小时,会与该文件的常驻属性一同放置在MFT的项中,每个MFT项的大小在引导扇区中被定义,但目前所有的NTFS文件系统的MFT项的大小均为1024Bytes。当文件内容较大时,就会占用额外的簇空间来存储数据,称之为非常驻属性。
非常驻属性被存储在簇流空间,簇流就是一组连续的簇,用起始簇号和长度表示一个簇流。例如,一个非常驻属性分成三部分,第一部分存储在簇号为30,31,32,33和34的簇中,那么该簇流的起始簇号就是30,流长度为5。第二部分存储在簇号为66和67的簇中,则该簇流起始簇号为66,流长度为2。第三部分存储在簇号为39~42的簇中,该簇流的起始簇号就是39,流长度为4。该属性一共占用了三个簇流,像下图这样(截图,侵删):
NTFS使用VCN(Virtual Cluster Number,虚拟簇号)和LCN(Logical Cluster Number,逻辑簇号)来描述文件或部分文件的位置。一个文件的VCN从0开始,是文件内容的内部编号,也就是说,将文件按照逻辑簇的大小进行划分,然后从0开始编号,就是所谓的VCN。而LCN就是文件系统的逻辑簇号,对于一个卷区来说,每一个簇的逻辑簇号是独一无二的。通过这种VCN和LCN的映射关系,我们就能在文件系统中定位文件。返回上面的例子,逻辑簇号30~34存储了文件内容的第一部分,对应的VCN为0~4,第二部分存储在逻辑簇号为66~67的簇中,其对应的VCN为5~6,第三部分存储在逻辑簇号39~42的簇中,对应的VCN为7~10。于是有下图(截图,侵删):