一、文件系统的组成
Linux常见的文件系统类型有ReiserFS,ext2,ext3,ext4,vfat,XFS等,文件系统是对一个存储设备上数据和元数据进行组织的机制。他的最终目的是把大量数据有组织的放入持久性的存储设备中,比如硬盘和磁盘。文件系统就是文件在逻辑上组织形式,他以一种更加清晰的方式来存放各个文件。数据被存放到某个分区中。一个典型的Linux分区包含有以下各个部分:
boot block:任何分区的第一个块,存放系统的引导程序。
super block(超级块):保存整个分区的全局信息:1.有多少个块组 2.每个块组包含多少个块 3.块大小 4.空闲磁盘块,已用磁盘块 5.空闲inode,已用inode.
元数据:存放的是inode
inode:每个文件的标识,inode包含inode号,权限,属主属组,时间戳,文件大小等。inodes 是实现文件存储的关键。在 Linux 中,文件系统中管理的每个对象(文件或目录)表示为一个 inode。inode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。在 Linux 系统中,一个文件可以分成几个数据块存储在分区内。为了搜集各数据块,我们需要该文件对应的inode。每个文件对应一个 inode。这个 inode 中包含多个指针,指向属于该文件各个数据块。当操作系统需要读取文件时,只需要找到对应 inode,收集分散的数据块,就可以收获我们的文件了。注意:元数据和inode并不是一一对应的,当磁盘存放的是大文件,inode可以按照比例设定,较少。要是磁盘存放的是零碎的小文件,inode的个数必须要足够
数据区:将文件划分为block,称为磁盘块。(逻辑块,大小为2的n次方字节,一般来讲只能是1024,2048,4096).存放的是通常是两类文件,分别为普通文件和目录文件,一个磁盘可以属于多个文件(硬链接),一个文件可以有不同的路径(软链接)。文件的内容不同不能存放在同一块磁盘上。
内存中的空间划分为页块,叶匡大小通常为4K(对不同的CPU是不同的)注意:磁盘占有空间和文件实际大小
ext2与ext3的不同:ext3是日志文件系统。日志是磁盘分区第三个独立区域(数据区,元数据区)。把inode创建在日志区,而不是元数据区。创建好inode后存数据,如果数据存储到一半断电了,只需要检查日志区。因为那些没来得及保存的数据包括正在修改的文件,把他的inode挪到了日志区,所以只要检查日志区,修复这些inode即可。如果没有断电,只需要将这些数据放回元数据区即可。坏处就是需要多一次IO操作。ext2用于对文件完整性要求不高的文件。
二、inode读取文件
inode读取文件的过程如下:
1.根目录文件的 inode:2,用于找到 var 的 inode id
2.var 目录文件的 inode:10747905,用于找到 test.txt 的 inode id
3.text.txt 文件的 inode: 10749034,用于找到 data blocks
因此,当我们读取一个文件时,实际上是在目录中找到了这个文件的inode编号,然后根据inode的指针,把数据块组合起来,放入内存供进一步的处理。当我们创建一个文件时,是分配一个空白 inode 给该文件,将其 inode 编号记入该文件所属的目录,然后选取空白的数据块,让 inode 的指针指向这些数据块,并放入内存中的数据。
三、文件系统的结构
用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点。
每个文件系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。可以使用 sync
命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备)
四、VFS(虚拟文件系统)
Linux中允许多种不同的文件系统共存,如ext2,ext3等。通过使用同一套文件IO系统调用即可对Linux中的任意文件进行操作而无需考虑具体所在的具体文件系统格式,即对文件的操作可以跨文件系统而执行。如图所示,我们可以使用 cp 命令从 vfat 文件系统格式的硬盘拷贝数据到 ext3 文件系统格式的硬盘;而这样的操作涉及到两个不同的文件系统。
过程:VFS调用 vfat 的读文件方法将 a.txt 的数据读入内存;再将 a.txt 在内存中的数据映射到b.txt对应的内存空间后,VFS调用ext3的写文件方法将b.txt写入磁盘;从而实现了最终的跨文件系统的复制操作。VFS看起来就像一个中间媒介一样,屏蔽了不同文件系统之间的差异,从而可以实现跨文件系统执行命令。