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分区的第一个磁盘块用于引导