虚拟文件系统

VFS的层次

文件系统实现与用户进程(或C库)之间。

文件系统分类

基于磁盘的文件系统(ext2/3  fat  iso9660…)、虚拟文件系统(proc)、网络文件系统(nfs)

通用文件模型

VFS提供一种结构模型,包含了一个强大的文件系统所应具备的所有组件。所有的文件系统实现,都必须提供与VFS定义的结构配合的例程,以弥补两种试图之间的差异。

文件描述符

一个整数,在用户层所有有关文件的操作中用于标识一个文件,在打开文件时由内核创建,特定于进程。

inode

l  inode是什么?

2  inode用来存放文件的元数据(例如,文件的创建者、文件的创建日期、文件的大小等等)

2  注意inode并不包含文件名。

l  inode的内容

inode包含文件的元信息,具体来说有以下内容:

2  文件的size、文件属主的User ID、Group ID

2  文件的读、写、执行权限


文件的时间戳,:ctime(inode上一次变动的时间)、mtime(文件内容上一次变动的时间)、atime(文件上一次打开的时间)。

2  链接数,即有多少文件名指向这个inode。

2  文件数据分布在哪些磁盘Block。

l  inode的状态

每个inode处于三种状态中的一个:

2  inode位于内存中,未关联到文件;(inode_unused)

2  inode位于内存中,由一个或多个进程使用,已与磁盘同步;(inode_in_used)

2  inode处于活动使用状态,与磁盘上内容未同步,脏inode;

l  inode是如何组织的?

2  内核使用两种方式组织inode。


链表:每个inode都有一个i_list成员,可将inode存储在链表中。(inode出现在特定于超级块的链表中i_sb_list,同时出现在特定于状态的链表中,例如inode_in_used)

2  散列:每个inode同时出现在一个散列表中(根据inode号快速访问inode)。

l  目录是什么?

2  Linux下,目录也是文件,也有inode和数据部分,其数据部分内容如下:

第一部分表示对应inode的编号(系统内唯一),第二部分表示文件或目录的名字。

内核如何访问/user/bin/emacs

首先读取根目录(这个在内核中一直被维护,),在根目录文件的数据部分查找user这个目录项,根据其中的inode编号,获取inode。bin的查找类似,一直到查找到emacs,找到emacs对应的inode,该inode的数据部分即emacs这个文件(普通数据文件)的内容。

图示:

目录项缓存dentry

l  引入dentry

上述访问/user/bin/emacs过程非常耗时,需要不断地读取inode和对应的数据部分。为了加速,内核将之前访问过的目录或文件(统称为目录项)缓存起来,下次再访问同样的目录项(例如,/user/bin/vi的/user/bin/部分)时,可以直接找到对应的inode(上图中为10号)。

l  dentry的目的:

dentry的主要用途是建立文件名和inode之间的关联。

所以该结构体包括两个最主要的字段,d_inoded_name

其中,d_name为文件名。qstr是内核对字符串的封装(可以理解为带有散列值的char*)。

d_inode是与该文件名对应的inode。

l  dentry结构体:

struct dentry {

   

/* Where the name belongs to - NULL is negative
*/

   
struct inode
*
d_inode; 

struct qstr
d_name;

struct dentry
*
d_parent; /* parent
directory */

   
union {

   
struct list_head
d_child; /* child of parent
list */

   
struct rcu_head
d_rcu;

    }
d_u;

   
struct list_head
d_subdirs; /* our children
*/

   
struct dentry_operations
*
d_op;

   
struct super_block
*
d_sb; /* The root of the
dentry tree */

   
unsignedchard_iname[DNAME_INLINE_LEN_MIN];
/* small names */

};

l  什么时候创建

在VFS(以及文件系统实现)读取一个目录项(目录或普通文件)后,则创建一个dentry来缓存找到的数据。

l  内存中这些dentry如何组织管理


结构:各个dentry实例组成了一个网络,例如,当前dentry实例对应的所有文件和子目录相关联的dentry都归入到d_subdirs中。


组织方式一:内核所有活动的dentry实例都保存在一个散列表中,该散列表使用dentry_hashtable实现(全局dentry散列表)。

2  组织方式二:LRU链表,长时间不使用的dentry会被删除。

链接link

l  两类链接:符号链接(软链接)和硬链接。

l  符号链接(软链接)文件使用自己的inode,该inode的数据部分包含了一个字符串,给出了链接目标的路径。


硬链接创建时,使用了已有的inode编号。硬链接建立以后,无法区分原来的文件和新建的硬链接文件。这种情况下,inode使用计数器来确保文件删除操作中,当没有其他文件使用该inode时,才能真正删除该inode。

示意图:

特定于进程的信息

struct task_struct {

...

/* 进程的文件系统相关的信息*/

struct fs_struct
*fs;

/* 该进程打开的文件 */

struct files_struct
*files;

...

}

struct files_struct {

...

struct fdtable
fdtab;

struct file *
fd_array[NR_OPEN_DEFAULT];

};

struct file {

...

struct path *f_path;

loff_t   f_pos;

...

};

