分享

Linux文件系统相关术语(概念)全面解析

 率性而为 2023-11-12 发布于河北

前文《什么是文件系统,以Linux中的Ext4为例细聊一下》我们对文件系统的基本概念和原来进行简要的介绍。本文将从Linux文件系统的概念和使用方面介绍一下文件系统的相关内容,后面我们会专门从代码实现层面介绍一下Linux文件系统的相关内容。

如下图是一个Linux文件系统简图,在该图中包含3个硬盘, 分别是sda、sdb和sdc,分别被格式化为Ext3、Ext4和XFS文件系统。同时,这里也通过网络方式挂载了一个NFS网络文件系统。这里涉及一个概念“挂载”,至于什么是挂载,我们在后面详细介绍。

图片

       文件(File)的概念  

文件系统中最基本的概念自然是文件,文件是存储数据的实体。从用户的角度来看,文件是文件系统中最小粒度的单元。文件的大小不是固定的,最小可以是0,最大可以是几十TB(视具体文件系统而定)。    

为了便于用户对文件进行识别和管理,文件系统为每个文件都分配了一个名称,称为文件名。文件名就好像人名,它是一个标识。

比如我们去学校,让班主任帮忙把张三叫出来,此时班主任就能通过人名很容易的找到张三。文件系统也是这样,当普通用户想访问某个文件时,告诉文件系统自己想访问的文件名,此时文件系统就可以根据文件名找到该文件的数据。最常见的比如我们在Windows中双击某个视频或者图片文件,那么就有相应的软件将其打开。底层原理方面就涉及到文件系统对文件数据查找的流程。

文件名通常包含两部分,并通过“.”进行了分隔,但并非绝对。如下图中的test1.jpg文件为例,该文件名可以分为两部分,前一部分称为文件主名,它表示该文件的标识,就好像人名一样;后一部分称为扩展名,它的作用是标识文件的类型。这种命名方式便于让用户能够对文件有个快速的整体认识,比如我们可以一眼就能知道某个文件存储的是视频、音频还是图片。

图片

我们进一步的深入到文件的内部。从普通用户(开发人员)的角度来看,文件就是一个线性空间,这就好比我们在程序开发中的数组一样。不同于数组的地方是文件的大小是可以变化的,当写入更多的数据时,文件就会变大。虽然文件数据以用户角度来看时是线性的,连续的,但是在文件系统层面并非如此。其真实位置可能在磁盘的任意位置。如下图所示,一个文件通常在逻辑上被划分为等份,而每个逻辑块可能在物理磁盘的任意位置。    

图片

对于文件系统而言,它并不关心文件是什么格式的,而是把所有文件看作是字节流。但是在用户层面却需要关心文件的格式。因为,不同格式的文件需要用不同的工具访问。对于Windows操作系统和桌面版的Linux系统而言,操作系统层面建立了文件格式与软件的关联,因此当我们双击文件的图标时会自动用对应的软件打开文件。但也不一定,因为有的时候可能系统缺少相关的软件,或者关联关系被破坏,此时就无法双击打开了。

文件的格式非常之多,比如常见的文本文件、PPT文档、Word文档或者MP3等,都由特定的工具软件打开。比如MP3文件只有通过播放器软件打开才有意义,也就是才可以播放音乐。如果我们用文本编辑工具打开一个MP3文件,看到的只能是一堆乱码。

目录(Directory)的概念 

在文件系统中另外一个基本的概念是目录。在文件系统中目录是一种容器,它可以容纳子目录和文件。目录就像我们日常生活中的文件夹一样,它可以容纳文件。在GUI终端中可以很容易的分辨出目录和普通文件的差别,目录的图标与日常生活中的文件夹也非常像。如下图中选中的home就是Linux下目录的图标。    

图片

在命令行中区分目录和普通文件就不太直观了,但也并不太困难。有些Shell会将目录和文件显示成不同的颜色,以方便用户区分目录和文件。另外,在属性中会有标识,如下图所示,“唐山”这一目录最前面的字符为d,这个d就是directory的缩写,因此我们可以通过第一个字符来区分目录和文件。

图片

如果我们深入到目录的实现原理,就会知道其实目录本身也是一种文件。只不过目录中存储的数据是比较特殊的,这些数据就是关于文件名称等元数据(管理数据的数据)的信息。以“河北”目录为例,其中存储的数据其实是文件名与一个数字的对应关系(如下图所示),这个数字就是所谓的inode id。在文件系统层面,普通用户通过文件名读取数据的过程正是需要这种映射关系,这部分内容我们后面章节详细介绍。    

图片

链接(Link)的概念  

