目录
1.创建文件的本质
1.1目录本身也是一个文件,也有他自己的inode
1050798不就是code的inode吗
1.2LINUX创建文件,一定是在目录中创建文件。
文件名不是文件的属性,也不是文件的内容,那文件名到底有什么用呢?
................................................................(省略在磁盘寻找inode和datablock的过程)
文件名的作用就是,在我们创建文件的时候,把文件名与文件的Inode编号映射起来。
然后把这个映射写入到目录文件当中,然后我们通过文件的名字,就能拿到inode编号,拿到inode编号就能,查到这个文件的所有信息了。
2.重谈文件的增删查改
2.1为什目录没有写权限,就不能新建文件。
因为不能把文件的映射关系写入到目录文件,删除同理。
2.2.文件的查找
在用户使用LIUNX系统的时候,我们查找一个文件用的都是路径去查找,但是想找到一个磁盘的文件,必须找到该文件的inode,怎么用一个路径,就找到文件的inode的呢?
例:我想找到test.c这个文件
这个文件的路径是/home/wys/code/buffer/test.c
想找到test.c,就必须找到先找到buffer目录的inode,想找到buffer目录的inode,就必须先找到code的目录的inode。
依次类推,直到根目录,根目录的inode编号是确定的,系统是直接知道的,开机的时候,就会用这个编号,将根目录打开到内存当中,根目录的inode编号是2。
所以在内核中查找一个文件,都要逆向递归般的得到根目录,从根目录进行目录解析。
解析好的目录会被缓存在一个dentry的内核数据结构中(dentry就是描述目录的数据结构)
里面存在的是这个路径与文件inode 的直接映射,而且dentry是内存级别的,就不用去磁盘里重新寻找,提高了文件系统个的效率。
3.路径
现在我们已经了解,查找一个文件,根据路径和文件名拿到inode编号,去对应分区,经过简单计算,算出是在哪一个分组,然后就能找到对应文件的inode。
现在一个重要问题,我们怎么知道这个inode编号是在哪一个分区的呢?
3.1挂载
不得不提到一个重要的概念“挂载”
一个文件系统所对应的分区要想被使用必须先被挂载到对应的目录。
使用mount命令查看
因为我这个云服务器只有一块盘,所以只有一个ext4的文件系统。
这个文件系统的分区是被挂载到根目录的 /dev/vdal on /。
3.2如何理解挂载
文件系统在内核中一定不是凭空存在的,一定要被一种内核的数据结构描述(file_systerm_type),这种数据结构操作系统是不可见的,因为他不在操作系统的文件系统树中。
但是目录在操作系统的文件系统树上,只需要将描述其的内核数据结构file_systerm_type与dentry关联起来,不就能找到这个分区了吗。
操作系统能找到文件系统树上的目录,访问目录就是访问对应的分区。
所以如何找到分区的问题也就迎刃而解了,分区被挂载到对应的目录上,访问目录就是访问对应的分区。