全面解析文件文件系统

前言:

文件系统作为linux总最基础的但愿。理解并深入了解文件系统对linux的学习有重要意义。我们从文件系统创建,构成以及工作流程几个方面全方位的介绍文件系统的相关概念。

简述:

一块完整的磁盘经过分区后我们就可以通过格式化,根据我们的需求构建文件系统能使用的文件系统格式。传统的文档系统中,一个分区就只能够被格式化为一个文件系统。所以我们可以说一个文件系统就是一个分区。但因为新技术的引用,我们在格式化时已经不再说是针对分区格式化了,通常我们可以把一个可被挂载的资料称为一个文件系统。

文件系统内的文件除了文件本身的内容外,通常会包含许多与文件本身内容无关的属性,例如文件的权限,时间参数,属主等。我们把这种文件自身的属性称作元数据(metadata),把文件内容称为数据(data).文件系统将这两部分数据分别存放在不同的区域,文件属性放置到inode(引用节点)中,实际数据则放置在data block区域中。另外还有一个超级区块(superblock)会记录整个档案系统的整体信息,包括inode与block的总量,使用量和剩余量等。

磁盘的基本单位是扇区,每个扇区的大小为512个字节,如果文件系统以扇区为基本存储单位,再给每个扇区进行编号,那么光是扇区的编号就占了好大的存储空间,所以文件系统是block为最小存储单位的,一个block典型的大小是1024字节或者4096字节,在磁盘格式化就得设置好,并且之后不可修改。一个block最多只能放置一个文件,即使这个文件只有1个字节。

Inode和block都是有编号的。每个文件占用一个inode,inode所存放的元数据包含文件数据放置的block号码。因为,如果能找到inode的话,那么自然就会知道这个档案所放置资料的block号码。当然也就能读出该文件的实际数据了。

我们将inode与block区块用图解来说明下,如下图所示,文件系统先格式化出inode与block的区域,假设某一文件的元数据放置在inode4号的位置,而这个inode记录了文件数据实际存放在2,7,13,15这四个block号码所对应的block中,这样我们的文件系统就能一次把4个block中的内容读取出来。这种资料存取的方法我们称为索引式文档系统(indexed allocation)

详细描述:

通过前面的简述,我们已经大概了解到linux文件系统相关的概念:inode,block,superblock。文件系统一开始就将inode和block规划好了,除非从新格式化(或者利用resize2fs等指令变更文件系统大小),否则inode与block固定后就不变动。为管理的方便,inode与block并没有被放在一起。而是文件系统在格式化的时候基本就划分为多个区块群组(block group)的,并且每个区块群组都有自己独立的inode/block/superblock系统。Linux文件系统格式化后有点像下面这样:

每个区块内容说明如下:

  • Data block

Data block是用来存放文件数据的地方。在linux文件系统中block的大小有1K,2K以及4K三种。在格式化时block的大小就固定了,且每个block都有编号,以方便inode的记录。

  • Inode table(inode 表格)

Inode主要保存以下文件的元数据:

文件类型,权限,UID,GID

链接数(即硬链接数)

该文件的大小和不同的时间戳

指向磁盘上文件的数据块指针

定义文件特性的标记,如SetUID..

每个inode的大小固定为128 bytes(新的ext4与xfs可设定到256bytes),每个文件都只占有一个inode。一个block的大小就几k,而一个文件却大的多,而inode记录一条block号码就要花掉4字节,那我们有如何用128字节的inode去记录成千上万的block号码的记录呢?为此我们的系统很聪明的将inode记录block号码的区域定义为12个直接,一个间接,一个双重间接,一个三重间接。这是什么呢?我们把Inode的结构画出来:

上图左边为inode本身(128字节),里面有12个直接指向block号码的对照,这12个记录都能直接取得block号码。之后所谓的简介就是拿一个block来当作记录block号码的记录器,如果文件太大就会使用简介的block来记录号码。同理,如果,文件持续长大,那么就会利用所谓的双间接,第一个block仅再指出下一个记录号码的block在哪里,实际记录的在第二个block当中。以此类推,三简介就是利用第三层block来记录号码。

  • Superblock(超级区块)

Superblock是记录整个文件系统相关信息的地方,没有superblock,就没有整个文件系统了,其中的信息主要包含:block和inode的总量,未使用的数量,block和inode的大小,文件系统的各种时间,以及文件系统被挂载与否的状态标识。

一个文件系统中仅有一个superblock,除了第一个block group内含有碎片而block之外,后续的block group不一定含有superblock,即使有,也仅仅是作为第一个block group内surperblock的备份而已。

  • Filesystem Description(文件系统描述说明)

这个区段可以描述每个block group的开始与结束的block号码,以及说明每个区段(superblock,bitmap,inodemap,data block)分别介于哪两个block号码之间。

  • Block bitmap(区块对照表)和inode bitmap(inode对照表)

