首页 > 编程知识 正文

如何使用linux系统(linux常用文件系统类型)

时间:2023-05-03 17:09:45 阅读:71671 作者:285

最近,要进行磁盘性能优化,需要结合文件系统的原理考虑优化的方向,因此利用这个机会进一步加深了对文件系统的认识。 在阅读本文之前,我们建议您阅读上一篇关于磁盘工作原理的文章。 我将简要总结和分享几个要点。

一、文件系统层次分析

自顶向下主要分为用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动器层和磁盘物理层

用户层:最上面的用户层是我们日常使用的各种程序,需要的界面主要是文件的创建、删除、打开、关闭、书写、阅读等。

VFS层:我们知道Linux有用户状态和内核状态,在用户状态下请求硬件资源需要调用SystemCall在内核状态下实现。 用户的这些文件相关操作具有相应的系统调用函数接口,该接口调用与VFS相对应的函数。

文件系统层:不同的文件系统实现VFS的这些函数,并通过指针向VFS注册。 因此,用户操作通过VFS转移到各种文件系统。 文件系统将文件读写命令转换为磁盘LBA的操作,起到翻译和磁盘管理的作用。

缓存层:在文件系统下缓存、PageCache和提高性能。 对磁盘LBA的读写数据将缓存在此处。

块设备层:块设备接口BlockDevice是一个用于访问磁盘LBA的层,它将读写命令组合在命令队列中,磁盘驱动程序从队列中读取命令并执行。 Linux设计电梯算法等,对很多LBA的读写进行优化排序,尽量将连续的地址放在一起。

磁盘驱动器层:磁盘的驱动程序将对LBA的读写命令转换为各自的协议,例如ATA命令、SCSI命令或自己的硬件能够识别的自定义命令,并发送到磁盘控制器。 HostBasedSSD在块设备层和磁盘驱动器层也实现了FTL,成为闪存芯片的操作。

物理层:将物理数据读写到磁盘介质。

二、文件系统结构与工作原理(主要以ext4为例)

众所周知,windows文件系统主要有fat、ntfs等,但linux文件系统有很多类型。 主要是VFS建立软件抽象层,上面提供文件操作接口,下面提供标准接口来对接不同的文件系统。 以下主要以EXT4文件系统为例,说明文件系统的结构和工作原理。

上图大致展示了ext4文件系统的结构,相信从中也能初步了解文件系统读写的逻辑过程。 对上图中的构成要素进行简单说明。

引导块—在磁盘分区的第一块中,记录文件系统分区的信息。 引导加载当前分区的程序和数据存储在此块中。 通常占用2kB,

超级块:

超级块用于存储文件系统的全局配置参数(块大小、总块数、inode数等)和动态信息(当前的自由块数、inode数等),位于文件系统起始位置的1k处由于系统的健壮性,最初每个块组都有超级块和组描述符表(以下简称GDT ) )的副本,但在文件系统较大的情况下,很多块(特别是GDT占用的块很多)都是徒劳的7的幂块组) )的稀疏存储) )例如,文件系统通常只使用主副本(第0组块)的超块信息,而不是

块描述符:

GDT用于存储块组描述符,并根据文件系统的大小占用一个或多个数据块。 它主要包括块位图、I节点图和I节点表的位置、当前空闲块数、I节点数以及所使用的目录数,具体定义为ext3_fs.h文件中的struct ext3 _ group _ 每个块组都对应于这样的描述符,并且当前此结构占用32字节,因此在块大小为4k的文件系统中,每个块可以包含128个块组描述符。 GDT对搜索文件系统元数据非常重要,因此与超级块一样进行了备份。 如果有备份,GDT的内容在每个块组中是相同的,其占用的块数也是相同的。 从上面的描述可以看出,块组中的元数据(例如块位图、inode位图和inode表)的位置是不固定的。 当然,默认情况下,创建文件系统时的位置在每个块组中是相同的(如图2所示)

块组:

每个块组都包括块位图块、inode位图块和一个或多个块,它们描述存储inode表和文件数据的数据块。 此外,还可能包含超级块和所有块组描述符表,具体取决于块组编号和创建文件系统时使用的参数。 下面简要介绍一下这些元数据。

块位图:

块位图用于描述块组管理的块的分配状态。 如果没有设置与块对应的位,则表示没有分配块,可以用于存储数据。 否则,表示块已经被用于存储数据,或者块不可用,例如物理上不存在。 因为块

位图仅占一个块,因此这也就决定了块组的大小。

Inode位图:

