Linux学习记录
主要解释一下在学习过程中遇到的一些问题:即对文件系统的理解、挂载点的理解、对linux目录树的理解、对VFS的理解、以及之前困惑许久的为什么/ /home /boot的inode号相同!!!
一、文件系统:
借由维基百科的定义:https://zh.wikipedia.org/zh/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F
可以简要的认为文件系统是一种管理文件(进行存储和组织计算机数据)的一种方法,主要便于用户在计算机上使用各种数据。
在linux中我们所使用到的文件除了文件本身的实际内容外,还会外加许多的属性,例如:文件权限(rwx)以及一些其他的文件属性(拥有者、用户组、ctime,mtime等等)。
对于linux中的文件系统而言,通常会将这两部分的数据分别存于不同的区块当中,也就是说权限与属性放在inode中,而实际的数据则放在数据区块当中。 此外,为了方便以及加强性能,文件系统还会有一个超级区块来记录整体的文件系统的信息,包括:inode和数据区块的总量、使用量、剩余量等等
每个inode与数据区块都会有一个特定的编号,以下简要解释:
1、超级区块: 记录文件整体信息,包括:inode和数据区块的总量、使用量、剩余量,以及文件系统的格式和相关信息等等。
2、inode: 记录文件属性,一个文件占用一个inode ,同时还会记录文件实际数据存于哪一个数据区块当中。
3、数据区块: 记录文件的实际内容,若文件太大,则可以占用多个区块
在linux中,一个文件可以通过inode号迅速的找到所有的数据区块,我们将这种读取方式成为索引式文件系统:
如图所示,假设文件x.txt的inode号为4,那么我们读取的时候,就会先读取x.txt文件的inode号,根据inode号中的文件属性及权限判断当前用户是否有权进行操作或读取。然后,在确定之后,若有足够的权限,则会进一步读取到inode当中存储的数据区块的位置,即2、7、13、15。然后,就可以一次性的将数据全部取出。
对于目录:
文件系统也会分发一个inode以及至少一个数据区块给目录,由inode记录该目录的相关权限、属性以及区块号(因此,若目录中无x权限,则就无法进入到该目录中),至于数据区块,则会记录该目录下的文件名以及文件名所占用的inode号。
由以上,我们以及了解到了inode本身是不会记录文件名的,文件名是记录在目录所对应的区块当中。因此,当我们想要读取某个文件时必定会经过目录的inode以及对应的目录数据区块,然后才能找到对应的文件名以及inode号。
也就是说,当我们想要读取或者执行某一文件时,1)系统首先会找到对应的目录,通过挂载的信息找到对应的inode号;2)利用目录的inode号,先判断当前用户是否有权对阅读、进入该目录以及修改目录下的文件;3)若有权,则会通过inode号,读取到对应的目录数据区块,找到对应的文件名及其inode号;5)再用该文件的inode号,找到对应的文件数据区块。
举个例子:假设我想要读取/etc/passwd这个文件:
首先,看一下/ /etc /etc/passwd 这三个的对应属性:
1、/的inode
首先,系统会根据挂载点,找到/的inode号(68),然后利用inode号中存储的权限信息判断yuan这个用户是否可以进行读取(有r、x权限就可以进入目录且读取);
2、/的区块
通过1中的inode,去到目录/下的数据区块,找到/etc目录的inode号码();
3、/etc/的inode
通过读取/etc/的inode号,发现yuan这个用户具有r、x权限,因此允许读入/etc/的数据区块;
4、/etc/的数据区块
通过3,进入到/etc/下的数据区块,找到名字为passwd的文件的inode号码();
5、passwd的inode号码
读取passwd的inode号码,发现yuan具有r权限,因此,只能对数据区块进行读操作;
6、passwd的数据区块
根据passwd的inode号码,去往对应的数据区块,取出内容以供yuan用户进行读取。
二、目录树
为方便同一所有不同发行版本的linux,出炉了一个同一的目录配置依据:Filesystem Hierarchy Standard (FHS)标准。该标准主要是希望用户可以了解到已安装的软件通常存放于哪个目录之下。
因此,依据FHS可以大致的将文件系统的架构分为如下图所示。一般来说都会从根目录/开始,也就是说根目录一般要作为起始的一个目录,需要挂载上一个对应的文件系统,其他的所有目录以及挂载点都将挂载到根目录/ 之下。
一般来说,可以将一个分区格式化为多个文件系统,也可以将
三、挂载
在了解了文件系统以及挂载点后,接下来我们谈谈什么是挂载!
由于linux通常都是基于目录树结构使用的,因此若想要使用一个文件系统,那么就必须将文件系统与目录树相结合才能被我们进行使用。我们便可以将文件系统与目录树结合的操作称之为挂载!
挂载点一定是目录,该目录为进入该文件系统的的入口。 因此,无论你是什么文件系统,要想使用该文件系统,就必须与目录树结合,将本文件系统挂载到目录树上。利用df命令,可以查看当前系统中已经存在的文件系统名字,以及其挂载的位置:
输入,ls -lid / /home /boot,你会发现这三个的inode号相同,这是因为这三个分属于不同的文件系统中(由上图也可知),在不同的文件系统中,inode是可以相同的!!!
xfs文件系统的初始目录的inode号默认为64(这是我的,可能与他人的不一样)
通过输入lsblk以及blkid,可以很明显看到这三个是处于不同的分区之下的同一种类的文件系统,因此对于初始目录的inode号默认是相同的:
那么这里有个疑问?既然linux的目录树可以挂载多个文件系统,那么系统是如何识别每一个不同的文件系统的呢?以及由于/home和/boot处于/之下,那么由于他们的inode号相同,在系统进行查询的时候是如何进行分辨的呢?即当我想进入/home时,按照之前的步骤来说,应该先查询/的inode号,再到/目录的数据区块中找到/home。但是/ /home /boot的inode号都是64,如果按照之前的逻辑来算,一个文件占用一个inode,那么当查询到/home时,他指向的又是64,那不就又重定向到/了?
嘿嘿嘿,要想管理好各种不同的文件系统,linux内核当中是使用VFS进行统一管理的。
四、VFS
linux内核中,使用一个名为Virtual Filesystem Switch的功能进行读取文件系统的。在linux内核当中是是以目录项作为基础单位进行统一管理:
目录项是描述文件的逻辑属性,只存在于内存中,并没有实际对应的磁盘上的描述,更确切的说是存在于内存的目录项缓存,为了提高查找性能而设计。注意不管是文件夹还是最终的文件,都是属于目录项,所有的目录项在一起构成一颗庞大的目录树。例如:打开一个文件/home/xxx/yyy.txt,那么/、home、xxx、yyy.txt都是一个目录项,VFS在查找的时候,根据一层一层的目录项找到对应的每个目录项的inode,那么沿着目录项进行操作就可以找到最终的文件。
VFS在查找的过程中,首先会判断用户打开的这个文件是否是一个已经记录在案的文件系统,若是,则可以直接进入到对应分区中的文件系统的初始目录的inode号,如/home的64号进行读取。
也就是说,我们无需特别指定是哪一个文件系统,VFS会自动帮我们识别好,如何进入其中:
以下继续具体介绍以下VFS:
取自博客CSDN博主「宇内虹游」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39278265/article/details/88839027
VFS用 superblocks 和 inodes 来描述系统文件(和EXT2的文件系统使用 superblocks,inodes非常相似)。其中 inodes 用来描述系统内的文件和目录。
每个文件系统在初始化的时候,它会用VFS注册它自己(我理解的是:每个真实文件系统挂载上来时,都会在VFS上登记备案 ),这通常发生在操作系统在系统引导(system boot time)时初始化它自己的过程。
1)真实文件系统要么在内核中构建(意思就是直接装在内核里面成为一部分了),要么以可加载模块的方式被构建。文件系统模块只有在系统需要他们的时候,才会被加载。比如,VFAT 文件系统被实现成一个内核模块,只有当一个VFAT 文件系统被挂载的时候,它才会被加载。
2)当一个基于块设备的文件系统被加载,且这包含根文件系统,VFS就必须读取它的superblocks(就叫超级块吧),每个文件系统类型的超级块read routine必须算出文件系统的拓扑结构,并且把这个信息映射到VFS的超级块数据结构中。
3)VFS保持着一个在系统(意思就是操作系统)中被挂载文件系统的列表以及他们的VFS超级块。每个VFS超级块包含到routines(指令集 a list of instructions that enable a computer to perform a particular task)的信息和指针。
总结
以上就是我对于linu中挂载点、VFS、以及学习当中遇到的一些困惑的思考。