您的位置:首页 > 运维架构 > Linux

Linux学习第十四篇--文件系统和目录树的关系

2017-08-04 00:00 113 查看

使用dumpe2fs命令查看文件系统的属性

我们使用man dumpe2fs命令查看该命令的描述,发现该命令的作用主要是输出超级块和块组(BlockGroup)的信息.



个人认为里面比较有用的选项有两个,一个是-b 用它来查询坏道,另一个是-h 这个命令只打印superBlock的信息.

接下来我们试一下这个命令.

首先我们使用df命令查看当前使用的文件系统,.



然后我们使用命令 dumpe2fs -h /dev/xvad1 来查看当前使用的文件系统的超级块中存储的信息.



查出来的数据,基本都可以通过名称得到其含义,故此处不再进行过多的解释.同样我们可以通过dumpe2fs /dev/xvda1 来查看包含了BlockGroup的信息.

关于BlockGroup的信息根据描述也能比较直观的了解,故不再解释.

文件系统和目录树的关系

通过之前的学习我们了解到每一个文件/目录都会且仅会占用一个inode节点,然后根据文件的大小去分配使用的block.
那么,我们的文件系统又是如何同目录结合到一起的呢?

目录

当我们创建目录的时候,文件系统会分配一个inode节点给这个目录,同是还会分配至少一块block给这个目录.

这个inode节点记录了这个目录的权限以及文件属性等,而这个block则记录了该目录下的文件名称及其对应的inode节点.



通过上图,我们也可以理解,为什么文件的增删改需要目录的w权限了,因为文件名称是存放在目录对应的数据块中的.

文件

当我们创建文件的时候,文件系统会分配一个inode节点给该文件,同时分配至少一个数据块给该文件.

目录树的读取

既然我们了解了目录和文件的存储结构,那么系统又是如何读取目录树的呢?

当我们需要读取一个文件的时候,比如/tmp/panda/default.

系统首先通过挂在信息找到挂载点的inode(通常情况下为2)



然后根据该inode读取对应block中文件名数据,找到tmp/以及其对应的inode节点,依次类推.就能够找到我们需要的数据了.

当然其中每一步都还有其他操作的,比如验证用户权限.

创建新文件的步骤

当我们创建一个新的文件时,通常会经过一下几个步骤:

1.首先判断用户对需要新建文件的目录有没有wx权限,

2.然后获取空白Inode节点,写入权限等信息.

3.获取可用block,写入实际数据.

4.更新InodeMap和BlockMap及SuperBlock.

5.文件创建完毕.



上图就是文件创建的简单流程,我们注意一下红框的部分,如果红框中操作执行过程,突然中断,就会造成数据不一致.

早期的EXT2文件系统中,出现这种状况会根据superBlock中的是否挂在和文件系统的状态来决定是否比对整个硬盘的数据,一旦比对的话,是一件非常耗时的操作,

于是在EXT3中,专门规划出了一个区块,用来专门记录文件的增改操作,这就是日志式文件系统.

日志式文件系统

当我们需要创建或者修改文件的时候,首先会在日志文件系统中记录某个档案及其准备要写入的信息.然后开始写入权限和数据,然后更新inodeMap,blockMap以及SuperBlock. 之后在记录该档案的操作已经完成.

如果,这时候再发生数据不一致的情况时,根据文件操作系统,可以有针对性的修改文件.

附加知识点

我们知道只有将数据加载到内存中,CPU才可以对其进行处理,但是硬盘的读写速度和内存的读写速度,相差很多,难道我们每次使用数据的时候,都要因为硬盘读写速度man而等待吗?那么linux又是如何处理的呢?

在linux中,采用异步方式对文件进行操作,当系统加载了某一文件后,会给该文件添加一个标记,默认为clean,当该文件被修改时,标记变更dirty,系统则会不定时的讲dirty标记的数据写入硬盘.

经过刚才的了解,我们知道文件系统必须要挂载到目录树上才能被使用,那么什么叫做挂载呢?

挂载:将文件系统和目录树结合的动作叫做挂载.

有一点需要注意的是,挂载点必须是目录,这个目录就是这个文件系统的入口.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