分别用来记录使用和未使用的block号码和inode号码。当我们使用或者释放block或inode时就可以通过这个两个对照表进行查看。

目录

linux文件中有一个特殊的文件就是目录文件,首先,不要被windows中文件夹的说法而扰乱。目录文件的内容就是一张目录下所有文件的文件名与inode号码的对照表。

当我们打开一个目录下名为 文件1的文件时,系统通过目录的对照表找到文件的inode号,通过inode号获取inode信息,最后根据Inode信息找到文件数据所在的区域,读出数据。所以目录并不是一个盒子把文件都装在里面,而是一个文件的清单,然后通过这个清单找到文件。

总结:

关于文件系统的基本概念就先讲到这里,而之后文件的权限,又是一大块内容,得分单独博客进行说明。文件系统做为linux的基础,理解其各个基础概念是学习linux所必须的基础。

时间: 2024-10-11 07:12:44

全面解析文件文件系统的相关文章

深入解析ext2文件系统之mke2fs

上一遍博文的重点其实将ext2整体的组织框架,我们知道了ext2文件系统由块组组成,每个块组里面的组织形式.我们甚至直接把超级块和组描述符里面的内容,用十六进制形式展现了出来.这篇博文主要讲述如何mke2fs生成合适需要的ext2 文件系统,基本就是参数选择的问题. mke2fs 常用的几个参数有:       1)    -b     block-size .       块大小是ext2文件系统比较重要的一个参数,目前只支持1024.2048和4096.上篇博文讲到了其中的一点,就是块大小决

深入解析 ext2 文件系统

很久以来,就想写一篇关于ext 家族文件系统的文章,源于我刚工作的时候,曾经一不小心rm -rf,误删除了很多文件,当时真想有个数据恢复软件能帮我把数据回复了.当然学习数据恢复,首先要学习文件系统.最近工作原因,好长时间没看学习Linux kernel 相关的东西,感觉面目可憎.扯远了,开始我们的ext2 文件系统的探索之旅. 那些介绍ext2特征的套话我就不说了,任何一本靠谱的linux教程中都可以找到,我们直接单刀直入,开始探索. 首先生成一个ext2文件系统.我在我磁盘空间有限的Ubunt

XML解析文件

package fax.util; import java.io.ByteArrayInputStream; import java.io.InputStream; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.axis.client.Call; import

python写一个脚本解析文件

Python写一个脚本解析文件 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 需求: 1.去掉空行 2.去掉空行后输出到一个新文件 附加需求(排版):1.'-'缩进n个字符 '-'缩进2n个字符 以此类推 2.'-'开头的所有句子输出在一行 '-'开头的句子输出在一行 以此类推 --------------------------------------------分隔线------------

SAX解析文件

1 import javax.xml.parsers.ParserConfigurationException; 2 import javax.xml.parsers.SAXParser; 3 import javax.xml.parsers.SAXParserFactory; 4 /** 5 * 1.新建一个SAX解析工厂实例 6 * 2.new一个解析器 7 * 3.new一个解析处理器 8 * 4.解析文件 9 * 5.获取信息 10 * @author Administrator 11

Linux本地解析文件/etc/hosts说明【原创】

windows的域名本地解析文件hosts是可以一个域名对多个IP,如果有一个IP有问题,可以去解析到其他IP Linux的本地解析文件/etc/hosts,是否也可以这样呢.下面做了个测试 先看一下#解析器查询顺序配置文件 [[email protected] ~]# cat /etc/host.conf multi on 如果想设置解析顺序,如下内容 #表示先查询本地hosts文件,如果没有结果,再尝试查找BIND dns服务器 order hosts, bind multi on 以on或

解析文件中的二进制文件

/** * 解析文件中的二进制文件 */ public static String[] getFileName(File file){ File[] fileList = file.listFiles(); String[] fileNameArray = null; String fileName = ""; for (int i = 0; i < fileList.length; i++) { if (fileList[i].isFile()) { if(fileList[i

Java 上传解压zip文件,并且解析文件里面的excel和图片

需求:上传一个zip文件,zip文件里面包含一个excel和很多图片,需要把excel里面的信息解析出来保存到表中,同时图片也转化成base64保存到数据库表中. PS:为了方便不同水平的开发人员阅读,我把代码全部写到Controller里面.这个demo的file入参的类型是MultipartFile,很多网上的例子是File类型.这两个类型在解析文件的时候还是有点区别的. 第①个方法: 1 /** 2 * 这个deomo入参的类型是MultipartFile,很多网上的例子是File类型 3

用Java8 Stream和 Lambda表达式来解析文件的一个例子

最近我想从一个日志文件中提取出指定的数据,下面是日志的一部分: 2015-01-06 11:33:03 b.s.d.task [INFO] Emitting: eVentToRequestsBolt __ack_ack [-6722594615019711369 -1335723027906100557] 2 2015-01-06 11:33:03 c.s.p.d.PackagesProvider [INFO] ===---> Loaded package com.foo.bar 3 2015-