精华内容
参与话题
问答
  • VFS

    千次阅读 2019-10-25 08:47:25
    VFS是Linux非常核心的一个概念,linux下的大部分操作都要用到VFS的相关功能。这里从使用者的角度,对VFS进行了简单说明。使用者不但需要知道Linux下有哪些文件操作的函数,还需要对VFS的结构有一个比较清晰的了解,...

    2、VFS的构建

    所谓VFS的构建就是加载实际文件系统的过程,也就是mount被调用的过程。如下图所示,以mount一个ext2的文件系统为例。
    这是一个经过简化的Ext2磁盘结构,只是用于说明用它构建VFS的基本过程。
    mount命令的一般形式为:mount /dev/sdb1 /mnt/mysdb1
    /dev/sdb1是设备名,/mnt/mysdb1是挂载点。
    VFS文件系统的基本结构是dentry结构体与inode结构体。
    Dentry代表一个文件目录中的一个点,可以是目录也可以是文件。
    Inode代表一个在磁盘上的文件,它与磁盘文件一一对应。
    Inode与dentry不一定一一对应,一个inode可能会对应多个dentry项。(hard link)Mount时,linux首先找到磁盘分区的super block,然后通过解析磁盘的inode table与file data,构建出自己的dentry列表与indoe列表。
    需要注意的是,VFS实际上是按照Ext的方式进行构建的,所以两者非常相似(毕竟Ext是Linux的原生文件系统)。
    比如inode节点,Ext与VFS中都把文件管理结构称为inode,但实际上它们是不一样的。Ext的inode节点在磁盘上;VFS的inode节点在内存里。Ext-inode中的一些成员变量其实是没有用的,如引用计数等。保留它们的目的是为了与vfs-node保持一致。这样在用ext-inode节点构造vfs-inode节点时,就不需要一个一个赋值,只需一次内存拷贝即可。
    如果是非EXT格式的磁盘,就没有这么幸运了,所以mount非EXT磁盘会慢一些。

    4 VFS的结构

    构建出VFS文件系统后,下一步是把第一节中提到的目录模型映射到VFS结构体系中。
    上文提到了VFS主要由denty与inode构成。Dentry用于维护VFS的目录结构,每个dentry项就代表着我们用ls时看的的一项(每个目录和每个文件都对应着一个dentry项)。Inode为文件节点,它与文件一一对应。Linux中,目录也是一种文件,所以dentry也会对应一个inode节点。

    5 Dentry cache

    每个文件都要对应一个inode节点与至少一个dentry项。假设我们有一个100G的硬盘,上面写满了空文件,那个需要多少内存才能重建VFS呢?
    文件最少要占用1个block(一般是4K)。假一个dentry与一个inode需要100byte,则dentry与inode需要占用1/40的空间。1G硬盘则需要2.5M空间。最近都开始换装1T硬盘了,需要 25G的内存才能放下inode与dentry,相信没有几台电脑可以承受。
    为了避免资源浪费,VFS采用了dentry cache的设计。
    当有用户用ls命令查看某一个目录或用open命令打开一个文件时,VFS会为这里用的每个目录项与文件建立dentry项与inode,即“按需创建”。然后维护一个LRU(Least Recently Used)列表,当Linux认为VFS占用太多资源时,VFS会释放掉长时间没有被使用的dentry项与inode项。
    需要注意的是:这里的建立于释放是从内存占用的角度看。从Linux角度看,dentry与inode是VFS中固有的东西。所不同的只是VFS是否把dentry与inode读到了内存中。对于Ext2/3文件系统,构建dentry与inode的过程非常简单,但对于其他文件系统,则会慢得多。
    了解了Dentry cache的概念,才能明白为何下面会有两种定位文件的方式。

    6 无denty时定位文件

    因为上面提到的Denty Cache,VFS并不能保证随时都有dentry项与inode项可用。下面是无dentry项与inode项时的定位方式。
    为了简化问题,这里假设已经找到了dir的dentry项(找到dentry的过程会在后面讲解)。
    首先,通过dir对应的dentry0找到inode0节点,有了inode节点就可以读取目录中的信息。其中包含了该目录包含的下一级目录与文件文件列表,包括name与inode号。实际上用ls命令查看的就是这些信息。“ls -i”会显示出文件的inode号。

    ls -i
    975248 subdir0 975247 subdir1 975251 file0

    接着,根据file1对应的inode号重建inode4,并通过文件数据与inode4重建file1的dentry节点。然后,根据通过根据subdir0对应的inode号重建inode2,并通过文件数据(目录也是文件)与inode2重建subdir0的dentry节点:dentry1。

    ls -i

    975311 file1 975312 file2

    最后,就可以通过inode4节点访问文件了。
    注意:文件对应的inode号是确定的,只是inode结构体需要重新构造。

    7 有dentry时定位文件

    一旦在Dentry cache中建立了dentry项,下次访问就很方便了。
    Dentry中的一个关键变量是d_subdirs,它保存了下一级目录的列表,用于快速定位文件。
    首先,在代表dir目录的dentry0的d_subdirs中查找名字为“subdir0”的dentry项,找到了dentry1。
    然后在dentry1中查找名字为“file1”的dentry项,然后找到了file1对应的dentry项,
    最后通过file1对应的dentry项获得file1对应的inode4。
    与无dentry项时比较,有dentry项时的操作精简了许多。

    10 进程对文件的管理

    进程控制块task_struct中有两个变量与文件有关:fsfiles

    files中存储着rootpwd两个指向dentry项的指针。用户定路径时,绝对路径会通过root进行定位;相对路径会的通过pwd进行定位。(一个进程的root不一定是文件系统的根目录。比如ftp进程的根目录不是文件系统的根目录,这样才能保证用户只能访问ftp目录下的内容)

    fs是一个file object列表,其中每一个节点对应着一个被打开了的文件。当进程定位到文件时,会构造一个file object,并通过f_inode 关联到inode节点。文件关闭时(close),进程会释放对应对应file objectFile object中的f_mode是打开时选择的权限,f_pos为读写位置。当打开同一个文件多次时,每次都会构造一个新的file object。每个file object中有独立的f_modef_pos

    展开全文
  • apache vfs

    2009-07-13 10:33:44
    在Apache VFS中核心是FileObject接口。它代表一个文件,和Java File不同,它具有更多延伸的功能和信息。实现FileObject接口的文件对象有很多:例如AbstractFileObjet抽象类提供了部分FileObject实现。大部分File...
  • cannot mount VFS

    2020-11-28 11:29:26
    <div><p>Everything else in tmsu seems to work just fine but when I try to mount the VFS with "tmsu mount mp" I get the following. <pre><code> tmsu: virtual filesystem mount failed: /usr/bin/...
  • Import into vfs

    2020-11-25 20:33:56
    <div><ol><li>send file/send photo/take pic/record audio - import into vfs and offer from there</li><li>end/delete chat - prompt to clear vfs</li><li>if "take pic" or "record audio" we ...
  • <div><p>Currently there is no information for the user that one of the accounts has been created in VFS mode. (tested with todays daily 2.5.0 build) <p><img alt="owncloud" src=...
  • s template data installed through MO, and I am required to copy the files to the BodySlide folder manually, however, like the other tools, it will not see the VFS.</li><li>Launching F4SE works fine ...
  • vfs-dest doesnt end?

    2020-11-24 14:03:21
    i know <code>vfs.dest</code> returns a readable/writable stream... so is up to the user to end that stream? <p>for example if i simply do <code>vfs.src.pipe(vsf.dest)</code> and the source contains ...
  • VFS smb

    2019-03-05 01:14:51
    博文链接:https://roger51.iteye.com/blog/147713
  • <div><h2>Package request: Update Samba to include VFS Recycle module/library <p>{Describe killer feature of package: https://www.samba.org/samba/docs/current/man-html/vfs_recycle.8.html}</p> <ul><li>...
  • if not isinstance(vsi, string_types) or not vfs.valid_vsi(vsi): > raise TypeError("invalid vsi: %r" % vsi) E TypeError: invalid vsi: 'c' fionacollection.py:69: TypeError </code></...
  • <div><p>What are use cases for the selective sync UI in an account that has been created in VFS mode? <p>Or is it more user friendly to let users interact only in the file manager? <p><img alt=...

空空如也

1 2 3 4 5 ... 20
收藏数 4,799
精华内容 1,919
关键字:

vfs