linux文件系统

linux文件系统

定义

linux文件系统是一种机制或者说是一种协议,它用来组织存储设备上的数据和元数据。在linux文件系统中采用了多级目录的树型层次结构去管理文件,用/表示。linux系统的文件系统都会安装到一个目录下,并隐藏了该目录的原有内容,这个目录叫做安装目录或者安装点。

linux缺省的文件系统是ext2/ext3/ext4,继承自unix,这种文件系统把文件名和文件控制信息分开管理,文件控制信息组成一个inode结构。

文件类型

  • 普通文件,文件名不超过255字符
  • 目录文件:. 为目录本身,.. 为父目录
  • 字符设备文件/块设备文件:linux把设备的I/O作为对文件读写
  • 管道文件:进程间通信
  • 链接文件:符号链接文件,可以实现共享文件
  • socket:网络文件

/proc文件系统

  • 虚拟文件系统,用来获取系统的状态信息,并且可以改变系统的配置信息

VFS虚拟文件系统

为了使得各种物理文件系统能够转换成具有统一共性的文件系统,对各种文件系统进行抽象,linux使用了一种虚拟文件系统。

另外VFS其实不是一种实际的文件系统,因为它不是存在于外存的,VFS是仅仅存在于内存。

作用

假如用户输入 cp /floopy/TEST /tmp/test,其中前者是MS-DOS磁盘的挂载点,后者是ext2文件系统的一个目录,但因为VFS提供了系统调用接口,使得cp不用理会两者的文件系统而进行文件操作

VFS文件系统的结构

文件模型:

  • superblock:存储了已安装系统的信息,对应于物理文件系统的文件系统超级块
    • VFS把不同的文件系统中的组织结构信息进行抽象,形成了统一的、兼顾各种不同文件系统的统一的超级块。
    • 在具体文件系统安装时建立,在卸载时删除
    • 结构内有两个重要变量
      • s_type:指向文件系统类型的指针
      • s_op:指向超级块(一个叫super_operations的结构)操作的指针,通过指向的那个操作结构,就可以得到包含着的一系列操作指针
  • inode object:存储文件信息
    • VFS的inode对象存在于内存。而物理文件系统的inode对象存在于外存,并长期存在
    • 有一个i_op指向inode_operations的结构
  • dentry object:描述一个目录项
    • 为了加速访问,VFS文件系统维护着一个目录项的缓冲
  • file object:存储一个打开文件和一个进程的关联信息
    • 与进程相关
    • 在open()时创建,close()时销毁

文件类型的注册

linux支持的文件系统必须先注册后才能使用,注册有两种方式:

  • 在系统引导时在VFS中注册
  • 把文件系统做成可装载模块,在安装时在VFS中注册

注册后的文件系统会登记在file_system_type结构中,从而组成一个注册链表

文件系统的安装

把ext2/3/4文件系统的磁盘分区作为系统的根文件系统,其它文件系统则安装在根文件系统下的某个目录下,成为系统树形结构的分支

安装命令: mount -t vfat /dev/hda5 /mnt/win;

mount -t ext2 -i loop ./myfs /mnt

文件的管理与操作

对于打开的文件,有两种管理方式:

  • 通过系统打开文件表进行统一管理
    • 把所有进程打开的文件集中管理,组成一个双向链表,每个结点就是一个file结构
  • 进程的私有数据结构进行管理
    • fs_struct结构记录进程所在文件系统的根目录和当前目录
    • files_struct结构包含着进程的打开文件表,打开的文件会建立一个file结构,该结构的地址会写到fd[]数组的第一个空闲元素,因此fd数组的下标则为文件描述符

文件的open操作

  • 对应的内核函数是sys_open()

文件的read操作

  • page cache:由于需要减少IO的次数,linux在读写文件时采用了页缓冲,对文件的读写需要经过页缓冲

ext2文件系统

  • 实现了符号链接的方式
  • ext2分区的第一个磁盘块用于引导