dentry和inode

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dentry和inode相关的知识,希望对你有一定的参考价值。

文件系统在内存中以inode和dentry的方式展现:inode是底层文件/目录的对象, dentry是一个带有字符串的名称(d_name)的对象,有一个指向inode的指针(d_inode)和指向父dentry(d_parent)的指针

一个典型的树状结构:

  /

  |

  foo

  |  \

  bar  bar2

四个inode,分别用于/,foo,bar,bar2.三个dentry,分别用于/->foo, foo->bar, foo->bar2

注意d_inode给出的从dentry到inode的映射都是多对一的映射,单文件在同一个文件系统中可能被多个路径指向(称作"硬链接"),在这种情况下,只要用一个path存在,都不能被删除.

文件和目录可以由进程打开,一个struct file用来表示这个.其包含一个指向目录项的指针,只要有进程打开这个文件,则此底层文件将不会被删除,即使该文件无法通过文件系统内的任何路径获得. (详见这里)

struct file
{
  //...
  struct path        f_path;
#define f_dentry    f_path.dentry  
  //...    
}

inode另外还有指向超级块的i_sb指针,一个代表底层文件系统(通常代表存储在本地分区上的物理文件系统或者远程文件系统NFS)的结构

然而,进程看到的命名空间(详见这里)通常由多个而非一个单独的文件系统组成; 多个不同的文件系统在在彼此的顶部安装. 挂载点的结构是由一个vfsmount的结构树构成,每个挂载点一棵

除了父级和子级vfsmount的链接之外,每个vfsmount包括了: mnt_root(一个指向dentry的指针,它是vfsmount的根), mnt_mountpoint(一个指向dentry的指针,这个dentry是vfsmount所挂载上的)

vfsmount和底层文件系统的关系也是多对一;使用mount --bind可以将相同的文件系统挂载在不同的位置.从而导致不同的vfsmount共享相同的dentry,inode和superblock.

以下一条路径:/foo/bar:

  1.从task->fs->rootmnt开始,dentry在task->fs->root

  2.找到d_name是"foo"的dentry并且其d_parent是/

  3.检查有东西挂载在这个dentry上,如果有,替换

  4.重复步骤2直到结束

struct task_struct
{
  //...
  
/* Open file information: */
  struct file_struct  *files;
  //...
};

struct fs_struct
{
  int users;
  rwlock_t lock;
  int umask;
  int in_exec;
  struct path root, pwd;
}

struct namespace //2.6.20之后被拆分到不同的文件里了
{
  atomic_t count;
  struct vfsmount *root;
  struct list_head list;
  struct rw_semaphore sem;
}

以上是关于dentry和inode的主要内容,如果未能解决你的问题,请参考以下文章

dentry与inode有什么联系和区别

VFS(虚拟文件系统)中的inode和dentry关系混淆,文件名和inode之间的映射在哪里

dentry与inode有啥联系和区别

文件系统VFS数据结构(超级块 inode dentry file)(收集整理)

VFS,super_block,inode,dentry—结构体图解

Linux VFS分析