链接是Linux文件系统的概念,在Windows和MacOS中通常称为快捷方式。Linux中的链接分为软连接(Soft Link)和硬链接(Hard Link)两种。其中软连接又称为符号链接(Symbolic Link),它是文件的另外一种形态,其内容指向另外一个文件路径(相对路径或者绝对路径)。硬链接则不同,它是一个已经存在文件的附加名称,也就是同一个文件的第二个或者第N个名称。

为了更加直观的理解软链接和硬链接,我们在test目录中创建一个源文件src_file.txt。同时为该文件分别创建一个软链接(softlink.txt)和一个硬链接(hardlink.txt)。然后ls命令查看一下该目录的详细信息,具体如图1‑11所示。

图片

通过上面的结果可以看出,软链接有个符号(->),该符号指示了该链接所指向的目的文件。而硬链接并没有该符号,也就是我们无法直观的知道硬链接的目的文件是哪个文件。但是如果我们观察一下硬链接与源文件最前面的数字会发现是一样的。这个数字是inode ID,这说明它们是指向同一个文件的。

更进一步,从原理上来理解,硬链接其实是在目录中增加了一项,而该项的inode ID是源文件的inode ID。因此硬链接与源文件的内容是完全一样的。关于原理部分的内容,我们在后面会详细介绍,这里就不再赘述。    

那么链接的作用是什么呢?主要是实现了对源文件的快速访问,并且节省空间。有些情况下我们需要在目录B使用目录A中的某个文件。这种情况下使用链接要比拷贝一份更加方便,合适。因为通过链接的方式,在源文件发生变化的情况下可以马上感知,不需要重新拷贝,同时又节省存储空间。

图片

为了更加直观的理解链接的作用,我们通过上图简要介绍一下。以培训机构教学为例进行介绍,假设我们已经有一个教学素材库,其中有很多素材在目录data中。某学期需要开始一个新的课程,该课程需要用到素材库中的一个视频文件。该课程的素材都在目录course中。此时我们就可以在course目录建立一个到素材库的链接。这样course中既包含了该视频,又不会占用太多空间。另外即使素材库中的视频文件进行了修改,course中只是一个链接,因此其内容也会跟着修改,不会出现不一致的情况。

路径(Path)的概念

为了便于阅读,我们将本文一开始的插图搬过来用一下。如下图所示,Linux的文件系统的所有元素其实构成了一个树型结构(如果考虑链接则是一个图的结构)。路径(Path)表示文件或者目录在树中的位置。下图中的红色实线所连接的目录构成了一个路径,由于这个路径是从根目录(/)开始的,我们称为绝对路径。在Linux操作系统中,路径通过“/”分割,因此上述路径可以通过一个字符串来表示,也就是”/mnt/nfs”。

除了绝对路径外,还有相对路径的概念。在Linux中有一个工作目录(Working Directory)的概念,工作目录是进程启动的目录,或者在shell中执行命令时所处的目录。相对路径是指相对于工作目录的位置。    

图片

依然以这个图为例,假设我们现在在bin目录下面。如果想要以相对目录的方式定位刚才的nfs目录,则可以用字符串“../mnt/nfs”表示。在这个字符串中的“..”表示父目录,bin的父目录就是根目录,所以“../mnt/nfs”等价于”/mnt/nfs”。可以非常简单的区分绝对目录和相对目录,以根目录(/)起始的为绝对路径,不以根目录起始的为相对目录。    

图片

挂载(Mount)的概念

挂载是Linux操作系统中特有的概念,Linux下的硬盘格式化后不能直接使用,必需挂载到某个目录上才可以使用。前文已述,上图中包含三个硬盘,分别为sda、sdb和sdc。这三个硬盘分别对应着三个文件,分别是/dev/sda、/dev/sdb和/dev/sdc。其中sdb被格式化为Ext4文件系统,sdc被格式化为XFS文件系统。例如sdc格式化的命令如下:

mkfs.xfs /dev/sdc

格式化完成后,我们并不能直接向/dev/sdc拷贝文件。原因很简单,/dev/sdc在操作系统层面是一个文件。所以,需要挂在后才可以使用,挂载的命令如下:

mount /dev/sdc /mnt/xfs

挂载后,我们就可以向目录xfs拷贝数据了。这里有一点需要注意,在挂载之前,xfs目录是文件系统Ext3中的一个目录,写数据会被写到硬盘sda上。挂载后,目录xfs就发生本质性的变化了,此时如果向xfs目录拷贝文件,数据将存储在硬盘sdc中。

至此,我们介绍了Linux文件系统最基本的几个概念。这些概念都是用户层面的,在文件系统实现层面还有一些其它概念(如inode),我们后面会详细介绍。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多