文件系统原理
我们创建的各种文件、目录,以文件名和目录名的形式在终端上显示出来,但实际上文件数据是以二进制的形式存储在电脑的磁盘或手机上的Flash芯片内的。文件系统在其中充当了“中介”的角色:每一个文件名通过文件系统翻译,都会映射到实际物理磁盘上的某一个存储地址。当我们使用cp、mv、touch、rm命令进行文件的各种操作时,文件系统也会将这些操作转换为磁盘上具体的物理读写过程。
想要搞明白文件系统的工作原理,其实也很简单:文件系统位于磁盘和用户命令/程序之间。
文件系统本身也是一个程序,它会对物理存储进行抽象,将物理磁盘划分为一个一个的管理单元,比如划分为为8KB大小的块,对每个块进行编号。每个文件都使用一个对应的inode结构数据来表示,用来存储文件的各种信息,Linux就是根据inode来查找某一个文件在磁盘上的具体存储位置的。
一个文件的数据存储一般分为两部分:纯数据区和元数据区。纯数据区用来存放文件真正的数据,而元数据区则用来存储文件在磁盘中的具体位置、文件长度、时间戳、读写权限、所属组、文件的owner、链接数等信息。这些元信息使用一个inode结构体来包含,inode信息会保存在磁盘上一个单独的分区内,电脑上上电开机后,操作系统通过读取这个单独分区内的信息,就可以知道磁盘里文件的组织结构了。当用户通过文件名来操作某一个文件时,通过inode,就可以知道该文件和在物理磁盘上的实际存储地址之间的对应关系。
当我们使用一款新磁盘或U盘时,使用之前首先要对其格式化。所谓格式化其实就是让文件系统读这块磁盘进行管理。一个磁盘经过格式化,安装好文件系统后,磁盘上的文件存储形式就可以通过inode的形式存储在一个固定的分区上,然后用户就可以通过操作系统提供的文件系统接口,通过文件名的形式来访问这些文件了。用户访问这些文件时,某一个具体的路径名会通过inode,映射到磁盘上的某一个具体存储地址。
在一个计算机系统中,可以同时有多个存储设备。一台电脑上可以挂多个硬盘、插多个U盘或SD卡。当我们将一个U盘插入到电脑中,操作系统读写U盘之前,还需要一个挂载的操作(mount),通过挂载,可以让磁盘与Linux的根文件系统的某个目录建立关联,让U盘的文件系统并入计算机全局的文件系统树当中。而挂载目录就是计算机进入该挂载设备的访问接口。
文件系统有不同的类型,不同的文件系统在读写速度、性能上各不相同:有的文件系统适合存储小而杂的文件,有的文件系统适合存储大文件,如大于4GB的视频文件。不同的计算机、手机、嵌入式设备,根据实际的需求会选择不同类型的文件系统。Linux官方内核源码中集成多个文件系统的源码文件,支持多种文件系统:ext/ext2/ext3/ext4、XFS、JFFS/JFFS2、CRAMFS、yaffs/yaffs2、UBIFS等。当然,根据需要,你甚至还可以移植新的文件系统程序到内核中。
关于文件系统的深入的原理、细节和实验操作,请关注视频教程:Linux系统编程:Linux系统编程:揭开文件系统神秘的面纱
或者下载免费的PPT文档揭开文件系统神秘的面纱.PDF学习,文档下载地址:揭开文件系统神秘的面纱.PDF