dentry和inode的关系

vfs 是具体文件系统(如 ext4、nfs、fat)和 Kernel 之间的桥梁,它将各个文件系统抽象出来并提供一个统一的机制来组织和管理各个文件系统,但具体的实现策略则由各个文件系统来实现,这很好的屏蔽的各个文件系统的差异,也非常容易扩展,这就是 Linux 著名格言“提供机制而不是策略”的具体实践。vfs 中有两个个很重要的数据结构 dentry 和 inode,dentry 就是“目录项”保存着诸如文件名、路径等信息;inode 是索引节点,保存具体文件的数据,比如权限、修改日期、设备号(如果是设备文件的话)等等。文件系统中的所有的文件(目录也是一种特殊的文件)都必有一个 inode 与之对应,而每个 inode 也至少有一个 dentry 与之对应(也有可能有多个,比如硬链接)。结合下图我们可以更清晰的理解这个架构:
【dentry-inode 结构图】

 首先有这样一个文件:/home/user1/file1,它的目录项中 d_parent 指针指向它所在目录的目录项 /home/user1(1),而这个目录项中有一个双向链表 d_subdirs,里面链接着该目录的子目录项(2),所以 /home/user1/file1 目录项里的 d_u 也加入到了这个链表(3),这样一个文件上下关系就建立起来了。同样,/home/user1 的 d_parent 将指向它的父目录 /home,并且将自己的 d_u 链接到 /home 的 d_subdirs。file1 的目录项中有一个 d_inode 指针,指向一个 inode 结构(4),这个就是该文件的索引节点了,并且 file1 目录项里的 d_alias 也加入到了 inode 的链表 i_dentry 中(5),这样 dentry 和 inode 的关系也建立起来了。前面讲过,如果一个文件的硬连接不止一个的话就会有多个 dentry 与 inode 相关联,请看图中 /home/user2/file2,它和 file1 互为硬链接。和 file1 一样,file2 也把自己的 d_inode 指向这个 inode 结构(6)并且把 d_alias 加入到了 inode 的链表 i_dentry 里(7)。这样无论是通过 /home/user1/file1 还是 /home/user2/file2,访问的都是同一个文件。还有,目录也是允许硬链接的,只不过不允许普通用户创建目录的硬链接。
    但是 Kernel 并不直接使用这样的结构来进行路径的遍历,为了提高效率 Kernel 使用散列数组来组织这些 dentry 和 inode,这已经超出我们的讨论范围了

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值