struct file_operations {

...

ssize_t (*write)
(struct file *, constchar
__user *, size_t, loff_t *);

int (*readdir)
(struct file *, void *, filldir_t);

unsignedint (*poll) (struct
file *, struct poll_table_struct *);

int (*ioctl)
(struct inode *, struct file *,
unsignedint,
unsignedlong);

int (*mmap)
(struct file *, struct vm_area_struct *);

int (*open)
(struct inode *, struct file *);

...

};

struct
file_operations->open函数实质上是将一个file对象关联到一个inode。

poll函数也在其中。

从task到dentry/inode

虚拟文件系统,布布扣,bubuko.com

时间: 2024-10-24 22:23:55

虚拟文件系统的相关文章

虚拟文件系统-VFS

1.什么是虚拟文件系统? OpenCms将所有的资源都存放在数据库中,这些资源的节点共同构成了虚拟文件系统(VFS,Virtual File System).虚拟文件系统可以在传统工作空间中查看. 虚拟文件系统可以看做一个实际的文件系统,它提供实际文件系统中提供的功能: 文件.文件夹的移动.复制.删除. 权限设置. 资源编辑锁定. 资源创建时间.最后修改时间记录. 此外,它还扩展了一些功能: 资源类型定义(不仅限于文件.文件夹). 自定义资源属性. 资源关联. 资源历史记录保存与恢复. 资源移动

linux文件系统体系结构 和 虚拟文件系统(VFS)

图 1. Linux 文件系统组件的体系结构 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开.读取.写和关闭)提供用户接口.系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点. VFS 是底层文件系统的主要接口.这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大.有两个针对文件系统对象的缓存(inode 和 dentry).它们缓存最近使用过的文件系统对象. 每个文件系统实

使用 /proc 文件系统来访问 linux操作系统 内核的内容 && 虚拟文件系统vfs及proc详解

http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/20130422/366044.html 使用 /proc 文件系统来访问 Linux 内核的内容 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口 简介: /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux? 内核空间和用户空间之间进行通信.在 /proc 文件系统中,

Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介

Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理子系统.网络子系统.虚拟文件系统在这个阶段进行分析的,但是为了让大家对内核有个整体的把握,今天还是简单的介绍一下剩余的几个子系统,我们对这几个子系统的分析,只要了解其作用和部分内容即可,不必深究,等我们写上几个驱动,到时候按照驱动再来分析这几个子系统我们就清晰多了. 在http://www.cnblogs.com/wrjvszq/p/4257164.html一文我们提到过linux

Linux虚拟文件系统(VFS)学习

虚拟文件系统(Virtual Filesystem)也可称之为虚拟文件系统转换(Virtual Filesystem Switch),是一个内核软件层,用来处理与Unix标准文件系统相关的所有系统调用.其健壮性表现在能为各种文件系统提供一个通用的接口. 通用文件系统模型 VFS所隐含的主要思想在于引入一个通用的文件系统模型(common file model),这个模型能够表示所有支持的文件系统.在通用文件模型中,每个目录被看做一个文件,可以包含若干文件和其他的子目录. 通用文件模型由下列对象类

11Linux服务器编程之:VFS虚拟文件系统,dup()函数和dup2()函数

 1dup函数和dup2函数 #include<unistd.h> int dup(intoldfd); int dup2(intoldfd, int newfd); dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体.如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2.如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体

Linux内核设计基础(四)之虚拟文件系统

先来看一下写文件函数write的执行过程: ret = write(fd, buf, len); write适用于各种文件系统,它首先执行sys_write(),而正是这个sys_write()进行实际文件系统类型的判别并执行该类型文件系统下的写操作.我们可以看出在多种多样的文件系统上抽象出了一个通用接口性质的虚拟文件系统. 我们这里非常关心Linux 2.6是如何去实现VFS的.先来看一下VFS中的四个主要的对象类型: 超级块对象,它代表一个具体的已安装文件系统. 索引节点对象,它代表一个具体

linux虚拟文件系统浅析

linux虚拟文件系统浅析 虚拟文件系统(VFS)在我看来, "虚拟"二字主要有两层含义:1, 在同一个目录结构中, 可以挂载着若干种不同的文件系统. VFS隐藏了它们的实现细节, 为使用者提供统一的接口;2, 目录结构本身并不是绝对的, 每个进程可能会看到不一样的目录结构. 目录结构是由"地址空间(namespace)"来描述的, 不同的进程可能拥有不同的namespace, 不同的namespace可能有着不同的目录结构(因为它们可能挂载了不同的文件系统).操作

fuse 虚拟文件系统 的 安装与使用

FUSE 是个好东西, 可以用在特殊的领域里面来实现自己的虚拟文件系统. FUSE的下载与安装 : 从fuse官网下载最新安装包:http://sourceforge.net/projects/fuse/files/fuse-2.X/ 安装很简单: ./configure make make install(注意:这一步要在root用户模式下做) 挂载 fuse 虚拟文件系统: modprobe fuse 查看fuse是否挂载成功: lsmod|grep fuse  执行该命令后会输出 [[em