Linux下的文件系统

来源:互联网 发布:中信淘宝v卡好申请吗 编辑:程序博客网 时间:2024/05/07 10:23

一、Linux下文件的内函

l  普通文件:例如保存在磁盘上的C文件、可执行的文件以及目录等,这种文件的特性是数据在存储设备上存放,内核提供了对数据的抽象访问,此种文件为一种字节流,访问接口完全独立于在磁盘上的存储数据。

l  字符设备文件:是一种能够像文件一样被访问的设备,例如控制台、串口等。

l  块设备文件:磁盘是此类设备文件的典型代表,与普通文件的区别是操作系统对数据的访问进行的重新的格式设计。

l  Socket文件:它是UNIX中通过网络进行通信的方式,对网络的访问可以通过文件描符的抽象实现,访问网络和访问普通文件相似。

Linux中用户空间对各种文件的操作是类似的,因为虚拟文件系统VFS提供了同一套的API

二、普通文件

普通文件是指在硬盘、CDU盘等存储介质上的数据和文件结构。在本节中所指的文件系统是一个狭义的概念产,仅仅按照普通文件在磁盘中的组织方式的不同来区分。

普通文件的概念与Windows下面的文件的概念是相同的。

三、设备文件

Linux下用设备文件来表示所支持设备的,每个设备文件除了设备名,还有3个属性,即类型、主设备号、次设备号。

l  设备类型:设备属性的第一个字符是这个设备文件的类型。第一个字符为c,表明这个设备是一个字符设备文件。第一个字符为b,表明这个设备是一个块设备文件。Sdb1的第1个字符为b,可知它是一个块设备文件。

l  主设备号:每一个设备文件都有一个“主设备号”,使用ls –l命令输出的第5个字段即为主设备号。主设备号是表示系统存取这个设备的的“内核驱动”。驱动程序是UNIX内核中代码的一部分,其作用是用来控制一种特殊设备的输入输出。大多数的UNIX操作系统都有多种设备驱动。Lsdev命令可以列出当前内核中配置的驱动程序,和这些驱动程序对应的设备号。

l  次设备号:每一个设备文件都有一个次设备号。“次设备号”是一个24位的16进制数字,其定义了这个设备在系统中的物理位置。设备存储选项。

l  设备文件名:设备文件名用于表示设备的名称,它遵循标准的命令方式,使得设备的分辨更容易。

1、  字符设备与块设备

字符类型的设备可以一次数据读写过程中传送任意大小的数据,多个字符的访问是通过多次读写来完成的,通常用于访问连续的字符。例如,终端、打印机、moderm和绘图仪等设备是字符类型设备。

块设备文件可以在一次读写过程中访问固定大小的数据,通过块设备文件进行数据读写的时候,系统先从内存的缓冲区中读写数据,而不是直接与设备进行数据读写,这种访问方式可以大幅度地提高读写性能。常用的块设备有硬盘、软盘和CD-ROMRAM类型磁盘。

2、  设备文件的创建

设备文件是通mknod命令来创建的。

其参数有设备文件名NAME、操作模式TYPE、主设备号NAMJOR及设备号MINOR。主设备号和次设备号两个参数合并成一个16位的无符号短整位,高8位表示主设备号,低8位表示次设备号。可以在include/Linux/major.h文件中找到所支持的主设备号。

设备文件通常位于/dev目录下。

四、虚拟文件系统VFS

Linux的文件系统是由虚拟文件系统作为媒介搭建起来的,虚拟文件系统VFSVirtual File Stytle)是由Linux内核层实现的一种架构,为用户空间提供统一的文件操作接口。它在内核内部为不同的真实文件系统提供一致的抽象接口。

用户应用程序通过系统调用,与内核中的虚拟文件系统交互,操作实际的文件系统和设备。Linux文件系统支持多种类型的文件,对多种类型的文件系统进行了很好的抽象。通过一组相同的系统调用接口,Linux可以在各种设备上实现多种不同的文件系统。

 VFS是文件系统的接口框架。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的具体实现方式差异很大。有两个针对文件系统地象的缓存(inodedentry) ,它们缓存的对象是最近使用过的文件系统。

每个文件系统实现(例如ext2vfat等等)导出一组通用接口,供VFS使用。缓冲区用于缓存文件系统和相关块设备二者之间的请求。对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。以最近使用(LRU)列表的形式管理缓冲区缓存。可以使用sync命令缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序),进而发送到存储设备)。

1、  文件系统类型

Linux的文件系统用一组通用对象来表示,这些对象是超级块(superblock)、节点索引(inode)、目录结构(dentry)和文件(file)

超级块是每种文件系统的根,用于描述和维护文件系统的状态。文件系统中管理的每个对象(文件或目录)Linux中表示为一个索引节点inode

Inode包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。另一组结构称为dentry,它们用来实现名称和inode之间的映射,有一个目录缓存用来保存最近使用的dentry

Dentry还维护目录和文件之间的关系,支持目录和文件在文件系统中的移动。VFS文件表示一个打开的文件(保存打开的文件的状态,像文件的读偏移量和写偏移量等)。

Linux的内核中保存系统所支持的文件系统的列表,可以使用一组注册函数在Linux中动态地添加或删除文件系统。在注册新的文件系统时,会把这个文件系统和它的相关信息添加到file_systems列表,这个列表文件是/proc/filesystems

2、  超级块

超级块结构(struct super_block,可以从linux/fs.h文件中获得此结构更多的信息)用来表示一个文件系统。这个结构包含一个文件系统所需要的信息,例如文件系统名称、文件系统中最大文件的大小以及对inode块的操作函数等。

Linux系统中每种文件类型都有一个超级块,例如,如果系统中存在ext2vfat,则存在两个超级块,分别表示ext2文件系统和vfat文件系统。

超级块中的一个重要元素是超级块操作函数的定义。这个结构定义一组用来管理这个文件系统中的节点索引inode()删除inodestruct super_operations结构定义在linux/include/linux/fs.h中。Linux文件系统中所支持的每个文件系统都实现一套自己的inode操作方法,这些方法实现超级块所定义的功能并向VFS层提供通用的抽象。

3、  文件操作

在文件fs.h中定义了文件操作的结构,通常实际的文件系统都要实现对应的操作函数。例如,ext2文件系统实现了如下的文件操作,当打开一个ext2格式的文件时,系统调用ext2文件系统注册的open()函数,即函数generic_file_open()

 

原创粉丝点击