技术大比武之一:什么是元数据

元数据(Metadata)是描述其它数据的数据(data about other data),或者说是用于提供某种资源的有关信息的结构数据(structured data)。

 

文件系统管理思想的精髓就在于它的链表、B树和位图等结构,也就是元数据(Metadata),以及对这些元数据的管理方式。文件系统其实对底层磁盘是有点“恐惧”的,我们可以计算以下,一个100GB的磁盘上,有超过2亿个扇区(一个扇区512byte)。文件系统时如何管理这2亿个扇区,又如何知道某个扇区正在使用呢?如果使用的话,时分配给哪个文件或者文件的一部分呢?

文件系统首先将扇区组合成更大的逻辑块来降低管理规模NTFS最大每个块可以到4KB,也就是8个扇区一组形成一个簇(块,Block)。这样,2亿的管理规模便会除8,缩小到1.2万的管理规模,虽然存储空间可能有所浪费,但是切实降低了管理成本。

其次,文件系统会创建管理存储空间上所有簇(块)的位图文件,这个文件有固定的入口,文件系统能在1.2千万个块中快速定位到这个文件入口并读写。位图文件中每个位代表卷上的一个簇(或者物理扇区,视设计不同而决定),如果簇正在被某个文件使用,这个簇在位图中对应的值就为1;否则为0。

再次,文件系统还保存一份文件和其对应簇号的映射链,这个映射链本身以及簇位图本身也是文件,也要有自己的映射链,所以针对这些重要的元数据,必须有一个固定的入口,用来让文件系统程序读入并且遍历所有文件系统元数据。通常将这个初始固定地址入口称为root inode,不同操作系统有具体实现方式不同。

当向卷中写入一个新文件,文件系统首先会查找簇位图,找到位置为0所对应的簇号,并计算所需的空间,然后分配这些簇号给这个文件。它首先将文件实体数据写入对应的簇,然后再去文件——簇号映射图中更新,将新文件与其对应的簇映射关系记录下来,最后到簇位图中将这些簇对应的位的值从0改为1。如果要删除这个文件,则直接再inode链中将这个文件的inode抹掉即可,然后再簇位图中将对应簇的位值从1改为0。

文件系统并不会抹掉这个被删除文件所对应卷上的簇中的实际数据,如果用扇区读写软件来提取这个簇,就会得到这个文件的部分内容。虽然这些簇中依然有内容,但是对于文件系统来说,这些簇时可重用的,一旦有新文件写入,新文件的数据便会覆盖原来簇中的数据。

所以,对于一个文件系统来说,最重要的不是卷簇中的数据,而是文件——簇号映射链和位图等这些元数据。比如,想要破坏某个文件系统中的某个文件,我们不必费劲地修改某个文件对应簇中的实际内容,只需修改一下文件——簇号映射链中关于这个文件所对一个的实际簇号的记录即可,让它指向其他簇号。

这样,文件读出来的内容就不是原有内容。此外,如果修改了文件系统中对应簇中的数据,文件系统也根本感知不到这些动作,因为它所查询的是文件——簇号映射链,它只知道某个文件对应着哪些簇,而不关心这些簇是否被改过,它想关心也无法关心。

 

你可能感兴趣的:(2019年技术大比武)