kernel打开文件时,寻找目标节点
2018-01-31 本文已影响16人
zhjwang
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是起作用的。