kernel打开文件时,寻找目标节点

1.对于一切结文件的Linux来说,最复杂的操作莫过于对文件的查找。

例如要打开 /mnt/win/dir1/abc 这个文件,就是根据这个路径,找到‘abc’ 对应的 dentry ,进而得到 inode 的过程。

2.最近在使用ecryptfs时,遇到一个问题

举个例子说明以下问题:当我挂载ecryptfs时,如果说挂载的目录已经被打开了,那么ecryptfs是不会起作用的。比如我使用ecryptfs挂载/home/test这个目录,但是在做挂载这一步之前,我已经进入了/home/test这个目录。这个时候就不会生效。

3.带着这个问题,研究了ecryptfs以及相关的内核源码

  • 1.首先可以明确一点的是,在mount ecryptfs时,会将vfs的fop替换成ecryptfs自己实现的fop。
  • 2.但是当你直接在这个目录下访问文件时(指的是,在挂载之前,就已经进去的那个目录)。是不会过ecryptfs的。

4.问题的答案

这个和打开的过程有关。kernel的打开过程大概如下

sys_open -> do_filp_open -> path_openat -> path_lookupat -> link_path_walk

在查找需要打开的文件时,会判断是从绝对路径开始找,还是从当前目录找。不管是从哪里开始找,都会在dentry cache 中依据父dentry,来查找即将要打开的文件。所以说如果挂载之前就处于挂载目录中,就会使用之前的cache,而不会使用新挂上去的ecryptfs。你只需要执行cd $pwd就可以重新刷新dentry cache.
所以直接在当前目录下是没有作用的,但是当你以绝对路径来访问挂载目录时,ecryptfs是起作用的

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,643评论 9 467
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,242评论 2 33
  • Linux系统一般有4个主要部分: 内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本...
    偷风筝的人_阅读 3,284评论 1 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 偶像,包含的是一种情怀。 ——题记 原来 前几日,看见一则说说,主人大意讲他从小崇拜的一个叔叔或...
    水边漫步的娃Christine阅读 331评论 0 1