zoukankan      html  css  js  c++  java
  • Windows文件系统-NTFS文件系统

    Windows作为最流行的个人计算机操作系统,成为了我们学习、工作和生活的一部分。我们几乎每天都会经历打开文件管理器,进入具体磁盘,打开具体文件,而Windows采用文件系统管理着所有的文件和磁盘空间,这个文件系统就是NTFS。

     

    NTFS文件系统

    文档主要分为两大部分:

    1.NTFS文件系统简介

    2.文件磁盘位置计算

     

    NTFS文件系统简介

    NTFS(New Technology File System)是微软1993年推出的用于Windows系统的文件系统,用于代替原来的FAT文件系统,从而提高性能。NTFS自推出以来经历了多个版本的更新,更新历史如下:

    可见2001年发行3.1版本后,NTFS就再没有更新过了。

     

    NTFS数据结构

    一个NTFS分区的结构如下图所示:

    整个分区主要分为三大区域:

    1.VBR(Volume Boot Record):非常重要,存储跟引导相关的数据,大小为16个扇区;

    2.文件区域:在NTFS的概念里,一切皆为文件,包括元数据文件、常规文件、目录、一切的一切都是文件;

    3.BBS(Backup Boot Sector):分区的第一个扇区是分区引导记录,是能否引导系统的关键,所以NTFS用分区的最后一个扇区备份第一个扇区,用于修复损坏的第一个扇区。

     

    文件

    文件可分为三种类型:元数据文件、常规文件和目录。

    元数据文件

    任何文件系统都会有元数据用于描述文件信息,信息有如名称、大小、修改时间、存放位置等等,注意的是NTFS元数据也用文件表示,总有16个元数据文件,这些文件的名称都是以$开头,属于隐藏文件。

     

    查看这些文件:

     

    MFT(Master File Table)

    非常重要的文件,包含了所有文件的元数据,定位文件必须要经过$MFT文件。MFT由一个个文件记录组成,一个文件至少占用一个记录,$MFT文件占用第一个记录。

    MFT文件记录(固定大小为1KB)由记录头部和属性组成,记录头部大小为42或48字节,3.1版本之前是42字节,之后是48字节。记录头部数据结构定义如下:

    文件记录属性分为常驻属性和非常驻属性,常驻属性代表属性的全部内容在文件记录中,非常驻属性代表属性内容超过了文件记录的大小,需要另外开辟空间存储,例如文件内容比较大。

    文件记录头部中标明了第一个属性的偏移量,NTFS支持的属性定义在$AttrDef中,每个属性有唯一标识ID,常见的ID有:

    文件内容

    文件内容由属性$DATA描述,由于文件记录的大小固定为1KB,记录头占了48字节,所以留给文件存放内容的空间不会超过976字节。如果文件内容比较少,则全部存在文件记录中,否则另外开辟extents存储。开辟的extents以族为单位,NTFS基本分配单位是族,族大小为4KB。

     

    文件磁盘位置计算

    借助微软公司提供的工具fsutil可计算出文件的数据分布范围,根据文件的大小,可分为两种情况。

    小文件

    小文件指的是文件内容可容纳在文件记录中,不用开辟extents存放,也是最不方便计算的情况。

    第一步:

    获取$MFT文件的磁盘分布范围,方式如下:

    指令为:fsutil file queryextents 文件路径

    输出结果(结果可能为多行,代表文件存放位置不连续):

    VCN:虚拟族编号,相对于文件内部的偏移量,单位为族;

    :该extent大小,单位为族;

    LCN:逻辑族编号,extent相对于分区的偏移量,单位为族。

    这样就可以知道$MFT文件在分区的0xc0000(10进制为786432)族(大小4096)处,换算为字节为786432  4096=3221225472,文件大小为0x1640(10进制为5696)族,换算为字节为5696  4096 = 23330816。

     

    第二步:

    获取文件在$MFT文件的位置,文件参考编号的低4字节就是文件在$MFT文件的位置,求文件参考编号的方法如下:

    通过fsutil volume filelayout 文件路径 可获取到文件参考编号,0x0007000000005206的低4字节为0x5206,也就是说E:12.txt的文件记录位于$MFT的第0x5206(10进制为20998)个记录处。

    一个文件记录固定为1KB,那么E:12.txt的文件记录则位于 20998 * 1024 = 21501952 = 0x1481800。

    用FTK看看$MFT的0x1481800处是什么内容:

    字符“FIFE”代表是一个文件记录,第二个紫框表明文件名匹配,第三个紫框是文件内容“helios89”,看看12.txt的内容:

    可见计算得到的E:12.txt在$MFT的位置是正确的,知道了$MFT在分区的分布范围,也知道了E:12.txt在$MFT的位置,通过简单的计算便可知道E:12.txt在分区的分布范围了。

    大文件

    大文件指的是文件记录容纳不下文件的内容,需要开辟extents存放,这种文件是最容易计算其数据分布范围的,参考小文件计算的第一步。

    分区偏移量

    上面的计算结果得到的是文件在分区的偏移量,需要加上分区偏移量才是磁盘的偏移量。分区偏移量可通过FTK软件查看。

    方法如下:

    选择【File】->【add Evidence Item..】,弹框如下:

    选择【Physical Drive】【下一步】选择磁盘,点击完成。

    在【View】中选择【Properties】显示出属性框

    在左侧的【Evidence Tree】中选择一个分区,在属性框中便可查看到分区的偏移量(单位扇区)了,如下图所示:

     

    结束语

    Windows作为最流行的个人计算机操作系统,也证明了NTFS文件系统的强大和稳定。本文档只是对NTFS进行了简单的介绍,还有更多的技术原理值得我们继续研究,让我们继续前进吧。

  • 相关阅读:
    JVM系列之:String.intern和stringTable
    一文了解JDK12 13 14 GC调优秘籍-附PDF下载
    JVM系列之:对象的锁状态和同步
    JVM系列之:Contend注解和false-sharing
    十分钟搭建自己的私有NuGet服务器-BaGet
    .Net Core in Docker极简入门(下篇)
    .Net Core in Docker极简入门(上篇)
    Flutter 实现酷炫的3D效果
    2020年20个Flutter最漂亮的UI库和项目
    Python 为什么能支持任意的真值判断?
  • 原文地址:https://www.cnblogs.com/eflypro/p/14362650.html
Copyright © 2011-2022 走看看