① linux下的虚拟文件系统究竟起到什么作用
要明白虚拟文件系统之前必须先搞清楚什么是文件。狭义地说,“文件”是指“磁盘文件”,进而可以是有组织有次序地存储于任何介质(包括内存)中的一组信息。广义地说,凡是可以产生或消耗信息的都是文件。比方说设备文件、管道、套接字以及/proc目录下的特殊文件(实际上只存在于内存中),这些都是“文件”。磁盘文件只不过是个特例而已,你可以认为他是在磁盘设备上存储的、按照一定次序组织在一起的一组相关的信息。上面这些是我从书上抄的,但我自己的看法是,计算机系统中所有内核向应用程序提供的信息输入输出接口都是文件。所以应用层看到的“文件”已经是被操作系统抽象过的一个输入输出接口。拿磁盘文件来说,对应用而言它看到的是一个个文件按照目录结构组织起来的一棵树,但实际上磁盘设备并不知道这么回事儿,它只认识磁头、柱面和扇区。从这个角度上来说,应用程序看到的文件本身就是虚拟的。所谓的对文件操作最终都要落实到磁盘设备对某些扇区的读写上,但这些都是内核处理的,应用程序是看不见这一切的。知道了广义的文件系统定义之后就不难理解,作为一个通用操作系统,linux需要为用户程序提供一个统一的系统操作界面来完成对各种文件的访问。虚拟文件系VFS就是这么一个统一的、抽象的、虚拟的文件操作界面。你可以认为它是应用层与驱动层之间的一个中间层,对上提供一组标准的接口open/close/read/write/lseek,对下则又根据不同的文件类型调用不同的驱动程序提供的接口完成对具体设备的操作。这些操作通常是通过读写外设上(磁盘也是外设)的控制寄存器和存储区间来完成的。不知道我这样解释你明白了没,要是还不明白可以看看我共享在网络知道上的《Linux内核源代码情景分析》,那里面有更详细的说明。
② 什么是Linux虚拟文件系统VFS
虚拟文件系统(VFS)其实也可以翻译成虚拟文件系统转换(virtual filesystem switch)。可以看出来它的作用就是提供一个通用的接口来处理与Unix标准文件系统相关的所有系统调用。它所隐含的思想就是把表示很多不同种类的文件系统的共同信息放入内核;其中有一个字段火函数来支持linux所支持的所有实际文件系统所提供的任何操作。对所调用的每个读写或者其他函数,内核都能把它们替换成支持本地linux文件系统,NTFS文件系统或者文件所在的任何文件系统的实际函数。至于vfs的工作原理 就不是三言两语可以解释清楚的了、里面包含了很多知识包括文件系统、超级块、i节点等等知识。其实主要就是用户安装了不同的文件系统,每个特定文件系统上都实现了包括open() close(),read(),write()等等的操作,在安装的时候,每个特定的文件系统会在虚拟文件系统上注册,当用户需要对特定文件系统进行操作时 只需调用统一的系统调用,虚拟文件系统能够调用对应文件系统上的函数来对文件进行操作。详细的工作原理和实现 楼主需要花时间去学一学操作系统知识可一参考《深入理解Linux内核》《深入linux内核架构》等书
③ linux虚拟文件系统的关键数据结构有哪些
linux虚拟文件系统核心数主要有以下几个数据结构:*超级块结构(structsuper_block{…})该结构保存了一个被安装在linux系统上的文件系统的信息。对于基于磁盘的文件系统,该结构一般和保存在磁盘上的"文件系统控制块"对应。也就是说如果是磁盘文件系统,该结构保存的磁盘文件系统的控制信息。*inode结构(structinode{…})该结构中存储的是一个特定文件的一般信息,对于一个基于磁盘的文件系统,该结构对应磁盘上的"文件数据控制块"。每一个inode结构都对应一个inode节点号,这个节点号是唯一的,它也唯一标识一个文件系统中的文件。*file结构(structfile{…})该结构中存储的是一个打开的文件和打开这个文件的进程间的交互信息。该结构保存在kernel的内存区,在打开文件时被创建,关闭文件时被释放。*dentry结构(structdentry{…})该结构存储的是目录实体和对应的文件的关联信息。
④ 什么是虚拟文件系统,linux系统文件系统
1引言Linux中允许众多不同的文件系统共存,如ext2,ext3,vfat等。通过使用同一套文件I/O系统调用即可对Linux中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的操作可以跨文件系统而执行。如图1所示,我们可以使用cp命令从vfat文件系统格式的硬盘拷贝数据到ext3文件系统格式的硬盘;而这样的操作涉及到两个不同的文件系统。图1.跨文件系统的文件操作“一切皆是文件”是Unix/Linux的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、套接字等在Unix/Linux中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。图2.一切皆是文件而虚拟文件系统正是实现上述两点Linux特性的关键所在。虚拟文件系统(VirtualFileSystem,简称VFS),是Linux内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖VFS共存,而且也依靠VFS协同工作。为了能够支持各种实际文件系统,VFS定义了所有文件系统都支持的基本的、概念上的接口和数据结构;同时实际文件系统也提供VFS所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被Linux支持,就必须提供一个符合VFS标准的接口,才能与VFS协同工作。实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS层和内核的其他部分看来,所有文件系统都是相同的。图3显示了VFS在内核中与实际的文件系统的协同关系。图3.VFS在内核中与其他的内核模块的协同关系我们已经知道,正是由于在内核中引入了VFS,跨文件系统的文件操作才能实现,“一切皆是文件”的口号才能承诺。而为什么引入了VFS,就能实现这两个特性呢?在接下来,我们将以这样的一个思路来切入文章的正题:我们将先简要介绍下用以描述VFS模型的一些数据结构,总结出这些数据结构相互间的关系;然后选择两个具有代表性的文件I/O操作sys_open()和sys_read()来详细说明内核是如何借助VFS和具体的文件系统打交道以实现跨文件系统的文件操作和承诺“一切皆是文件”的口号。
⑤ VFS是什么在linux内核中主要作用是什么
老生长谈:这个呢是一个叫着虚拟文件系统 虚拟就是不真实不是实际的东西文件就是linux把所以的设备资源当文件一样看待系统就是调度,管理文件的
⑥ 什么是虚拟linux什么是linux虚拟机
一种安装在Windows上的虚拟linux操作环境,就被称为linux虚拟机。它实际上只是个文件而已,是虚拟的linux环境,而非真正意义上的操作系统。但是它们的实际效果是一样的。windowsXP虚拟机vmware下安装Linux 我们在实际的WindowsXP中再虚拟出一台电脑(虚拟机),并在上面安装Linux系统,这样,你就可以放心大胆地进行各种Linux练习而无须担心操作不当导致宿主机系统崩溃了。并且你可以举一反叁,将一台电脑变成叁台、四台,再分别安装上其他的系统。
⑦ linux 虚拟内存 是什么
和windows下的虚拟内存是一个概念啊,是内存不够用时,把硬盘的空间拿来当内存用喽,用以提高计算机的性能。
⑧ linux 虚拟文件系统的作用以及工作原理~~
我的理解,虚拟文件系统其实就是 通用文件操作的统一API接口,因为LINUX支持很多文件系版统,他不可能为权每个文件系统都设计一个API接口,这样,LINUX累,运行在LINUX上的程序更累,所以LINUX为了简化操作,就设计的通用API接口(专业术语,就是虚拟文件系统),这样程序不必关心,运行在LINUX上的是哪个文件系统,就对程序透明了,而具体的文件系统操作,有LINUXn内核完成就说这么多了,不懂可以再问O(∩_∩)O~
⑨ 什么是虚拟文件系统优点是什么Linux常用的文件系统是什么
你好虚拟文件系统(vfs)是由sunicrosystems公司在定义网络文件系统(nfs)时创造的。它是一种用于网络环专境的分布式属文件系统,是允许和操作系统使用不同的文件系统实现的接口。优点是:vfs使linux同时安装、支持许多不同类型的文件系统成为可能。vfs拥有关于各种特殊文件系统的公共界面,如超级块、inode、文件操作函数入口等。实际文件系统的细节,统一由vfs的公共界面来索引,它们对系统核心和用户进程来说是透明的。linux中经常使用reiserfs文件系统
⑩ 虚拟文件是什么啊
虚拟文件系统虚拟文件系统作 者: difeijing Richard Gooch 23-APR-1999 翻译:difeijing 本文档中的惯例用法 ================== 文档中的每一节标题的右边都有一个字符串""。 每个小节都会有个""在右边。 这些字符串是为了在文档中查询更容易而设的。 注意:本文档的最新更新可在下面找到: http://www.atnf.csiro.au/~rgooch/linux/docs/vfs.txt 它到底是什么? ============= Virtual File System(或者被称为Virtual Filesystem Switch)是Linux内核中的一个软件层,用于给用户空间的程序提供文件系统接口。它也提供了内核中的一个抽象功能,允许不同的文件系统共存。 它的工作方式的概览 ================== 在这一节里,在讲解细节问题之前,我会简单扼要的介绍一下VFS是如何工作的。首先,介绍一下当用户程序打开或者操作文件时发生了些什么,然后看看一个文件系统是如何被支持的。 打开一个文件 ———— VFS实现了open(2)系统调用。路径参数被VFS用来在目录入口缓存(dentry cache or "dcache")。这提供了一个将路径名转化为特定的dentry的一个快的查找机制。 一个单独的dentry通常包含一个指向i节点(inode)的指针。i节点存在于磁盘驱动器上,它可以是一个规则文件,目录,FIFO文件,等等。 Dentry存在于RAM中,并且永远不会被存到磁盘上:它们仅仅为了提高系统性能而存在。i节点存在于磁盘上,当需要时被拷入内存中,之后对它的任何改变将被写回磁盘。存在于RAM中的i节点就是VFS的i节点,dentry所包含的指针指向的就是它。 dcache是你的整个文件空间的观察点。跟Linus不同,我们中的大多数人不可能有足够的RAM空间来放我们的文件空间的所有文件的目录入口缓存 (dentry),所以我们的dcache会有缺少的项。为了将路径名转换为一个dentry,VFS不得不采取创建dentry的方式,并在创建 dentry时将指针指向相应的i节点。这是通过对i节点的查找完成的。 为了查找一个文件的i节点(通常从磁盘上读),VFS需要调用该文件的父目录的lookup()方法,此方法是特定的文件系统所设置的。后面对此将会有更详尽的描述。 一旦VFS得到了所需要的dentry(同时也得到了相应的i节点),我们就能够对文件做想要的操作:打开文件,或者用stat(2)来看i节点中的数据。stat(2)的操作非常简单:在VFS得到dentry之后,它取得inode中的一些数据并将其中的一部分送回用户空间。打开一个文件需要其它的操作:分配一个struct file(定义于linux/fs.h,这是内核中的文件描述)结构。新分配的struct file结构被指向dentry的指针和对文件进行操作的函数集合所初始化,这些都是从i节点中得到的。通过这种方式,特定的文件系统实现才能起作用。 文件结构(struct file)被放在进程的文件描述符表中。 读,写和关闭文件(或者其它的VFS操作)是通过使用用户空间的文件描述符找到相应的文件结构(struct file),然后调用所需要的方法函数来实现的。 当文件处于打开状态时,系统保持相应的dentry为"open"状态(正在使用),这表示相应的i节点在被使用。 注册和安装一个文件系统 ———————- 如果你想在内核中支持一种新的文件系统的话,你所需要做的仅仅是调用函数register_filesystem().你向内核中传递一个描述文件系统实现的结构(struct filesystem), 此结构将被加入到内核的支持文件系统表中去。你可以运行下面的命令: % cat /proc/filesystems 这样可以看到你的系统支持哪些文件系统。 当一个mount请求出现时,VFS将会为特定的文件系统调用相应的方法。安装点的dentry结构将会被改为指向新文件系统的根i节点。 现在是看看细节的时候了,nice to look! struct file_system_type ======================= 此结构描述了文件系统。在内核2.1.99中,此结构的定义如下: (注:在2.2的内核中,此结构也没有变化) struct file_system_type { const char *name; int fs_flags; struct super_block *(*read_super) (struct super_block *, void *, int); struct file_system_type * next; }; 其中各个域的意义: name:文件系统的类型名称,如"vfat","ext2",等等。 fs_flags:变量标志,如FS_REQUIRES_DEV, FS_NO_DCACHE,等等. read_super:当此种文件系统的一个新的实例要被安装时,此方法会被调用。 next:被内部的VFS实现所使用,你只需要将其初试化为NULL。 函数read_super具有以下的参数: struct super_block *sb:超级块结构。此结构的一部分被VFS初始化,余下的部分必须被函数read_super初始化。 void * data:任意的安装选项,通常是ASCII的字符串。 int silent:表示当出现错误时是否保持安静。(不报警?) read_super方法必须确定指定的块设备是否包含了一个所支持的文件系统。当成功时返回超级块结构的指针,错误时返回NULL。 read_super方法填充进超级块结构(struct super_block)的最有用的域是"s_op"域。这是一个指向struct super_operations的指针,此结构描述了文件系统实现的下一层细节。 struct super_operations ======================= 此结构描述了VFS对文件系统的超级块所能进行的操作。 在内核2.1.99中,此结构的定义如下: (注:在2.2的内核中,此结构已经有了改变) struct super_operations { void (*read_inode) (struct inode *); void (*write_inode) (struct inode *); void (*put_inode) (struct inode *); void (*delete_inode) (struct inode *); int (*notify_change) (struct dentry *, struct iattr *); void (*put_super) (struct super_block *); void (*write_super) (struct super_block *); int (*statfs) (struct super_block *, struct statfs *, int); int (*remount_fs) (struct super_block *, int *, char *); void (*clear_inode) (struct inode *); }; 除非特别提出,所有的方法都在未加锁的情况下被调用,这意味着大多数方法都可以安全的被阻塞。所有的方法都仅仅在进程空间被调用(例如,在中断处理程序和底半部中不能调用它们) read_inode:从一个文件系统中读取一个特定的i节点时调用此方法。i节点中的域"i_ino"被VFS初始化为指向所读的i节点,其余的域被此方法所填充。 write_inode:当VFS需要向磁盘上的一个i节点写时调用。 put_inode:当VFS的i节点被从i节点缓冲池移走时被调用。此方法是可选的。 delete_inode:当VFS想删除一个i节点时调用次方法。 notify_change:当VFS的i节点的属性被改变时调用。若此域为NULL则VFS会调用rite_inode.此方法调用时需要锁住内核。 put_super:当VFS要释放超级块时调用(umount一个文件系统).此方法调用时需要锁住内核。 write_super:当VFS超级块需要被写入磁盘时被调用。此方法为可选的。 statfs:当VFS需要得到文件系统的统计数据时调用。此方法调用时需要锁住内核。 remount_fs:当文件系统被重新安装时调用。此方法调用时需要锁住内核。 clear_inode:当VFS清除i节点时调用。可选项。 以上方法中,read_inode需要填充"i_op"域,此域为一个指向struct inode_operations结构的指针,它描述了能够对一个单独的i节点所能进行的操作。 struct inode_operations ======================= 此结构描述了VFS能够对文件系统的一个i节点所能进行的操作。 在内核2.1.99中,此结构的定义如下: (注:在2.2的内核中,此结构已经有了少许改变) struct inode_operations { struct file_operations * default_file_ops; int (*create) (struct inode *,struct dentry *,int); int (*lookup) (struct inode *,struct dentry *); int (*link) (struct dentry *,struct inode *,struct dentry *); int (*unlink) (struct inode *,struct dentry *); int (*symlink) (struct inode *,struct dentry *,const char *); int (*mkdir) (struct inode *,struct dentry *,int); int (*rmdir) (struct inode *,struct dentry *); int (*mknod) (struct inode *,struct dentry *,int,int); int (*rename) (struct inode *, struct dentry *, struct inode *, struct dentry *); int (*readlink) (struct dentry *, char *,int); struct dentry * (*follow_link) (struct dentry *, struct dentry *); int (*readpage) (struct file *, struct page *); int (*writepage) (struct file *, struct page *); int (*bmap) (struct inode *,int); void (*truncate) (struct inode *); int (*permission) (struct inode *, int); int (*smap) (struct inode *,int); int (*updatepage) (struct file *, struct page *, const char *, unsigned long, unsigned int, int); int (*revalidate) (struct dentry *); }; default_file_ops:这是一个指向struct file_operations的指针,包含了对一个打开的文件所能进行的操作。 create:被open(2)和creat(2)所调用,仅仅在你要支持普通文件时才需要。参数中的dentry不应该包含有i节点的指针(即应该为一个negative dentry)。这里你可能需要对传入的dentry和i节点调用函数d_instantiate. lookup:当VFS要在一个父目录中查找一个i节点时调用。待查找的文件名在dentry中。此方法必须调用d_add函数把找到的i节点插入到 dentry中,i节点的"i_count"域要加一。若指定的i节点不存在的话,一个NULL的i节点指针将被插入到dentry中去(这种情况的 dentry被称为negative dentry)。Returning an error code from this routine must only be done on a real error, otherwise creating inodes with system calls like create(2), mknod(2), mkdir(2) and so on will fail.If you wish to overload the dentry methods then you should initialise the "d_dop" field in the dentry; this is a pointer to a struct "dentry_operations".This method is called with the directory semaphore held。 link:被link(2)所调用。仅在你需要支持hard link时才需要它。跟create方法相同的原因,你可能在此方法中也需要调用d_instantiate()函数来验证。 unlink:被unlink(2)所调用。仅在你要支持对i节点的删除时才需要它。 symlink:被symlink(2)调用。仅在需要支持符号链接时才需要它。通上面两处,你需要对传入的参数进行验证,要调用d_instantiate()函数。 mkdir:被mkdir(2)调用。仅在你要支持建立子目录时才需要它。同上,你需要调用d_instantiate()函数进行验证。 rmdir:被rmdir(2)所调用。仅在你要支持对子目录的删除时才需要它。 mknod:被mknod(2)所调用,用于建立一个设备i节点,或者FIFO,或socket.仅当你需要支持对这些类型的i节点的建立时才需要此方法。同上面几个,你可能也需要调用_instantiate来验证参数。 readlink:被readlink(2)调用。仅当你要支持对符号链接的读取才需要它。 follow_link:被VFS调用,用以从一个符号链接找到相应的i节点。仅当你需要支持符号链接时才需要此方法。 struct file_operations ====================== 结构file_operations包含了VFS对一个已打开文件的操作。 在内核2.1.99中,此结构的定义如下: (注:在2.2的内核中,此结构已经有了少许改变) struct file_operations { /*在VFS需要移动文件位置指针时被调用 */ loff_t (*llseek) (struct file *, loff_t, int); /* 被read系统调用所使用 */ ssize_t (*read) (struct file *, char *, size_t, loff_t *); /* 被write系统调用所使用 */ ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *); int (*fasync) (struct file *, int); int (*check_media_change) (kdev_t dev); int (*revalidate) (kdev_t dev); int (*lock) (struct file *, int, struct file_lock *); }; llseek:当VFS需要移动文件指针的位置时调用。 read:被read(2)所调用。 write:被write(2)所调用。 readdir:当VFS需要读取目录中的内容时被调用。 poll: called by the VFS when a process wants to check if there is activity on this file and (optionally) go to sleep until there is activity. (注:这里我怎么想都翻不好,所以就把原文放在这里了,poll就是相当于select的东西) ioctl:被ioctl(2)所调用。 mmap:被mmap(2)所调用。 open:当VFS要打开一个i节点时调用它。当VFS打开一个文件时,它建立一个新的struct file结构,并用i节点中的"default_file_ops"来初始化其中的f_op域,然后对新分配的文件结构调用open方法。你可以认为 open方法实际上属于struct inode_operations。I think its done the way it is because it makes filesystems simpler to implement.open方法是一个很好的初始化文件结构中的"private_data"域的的地方。 release:当没有对被打开文件的引用时调用此方法。 fsync:被fsync(2)所调用。 fasync:当用fcntl(2)激活一个文件的异步模式时此方法被调用。 这些文件操作是由i节点所在的特定文件系统所实现的。当打开一个设备节点时(字符或块设备特殊文件),大多数文件系统会调用VFS中的特定支持例程,由此来找到所需要的设备驱动信息; 这些支持例程用设备驱动程序的方法来代替文件系统的文件操作,然后继续对文件调用新的open方法。这就是为什么当你打开文件系统上的一个设备特殊文件时,最后被调用的却是设备驱动程序的open方法。另外,devfs(Device Filesystem)有一个从设备节点到设备驱动程序的更直接的方式(这是非官方的内核补丁) struct dentry_operations ======================== This describes how a filesystem can overload the standard dentry operations.Dentries和dcache是属于VFS和单个文件系统实现的,设备驱动与此无关。 在内核2.1.99中,此结构的定义如下: (注:在2.2的内核中,此结构没有改变) struct dentry_operations { int (*d_revalidate)(struct dentry *); int (*d_hash) (struct dentry *, struct qstr *); int (*d_compare) (struct dentry *, struct qstr *, struct qstr *); void (*d_delete)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); }; d_revalidate:当VFS要使一个dentry重新生效时被调用。 d_hash:当VFS向哈希表中加入一个dentry时被调用。 d_compare:当指向一个dentry的最后的引用被去除时此方法被调用,因为这意味这没有人在使用此dentry;当然,此dentry仍然有效,并且仍然在dcache中。 d_release: 当一个dentry被清除时调用此方法。 d_iput:当一个dentry释放它的i节点时(在dentry被清除之前)此方法被调用。The default when this is NULL is that the VFS calls iput(). If you define this method, you must call iput() yourself. 每个dentry都有一个指向其父目录dentry的指针,一个子dentry的哈希列表。子dentry基本上就是目录中的文件。 dget:为一个已经存在的dentry打开一个新的句柄(这仅仅增加引用计数) dput:关闭一个dentry的句柄(减少引用计数).如果引用计数减少为0,d_delete方法将会被调用;并且,如果此dentry仍然在其父目录的哈希列表中的话,此dentry将被放置于一个未被使用的列表中。将dentry放置于未使用表中意味着当系统需要更多的RAM时,将会遍历未使用的 dentry的列表,并回收其内存空间。假如当detry的引用计数为0时,它已经没有在父目录的哈希表中的话,在d_delete方法被调用之后系统就会回收起内存空间。 d_drop: 此方法将一个dentry从其父目录的哈希列表中去掉。如果被去掉的dentry的引用计数降为0的话,系统会马上调用d_put来去掉此dentry. d_delete:删除一个dentry.如果没有别的对此dentry的打开引用的话,此dentry会变成一个negative dentry(d_iput方法会被调用);如果有别的对此dentry的引用的话,将会调用d_drop. d_add:向父目录的哈希列表中加入一个dentry,然后调用d_instantiate(). d_instantiate:把一个dentry加入别名哈希列表中,并更新其d_inode域为所给的i节点。i节点中的i_count域加一。假如i 节点的指针为NULL,此dentry就被称为"negative dentry".此函数通常在为一个已存在的negative dentry建立i节点时被调用。
未经允许不得转载:山九号 » linux虚拟文件是什么|什么是虚拟文件系统优点是什么Linux常用的文件系统是什么