文件系统中的目录查找

Linux中的一个进程在识别一个文件的时候,将文件名传递给VFS层,VFS要根据文件名查找这个文件的索引节点inode,以备后续对该文件的操作。通过文件名查找文件索引节点的过程就叫做路径查找(path lookup)。本文是在阅读目录查找代码时随手记录的笔记,会在不断的学习中不断补充。

路径查找的起始阶段,内核会从某一个特定的dentry开始查起,如果路径名是以‘/’开始,则起始的dentry是current->fs->root;否则,起始的dentry是current->fs->cwd。root和cwd在struct fs_struct中是一个<dentry, vfsmount>对,dentry表示目录对象,vfsmount表示一个文件系统对象。

路径查找开始后,内核从第一个dentry开始,找到它对应的索引节点;然后从磁盘读出包含那个索引节点的目录文件,获得索引节点。。。,反复执行上述操作,直到找到最后的文件。在上面的查找过程中,必须要考虑以下几点:

1,对获取到的inode的权限做审计和验证

2,因为查找目录对应的目录项对象是一个非常频繁且消耗IO的操作,内核在内存中维护了一个目录项高速缓存directory-entry cache,也叫dcache来加速查找目录项的过程。需要注意的是,从2.6版本起,dcache的通过RCU来减少锁竞争的开销,具体见这里http://www.linuxjournal.com/article/7124

3,当路径中遇到非本文件系统的挂载点时,需要扩展到该挂载点对应的文件系统来做目录查找

4,当路径中遇到符号链接时,也要做相应的处理

5,如果系统调用时一个create文件的操作,在查找的同时需要逐步创建各级目录

下面是具体实现的一些摘要

路径查找大代码绝大多数实现在fs/dcache.c fs/namei.c中,目录项对象struct dentry定义在include/linux/dcache.h中,其他一些与目录查找相关的结构体定义在include/linux/namei.h中。

路径名查找是由path_lookup函数执行的,它的调用方式如下:

int path_lookup(const char *name, unsigned int flags, struct nameidata *nd);

name是要解析的文件路径名,flags是一些标志,nd查找成功后的返回结果

struct nameidata {

struct path     path;   // 结构体path中是目录项对象的地址和文件系统对象的地址

struct qstr     last;     // 路径名的最后一个分量

struct path     root;

struct file     *file;

struct inode    *inode; /* path.dentry.d_inode */

unsigned int    flags;

unsigned        seq;

int             last_type;

unsigned        depth;    // 符号链接嵌套的当前级别

char *saved_names[MAX_NESTED_LINKS + 1];  // 与符号链接关联的路径数组

/* Intent data */

union {

struct open_intent open;

} intent;

};

参考文献:

1,linux2.6源代码

2,linux document: ./Document/filesystem/path_lookup.txt

时间: 2024-10-20 16:04:06

文件系统中的目录查找的相关文章

在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world

一.题目 编写一个内核模块,在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world.内核版本要求2.6.18 ? 二.实验环境 物理主机:win7 64bit, i5双核,8G内存 虚拟机:Vmware Workstation 10.0.2 虚拟主机: CentOs-5.11,内核2.6.18 ? 三.实验思路 在着手解决问题之前,我在网上查阅了一些资料,大多是关于模块的介绍.linux内核采用的是模块化编程,这样可以很容易的添加或

Hive数据导入——数据存储在Hadoop分布式文件系统中,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中!

转自:http://blog.csdn.net/lifuxiangcaohui/article/details/40588929 Hive是基于Hadoop分布式文件系统的,它的数据存储在Hadoop分布式文件系统中.Hive本身是没有专门的数据存储格式,也没有为数据建立索引,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据.所以往Hive表里面导入数据只是简单的将数据移动到表所在的目录中! Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中

DB2 WIN7 WIN8在指示的文件系统中找不到数据库目录

前言:win7下一些软件的不正常,跟win7的权限有很大关系. 在win7下安装db2 9.7客户端后,在cmd中运行db2cmd启动clp,输入db2的任何命令都显示:SQL5005C 系统错误 接着尝试用开始菜单中的快捷键 “命令窗口-管理器”,发现db2命令可用,探究原由,原来运行db2cmd必须以管理员的身份运行.虽然我的当前用户workman就是管理员,但就是不行. (ppjava2009 评论,运行db2cmd改成运行C:\IBM\SQLLIB\BIN>db2cwadmin.bat就

Linux 指令篇:文件或目录查找 --find

语 法:find    path    -option    [    -print ]    [ -exec    -ok    command ]    {} \; #-print                               将查找到的文件输出到标准输出 #-exec    command    {} \;       -----将查到的文件执行command操作,{} 和 \;之间有空格 #-ok 和-exec相同,                    只不过在操作前要询

linux 中的find查找基本命令

1.使用find命令搜索文件 Find命令:在本地文件系统中实时搜索,调用命令的用户必须具有要查看其内容的目录的读取和执行权限.搜索整个系统,则用起始目录/.Find的第一个参数是要搜索的目录,若省略了搜索目录,则从当前目录开始搜索,并在任何子目录中查找匹配项. 2.Find命令的一般形式:find pathname -options pathname表示所查找的目录路径,/表示系统根目录 Options常用的有下面这些: a. 按照文件名查找(-name) 例:[[email protecte

Linux文件系统中的inode节点详细介绍

这篇文章主要介绍了Linux文件系统中的inode节点,详细讲解了inode是什么.inode包含的信息.inode号码的相关资料等. 一.inode是什么? 理解inode,要从文件储存说起.文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block).这种由多个扇区组成的"块&q

Linux命令详解--文件与目录查找

一·文件搜索 which:用来查找命令的绝对路径-- 显示shell命令的绝对路径-- 仅仅会在PATH变量中搜索要查找的命令-- 搜索时先查找别名,然后从PATH中查找1.查看用户的PATH变量:命令的搜索路径# echo $PATH/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin command not found可能原因:1)敲错了2)命令没有安装3)命令

深入浅出文件系统中的日志系统功能

1.日志系统出现的背景 日志系统出现在20世纪末.最早的日志文件系统出现在1990年IBM的JFS(journal file system)上.1994年,为了更好地支持高性能,SilliconGraphics引进了XFS.从20011年开始,linux系统中就开始支持ext3fs.到了今天,ext4fs.Reiser4.ceph等文件系统都支持了日志系统. 2.日志系统的功能 日志文件系统的功能主要是为了提高文件系统的一致性和性能. 2.1一致性 通过日志系统记录写操作,避免异常关机.掉电等造

显示Hadoop文件系统中一组路径的文件信息

//显示Hadoop文件系统中一组路径的文件信息 //我们可以用这个程序来显示一组路径集目录列表的并集 package com; import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.