Linux的设计哲学有一点很重要:一切皆文件,不仅仅是普通的文件和目录,就连块设备,管道,socket都属于文件的范畴
Linux会为每个文件分配两个数据结构:索引节点和目录项
索引节点唯一标识文件,目录项记录文件的名字,实际上目录项与索引节点之间的关系是多对一的,硬链接的实现就是多个目录项中的索引节点指向同一个inode节点,目录不是目录项,目录是一个文件(inode),目录项的inode指针要么指向目录,要么指向文件
磁盘进行格式化时,会划分三个区域,分别是超级块,索引节点区和数据块区
上述区进入内存的时机是不同的,全部放入的话内存压力过大,加载进内存的时机如下
文件系统种类众多,操作系统希望对用户提供一个同一的接口,引入了虚拟文件系统这个中间层
VFS定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解VFS提供的接口即可
linux提供的文件系统主要有以下三类
文件系统需要挂载之后才能使用,比如Linux启动时,会把文件系统挂载在根目录下
用户使用文件的方式如下
打开文件后,操作系统为每个进程维护一个打开文件表,文件表中的每一项为文件描述符,中间的内容如下
文件的存储有以下两种方案:连续存储和非连续存储
文件存放在磁盘连续的空间中,指定起始块位置和长度即可存储和访问文件,缺点磁盘空间碎片(外部碎片)和文件长度不易扩展的缺点
链表方式存放的是离散的文件块,这样存放可以消除磁盘碎片,同时文件的长度可以动态扩展,根据实现方式的不同,链表方式还可以分为隐式连接和显示连接两种
索引方式是为每个文件创建一个索引数据块,里面放的是指向文件数据块的指针列表
当一个索引数据块存放不了索引时,有如下两种解决方式
上图的方式就是多级索引的雏形了,不过上面是二级索引
优点:
那个索引节点inode包含13个指针,10个直接指向数据块的,第11个指向一级索引的,第12个指向二级索引的,第13个指向三级索引的
磁盘的空闲分区也需要进行管理,几种常见的管理方式如下
Linux使用位图的方式管理空闲空间,用户创建新文件时,Linux通过inode的位图找到空闲可用的inode,进行分配,存储数据时,通过块的位图找到空闲的块并分配,一个页的位图最多能表示128Mb的数据,远远小于文件的大小,Linux提出了一个块组的概念
Linux将目录存储成了文件,甚至可以使用vim打开,普通的文件保存的是文件数据,目录文件保存的是目录中一项一项的文件信息
硬链接和软链接用于提供文件共享使用功能,实现方式不相同
硬链接是多个文件目录项中的索引节点指向同一个inode,由于inode无法跨越文件系统,所以硬链接无法跨域文件系统,并且仅当所有硬链接和源文件被删除时,源文件才会被真正的删除
软链接相当于重新创建了一个文件,这个文件的inode独立,不过这个文件的内容是另一个文件的路径,因此软练可以跨越文件系统.