Inode位图用于描述该块组所管理的inode的分配状态。我们知道inode是用于描述文件的元数据,每个inode对应文件系统中唯一的一个号,如果inode位图中相应位置位,那么代表该inode已经分配出去;否则可以使用。由于其仅占用一个块,因此这也限制了一个块组中所能够使用的最大inode数量。

Inode表:

Inode表用于存储inode信息。它占用一个或多个块(为了有效的利用空间,多个inode存储在一个块中),其大小取决于文件系统创建时的参数,由于inode位图的限制,决定了其最大所占用的空间。

以上这几个构成元素所处的磁盘块成为文件系统的元数据块,剩余的部分则用来存储真正的文件内容,称为数据块,而数据块其实也包含数据和目录。

了解了文件系统的结构后,接下来我们来看看操作系统是如何读取一个文件的:

大体过程如下:

1、根据文件所在目录的inode信息,找到目录文件对应数据块

2、根据文件名从数据块中找到对应的inode节点信息

3、从文件inode节点信息中找到文件内容所在数据块块号

4、读取数据块内容

到这里,相信很多人会有一个疑问,我们知道一个文件只有一个Inode节点来存放它的属性信息,那么你可能会想如果一个大文件,那它的block一定是多个的,且可能不连续的,那么inode怎么来表示呢,下面的图告诉你答案:

 

 也就是说,如果文件内容太大,对应数据块数量过多,inode节点本身提供的存储空间不够,会使用其他的间接数据块来存储数据块位置信息,最多可以有三级寻址结构。

 到这里,应该都已经非常清楚文件读取的过程了,那么下面再抛出两个疑问:

1、文件的拷贝、剪切的底层过程是怎样的?

2、软连接和硬连接分别是如何实现的?

下面来结合stat命令动手操作一下,便知真相:

1)拷贝文件:创建一个新的inode节点,并且拷贝数据块内容

2)剪切文件:同个分区里边mv,inode节点不变,只是更新目录文件对应数据块里边的文件名和inode对应关系;跨分区mv,则跟拷贝一个道理,需要创建新的inode,因为inode节点不同分区是不能共享的。

3)软连接:创建软连接会创建一个新的inode节点,其对应数据块内容存储所链接的文件名信息,这样原文件即便删除了,重新建立一个同名的文件,软连接依然能够生效。

 

 4)硬链接:创建硬链接,并不会新建inode节点,只是links加1,还有再目录文件对应数据块上增加一条文件名和inode对应关系记录;只有将硬链接和原文件都删除之后,文件才会真正删除,即links为0才真正删除。

 三、文件顺序读写和随机读写

从前面文章了解了磁盘工作原理之后,也已经明白了为什么文件随机读写速度会比顺序读写差很多,这个问题在windows里边更加明显,为什么呢?究其原因主要与文件系统工作机制有关,fat和ntfs文件系统设计上,每个文件所处的位置相对连续甚至紧靠在一起,这样没有为每个文件留下足够的扩展空间,因此容易产生磁盘碎片,用过windows系统的应该也知道,windows磁盘分区特别提供了磁盘碎片整理的高级功能。如下图:

那回过来,看看linux 文件系统ext4,都说linux不需要考虑磁盘碎片,究竟是怎么回事?

主要是因为Linux的文件系统会将文件分散在整个磁盘,在文件之间留有大量的自由空间,而不是像Windows那样将文件一个接一个的放置。当一个文件被编辑了并且变大了,一般都会有足够的自由空间来保存文件。如果碎片真的产生了,文件系统就会尝试在日常使用中将文件移动来减少碎片,所以不需要专门的碎片整理程序。但是,如果磁盘空间占用已经快满了,那碎片是不可避免的,文件系统的设计本来就是用来满足正常情况下使用的。如果磁盘空间不够,那要么就是数据冗余了,要么就该换容量更大的磁盘。你可以使用fsck命令来检测一下一个Linux文件系统的碎片化程度,只需要在输出中查看非连续i节点个数(non-contiguous inodes)就可以了。

 

 关于文件系统的就讲这么多,下篇会讲解linux内核提供的一个资源管控机制cgroup,分析其原理及使用过程。

 

ext4文件系统bug:
http://www.phoronix.com/scan.php?page=news_item&px=MTIxNDQ

ext4文件系统描述:
http://blog.csdn.net/liangchen0322/article/details/50365685
http://blog.csdn.net/fybon/article/details/26243971
hexdump查看磁盘结构信息:
http://www.cnblogs.com/jiangcsu/p/5737659.html

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。