文件组成
- inode(索引节点,index node)
和文件(普通文件、目录文件)一一对应,存储在磁盘中
一般包含inode编号、文件大小、访问权限、创建修改时间、文件数据块位置等
- dentry(目录项,directory entry)
用于记录文件名,inode指针,目录层级关系等,缓存在内存中
目录和目录项
目录是一个文件,其中保存子目录和文件,存储在磁盘中
目录项是一个数据结构,缓存在内存中,用于加速目录的读取。每个目录项可以指向一个文件或目录(也就是每个目录项有一个inode)
磁盘布局
扇区:磁盘读写的最小单元,512B
逻辑块:文件系统读写的最小单位,4KB
一般最开始是超级块,用于管理文件系统(块个数、大小、空闲块),文件系统挂载是进入内存
然后是一些索引节点区,用来存储inode,需要使用的时候会被加载如内存
最后面是数据块区,村濑存储文件数据(inode指向这个区)
虚拟文件系统VFS
VFS是用户系统和文件系统的中间层,用于把各种不同的文件系统抽象成一个统一的接口
Linux中的文件主要有三种:
- 磁盘的文件系统,把文件存储在磁盘中
- 内存的文件系统,/proc和/sys属于此类,该类文件存储在内存中
- 网络的文件系统,用来访问其他计算机的数据
文件系统需要先挂载到某个目录才能使用
文件的读写
- 使用open打开一个文件,获取文件描述符
OS会为每个进程维护一个打开文件表,打开文件后,文件的描述符会加入到文件表中。
这个文件表主要维护:
- 文件指针:上次读写当前文件的位置指针(对进程唯一)
- 文件打开计数器
- 文件磁盘位置
- 访问权限
- read、write进行读写
用户进程往往读取单位为字节,而文件系统以数据块为单位读取
- 用户从文件中读取一个字节数据时,文件系统首先找到该字节所在的数据块,然后再返回对应位置的数据
- 用户写入一个字节数据时,文件系统将数据写入数据块的对应位置,再写回磁盘
- close关闭文件
文件打开计数器-1,如果文件被删除,等到计数器值为0时,再从磁盘中删除
文件的存储和空闲块管理
分为连续方式和非连续方式
非连续方式又有FAT、链式索引块、索引表法(一级、二级、三级)
FAT:一个FAT表,指向下一个数据块的序号
链式索引块:next指向下一个数据块
索引表:专门用一个数据块记录,每个表项有个指针指向数据块
空闲块管理有空闲表法、空闲链表法和位示图法
空闲表法:序号、第一个空闲块号、空闲块个数
空闲链表法:next指向下一个空闲块
位示图法:一个二进制位表示一个块是否被使用。每个块能表示128M,称为一个块组。Linux中由多个块组共同管理空闲块
目录的存储
目录也是文件的一种,也有inode。
目录表的每一项:文件inode号、文件类型、文件名
软链接和硬链接
硬链接:多个目录项的索引文件指向一个inode
软链接:新建inode,文件的内容是另一个文件的路径。原始文件被删除时,软链接仍然存在