【文件管理】文件系统概述

一个OS最重要的部件是什么呢?那就是进程管理和文件系统;有些嵌入式系统可能有进程管理,但是没有文件系统;而另一些操作系统由文件系统,但是没有进程管理;起初Linux使用的是mnix文件系统,但是mnix文件系统有很多缺陷,最后形成了现在的EXt2文件系统;但是为了支持其他文件系统,linux抽象出了一个虚拟文件系统界面(VFS);这个抽象的界面,以系统调用形式提供于用户程序,如read(),write()等等;每一个文件系统都有自己的file_operations(这是VFS与具体文件系统的主体连线),里面的结构成分基本都是函数指针;


(1)在task_struct结构中,fs_struct是关于文件系统的信息,它与具体的打开文件无关(它有可能是设备文件),其中root(本进程的根目录),pwd(当前进程所在的目录),alroot(用户设置的替换根目录),指向代表目录项的dentry数据结构,里面记录着文件的各项属性,如文件名,访问数据权限等,这三个目录不一定都在同一个文件系统中;安装点起着很大的作用,rootmnt,pwdmnt,altrootmnt分别指向着这三个安装点;files_struct是关于已打开文件的信息的集合,打开一个文件后,进程通过一个打开文件号fid来访问这个文件;每一个file都有一个file_operations,同时还有f_dentry(一个进程可多次打开大,建立一个读写上下文);每种文件系统都有个file_operations,它既不属于某个特定的文件,更不属于某个特定的上下文;

(2)每一个file除了dnetry外,还有一个inode(记录着文件在存储介质的位置与分布等信息);同时dentry也有一个inode指针;dentry代表着逻辑上意义的文件,inode表示物理上的属相,他们是一个一对多的关系;

(3)VFS与具体的文件系统之间的界面除了file_operations数据结构;它还有一个与目录项相联系的dentry_operations(d_delete是指向具体文件系统的删除文件操作的入口函数,d_release则用于关闭文件的操作,d_compare是用来文件名比对的);以及与索引节点相联系的inode_operations数据结构;下面是各个数据结构的联系:


(4)linux到底支持哪一个具体的文件系统呢?数据结构inode中有一个成分u,是个union;根据具体文件系统的而不同,可以将这个union解释成不同的数据结构‘但inode代表的文件是个socket时,就是socket数据结构;当inode所代表的文件系统的详细描述符结构ext2_inode_info;其他还包括nfs,usbdev,proc(目录/proc下的特殊文件,这些文件对系统管理和程序调试都很有用处);

(5)在linux系统中外部设备视同是文件,所以从概念上来讲每一种不同的外部设备就相当于一个不同的文件系统了;设备文件不是用上述的union来解释的;

(6)当一个文件系统代表着磁盘(或介质)上按特定格式组织文件时,对每个文件的操作最终都要转化为某一部分磁盘介质的操作;因此在文件系统下面还有一层设备驱动;可由两种角度来看;


(7)上述磁盘文件,通常是以磁盘作为存储介质的,但也有可能采用其他介质的;如RAMDISK是在内存中模拟磁盘介质的;文件是按一定的组织形式存储在介质上的信息,它包含数据存储的本身,以及有关该文件的组织和管理的信息;对于磁盘文件来说,这两种信息全都存储在文件系统中,其中组织与管理的in西主要存储在文件的索引节点和目录项中;磁盘的索引节点和前面的inode类似,但有所不同,它不占用内存空间;每一个文件有且只有一个索引节点,即使没有数据;磁盘上的目录项比内存中的dentry结构简单;

(8)上述设备文件同样用于组织和管理信息,同样有存储介质上的索引节点和目录项;不同的设备类型和性质不同,它可以用于存储和读出的磁盘,也可以是收发数据的网卡;

(9)特殊文件在内存中也有inode数据结构和dentry数据结构,但是不一定存储介质上有索引节点和目录项;特殊文件一般与外部设备无关,所涉及的信息通常是内存和CPU本身;如/dev/null就是一个特殊文件,凡是写入的数据都会被丢弃;

(10)inode是三种不同文件的一个共同点;它有i节点号,在同一个文件系统中每个i节点号都是唯一的,内核有时会根据i节点号的杂凑值俩寻找其inode结构;文件主,创建这个文件的用户(uid,uid可属于一个用户组gid),可改变;除特殊文件外,一个索引节点总得存储在某个设备上,这就是i_dev;如果索引节点所代表的并不是常规文件,而是某个设备,那就还有个设备号,那就是i_rdev(由主设备号和次设备号构成);i_atime,i_mtime,i_ctime分别用来为最后一次访问文件的时间,修改文件的时间,以及最初创建该文件的时间;i_size是数据部分的当前大小;i_link用来记录本文件有多少个别名链接;同时有个队列头i_dentry,沿着这个dentry队列头就可以找到这个文件相联系的所有dentry结构;i_count用来表示inode的共享计数;

(11)inode的信息是不能丢失的,对于磁盘文件,有对应的索引文件与它相对应,比如Ext2中的ext2_inode;

(12)对于文件名并不在内存inode中;从'/'开始到最底层的叶,中间的节点都是目录,目录也是一种文件,是一种特殊的磁盘文件。它也有索引节点,但是数据部分只包括目录项ext2_dir_entry;/proc是属于EXT2_FT_REG_FILE的常规文件,如还有EXT2_FT_REG_SOCK;rec_len是适应各节点长度的动态变化;

(13)根目录的位置以及文件系统的其他一些参数记录在超级块中,超级块在设备上的逻辑位置时固定的,例如,磁盘上总是第二个逻辑块,第一个逻辑块为引导块;对于一个特定的文件系统,超级块的格式是固定的;安装就是从一个存储设备上读入超级块,在内存中建立一个super_block;再进而将此设备上的根目录与文件系统中已经存在的一个空目录挂钩;在dentry中有个d_parent指向父目录的dentry结构;

(14)对于普通文件,对存储介质的访问涉及到ext2_dir_entry_2,ext2_inode,磁盘的引导块,引导块;每一个ext2经过格式化的磁盘至少含有四个部分;格式化和磁盘大小参数存储在超级块中;


(15)从磁盘驱动程序来看,整个介质是一个由若干记录组成的一维阵列;当文件系统层读出一个索引节点,要根据索引节点号和超级块提供的信息,计算整个索引节点在磁盘的哪一个记录以及在记录块中的相对位移(拼凑得到索引节点);其中根目录是特殊的,其索引节点号保存在该磁盘的超级块中;读数据,要根据索引节点提供的信息将数据在文件中位移换算成磁盘上的记录块号,再通过磁盘驱动程序从磁盘上读入;

(16)作为设备文件的磁盘文件,却看不见这样的逻辑划分;是根据设备号来的;

(17)file,dentry,inode,super_block以及超级块的位置约定都属于VFS层;inode中i_fop和file中的f_op一样的;虽然每个文件件都有目录项和索引节点在磁盘上,但是只有在需要时,才在内存中为之建立起相应的dentry和inode数据结构;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值