前言
上一篇文章的最后我们讲解了文件的inode,那么文件名和inode有什么区别呢?区别就在于linux系统只认inode号,文件的inode属性中,并不存在文件名,而文件名其实是给用户用的。我们以前讲过linux文件目录,那么目录是文件吗?答案是是的,目录也是文件,并且目录也有inode,任何一个文件一定在目录里面,所以目录的内容是什么呢?首先目录的内部需要数据块,目录的数据块里面保存的是文件名和inode编号对应的映射关系,而且在目录内,文件名和inode互为key值,当我们访问一个文件的时候,我们是在特定目录下进行访问的,要找到inode需要先在当前目录下,找到文件对应的inode编号,一个目录也是一个文件,也一定属于一个分区,结合inode,在该分区中找到分组,在该分组的inode table中,找到文件的inode,通过inode和对应的datablock的映射关系,找到改文件的数据块,并加载到操作系统,并完成显示到显示器,下面我们进入本篇文章的主体
一、软硬链接
理解文件的增删查改
根据文件名找到inode -》number,从inode number到inode属性中的映射关系,设置block bitmap对应的比特位,然后将这个比特位置0即可。所以删除文件,只需要修改位图即可。
下面我们看一下inode和datablock的映射关系:
上图中我们只画出了直接索引,但其实并不仅仅是这样,因为直接索引能存放的数据太少了,而二级索引能存储的数据更多,二级索引所指向的数据块里面的内容,不是直接的数据,而是其他数据块的编号,二级索引上面还有三级索引,这些我们就不再介绍了 我们直接进入软硬链接的讲解:
我们先演示如何做一个软连接或硬链接:
建立软连接的命令是ln -s 文件名 软连接文件名
文件属性前面的l代表link,表示链接,下面我们看一下这个链接有什么:
我们发现这个链接指向刚刚那个原始文件,下面我们看看这个文件的inode:
软连接是一个独立的链接文件,有自己的inode number,必有自己的inode属性和内容。下面我们再演示一下硬链接:
硬链接就是刚刚的命令少掉-s选项即可,ln 文件名 硬链接文件名。
下面我们看看硬链接的文件和原始文件有什么关系:
我们发现硬链接和原始文件的inode一模一样,硬链接和目标文件共用一个inode number,意味着硬链接一定是和目标文件使用同一个inode的。
并且文件属性后面的数字都变成2了,这是什么意思呢?我们先讲原始文件删除看看有什么不一样的地方:
我们发现原来的2又变成1了但是inode依旧存在,我们看看可以读取吗
我们发现将原始文件删除后硬链接照样可以打印出原始文件的数据,而软连接则不可以并且显示文件不存在。那么硬链接是什么呢?硬链接其实就是一种引用计数,有相同的文件计数++,当我们删除文件的时候先--计数,只有当计数为0才会真正的将文件删除,如下图所示:
所以我们之前看到的文件属性后面的数字其实就是硬链接数,我们创建几个硬链接这个数字就会加几, 而软连接内部放的是自己所指向的文件的路径,而硬链接就是原始文件的引用。大家看到这里能联想到软连接是windows里面的什么吗?其实就是程序的快捷方式,我们将快捷方式删除是不影响真正的文件本身的,找到其文件路径照样可以打开软件,所以这就是软连接。上面的测试都是以普通文件做测试的,下面我们看看目录是什么样的:
为什么一个目录的硬链接数是2呢?通过我们刚刚的描述不难理解,是2的原因一定是因为有一个文件名和映射关系所指向了这个目录,首先目录名和自己的inode就是一个硬链接了,接下来我们进入目录里看看有什么文件指向这个目录:
我们发现这个空目录有隐藏文件,一个.和一个..,我们之前讲过.代表当前目录,..代表上级目录,并且最重要的是.这个文件的inode和目录的inode一模一样如下图所示:
那么..是否和.一个道理呢?答案是是的,..是上级目录的inode,如下图:
既然我们刚刚可以给文件加一个硬链接,那么目录是否也能呢,我们试试:
结果大家已经看到了,我们不能给目录加一个硬链接,这是为什么呢?为什么刚刚的. 和 .. 都能给目录建立硬链接,而我们却不行呢?因为操作系统不允许用户对目录建立硬链接,因为如果给目录建立硬链接容易造成环路的路径问题,如下图:
比如我们给上图中这个路径的107目录建立了硬链接,那么当我们用find进行查找路径的时候,找到了107中的硬链接,然后硬链接又将路径送回到107这样就永远找不到路径了,那么. 和 ..为什么可以避免这个问题呢?因为操作系统对这里做了特殊处理可以判断,而用户如果搞出这样的问题操作系统很难去判断是否造成环路如何解决。
文件的三个时间:
首先查看文件的时间的命令stat + 文件名:
change是对一个文件的属性做修改的时间如下图所示:
而modify是更改内容的时间,下面我们改一下看看:
不知道大家有没有发现,我们改内容后属性的时间也跟着变化了,这是因为更改文件内容会改变文件属性中的大小,所以属性也会变。Access是文件的访问时间,下面我们访问试试:
为什么我们访问了也没改呢?这是因为查看文件内容的比重很高,如果我们高频次的修改文件访问时间,就会高频次的访问磁盘将文件属性写入磁盘,这样会大大的消耗IO交互的成本,所以一般是访问多次修改一次时间。