• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Linux系统原理之文件系统

系统管理 彭东稳 9年前 (2015-08-25) 30552次浏览 已收录 0个评论

Linux系统中,所有内容被表示为文件,组织文件的各种方法便称为不同的文件系统。Linux支持多种文件系统,使之能够与不同的操作环境实现资源共享,这也是Linux作为网络操作系统的明显优势。

一、Linux文件结构

文件结构是指文件在存储设备中的组织方式,主要体现在对文件和目录的组织上,目录提供了一个管理文件的有效而方便的途径。Linux使用树状目录结构,在安装系统时,安装程序已经为用户创建了文件系统和完整而固定的目录组成形式,并指定每个目录的作用和其中的文件类型。如图:

Linux系统原理之文件系统

二、Linux文件系统

当我们需要在磁盘上查找一个文件时就需要遍历整个磁盘速度太慢,可以根据文件的特性加以分类再使用路径的方式来寻找文件就会快的多而这种机制就叫文件系统(file system)存在于磁盘之上的一个系统。文件系统是对一个存储设备上的数据和元数据进行组织的机制,这种机制有利于用户和操作系统的交互。在一篇oracle的技术文章中看到这样一句话“尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用的主要工具。这对Linux来说尤其如此,这是因为在UNIX传统中,它使用文件I/O机制管理硬件设备和数据文件”,这句话我是这样理解的,在Linux没有文件系统的话,用户和操作系统的交互也就断开了,例如我们使用最多的交互shell,包括其它的一些用户程序,都没有办法运行。在这里可以看到文件系统相对于Linux操作系统的重要性。下面是Linux文件系统组件的体系结构。

用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点。

Linux系统中所有的文件都属于当前系统所有它有一个制高点称做根从这个位置开始可以找到所有文件。在这个根下有一级二级子目录所有Linux目录结构通常称为倒置树状结构;当在这个树状结构的文件系统下可以分叉的称为目录而不可以分的称为文件。因此这种机制当找一个文件时从根出发再到一级目录就可以找到文件这种方式也称绝对路径;相对路径就是当前目录的路径。

文件系统也可以称为一个管理软件:它把磁盘分区先分成多个块组然后在块组中分成两部分第一部分是metadata元数据存储区域,第二部分是data数据区域在数据区域又划分为一个个的逻辑存储单元存为数据块block;是把物理上的几个扇区组合起来成为逻辑上的磁盘块block也是文件系统为了实现自我管理描述的逻辑概念。如图:

Linux系统原理之文件系统

三、VFS介绍

 Linux中文件系统是内核的功能,只能通过系统调用输出给用户使用,在用户空间使用文件系统管理软件对内核所支持的文件系统进行操作,在Linux系统中支持众多的文件系统因为Linux执行程序与文件系统之间有一个VFS存在。VFS是一种软件机制,它的全称virtual filesystem switch虚拟文件交换系统,VFS负责Linux的文件系统的管理,所以更为正式的叫法应该是Linux的文件管理子系统,这种文件管理子系统比较特别,它是虚拟的,也就意味着它并不直接跟真正的磁盘文件有任关系,或者说是VFS有关的数据结构只存在于物理内存中。

Linux内核运行过程中,在执行具体文件操作的时候,所有其他子系统只会与VFS打交道,都是由VFS转交给具体的实体文件系统完成的。从这个角度看,VFS是所有实体文件系统的管理者,它的作用就是把内核中支持的多种文件系统的不同使用格式做成一个API通用接口通过系统调用输出给执行程序;这样上端的支持程序就不需要知道底层内核中各种不同的文件系统的使用格式;程序员在写程序时只需要按照VFS输出的统一接口进程编程到VFS那里它会进行转换给内核执行而vfs也是内核的模块。

下图清除地描述了VFSLinux内核中的逻辑关系:

Linux系统原理之文件系统

四、Linux文件系统组件的体系结构

如下图,用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点。

Linux系统原理之文件系统

VFS 是底层文件系统的主要接口。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode dentry)。它们缓存最近使用过的文件系统对象。当然如果只有VFS,Linux系统是无法正常工作的。因为它的这些数据结构不能够凭空捏造出来,必须与具体的文件系统相结合,如ext4、xfs、provfs等,才能够开始实际的工作。

每个文件系统实现(比如 ext2JFS 等等)导出一组通用接口,供 VFS 使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。以最近使用(LRU)列表的形式管理缓冲区缓存。注意,可以使用 sync 命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备)。

五、Linux支持的文件系统类型

Linux支持的文件系统不仅包括Unix世界广泛采用的各种类型,还特别加入了对MS Windows9x/NT文件系统的支持,并可以方便的在CD-ROM、软盘等介质上建立相应的文件系统。为了确定你的Linux支持的文件系统类型,可以查看/proc/filesystems中的内容。如果所需类型不在其中,那就只能去找升级内核并重新编译了。

ext3:支持日志功能(redhat6.0开始使用;还有JFS/Reiserfs都支持日志功能)。

XFS:高性能日志文件系统(redhat7.0开始使用)。

NFS:网络文件系统,NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。

iso9660CD-ROM的标准文件系统。

FAT:微软的老式文件系统(u盘使用)。

NTFS:新技术文件系统也是微软为windows提供。

/proc:虚拟文件系统。

CFS:加密文件系统。

六、VFS主要数据结构

Linux以一组通用对象的角度看待所有文件系统。这些对象是超级块(superblock)、inodedentry 和文件。超级块在每个文件系统的根上,超级块描述和维护文件系统的状态。文件系统中管理的每个对象(文件或目录)在 Linux 中表示为一个 inodeinode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。另一组结构称为 dentry,它们用来实现名称和 inode 之间的映射,有一个目录缓存用来保存最近使用的 dentrydentry 还维护目录和文件之间的关系,从而支持在文件系统中移动。

如下图:

Linux系统原理之文件系统

BootBlock

任何一个分区的第0个块是引导块不能被使用的用来装载Bootloader的(MBR不属于任何一个分区是磁盘的0扇区512字节)多系统互存的时候用到的;两个不同的系统都有自己的bootloader分别安装在不同的分区如果MBR中的bootloader已经被占用那么第二个系统就把自己的bootloader存放在分区的bootblock中;当然bootblock是不能被系统直接引用的;我们可以在开机菜单中选择要启动的bootloader,如果是默认就是启动MBR中的bootloader。其余的空间是直接被划分为一个个块组;而块组中在区分元数据区域和数据区域。

block group

用来管理这一个区域内的磁盘空间。

super block

超级块中存放整个分区信息所以会有规律地备份到不同的块组,默认找第0号块组如果坏了就会自动找下一个块组也可以手动复制。

GDT

块组描述符表中存放当前分区每一个块组的块组名和每一个块组的起始到结束编号,所以这个信息也是不能损坏的需要备份多个。

Block bitmap

块位图用来存放当前块组中的已用磁盘块和未用磁盘块,占用一个数据块所有能存放多少位是根据块大小来决定的。

inode bitmap

inode位图用来存放已用inode和未用inode号。

index node table

inode表中存放inode号、文件的大小、权限、时间戳、属主属组扩展属性等各种元数据,存储块的位置等但是没有文件名。

inode也是非常占用磁盘空间的的在系统上包括根每一个文件都有inode号存放在文件系统的metadata中。在进行格式化之后磁盘就会少很多空间这些空间都给metadata用了;inode也是要提前规划好的根据数据块的多少,不然当inode不够用的时候就算磁盘还剩余有空间也无法使用;因为无法标识文件的位置。

inode表图:最重要的就是磁盘块引用决定了单个文件的大小限制;有直接磁盘块指针最多引用20个磁盘块,间接磁盘块指针,二级间接磁盘块指针,三级间接磁盘块指针

data blocks

以上都是metadata区域的内容,数据块则是数据区域的内容用来存放数据其数据块的大小必须是2*N次方可以自行设定(默认一般是4K大小)。

七、块组和超级块的概念

块组

从硬盘发展到现在硬盘的容量不断增大;而在现在的硬盘分区中一个分区200G很正常;比喻一个数据块4K(数据块是有固定大小的2*N次方用户空间可以选择;一个数据块只能存放一个文件,内存装载数据时是按照页框,一个页框只能装载固定的数据块根据CPU架构的不同而不同)那么一个200G的分区该有多少数据块;系统在查找数据时还是会很慢;所以就在这个基础上引用了块组的概念;就是在一个文件系统中把所有的数据块在进行分组管理每一个组都有自己的inode,块位图,inode位图等信息这些对用户来说是透明的;以便于系统更加快速查找文件。块组是根据分区的大小而划分的它也是有固定大小的;根据块位图能容纳的位而确定一般块位图的大小也是占用一个数据块如果这个数据块是1k那么它们只能容纳1024*8这么多个位(一个位存放一个块信息也就确定了一个块组的大小)。

超级块

一般在创建文件系统的时候就会划分好元数据区域和数据块以及块组,而根据磁盘大小的不同和数据块大小的不同,一共创建多少个块组是需要系统确认好的。所以就会在metadata区域里面有一个地方就保存下来了称为超级块(super block),超级块保存整个文件系统信息包括有多少个块组,每个块组用包含多少块,块大小,块位图,inodeinode位图等信息,如果超级块坏了那么整个分区就挂了,所以超级块是有多个备份的,分别存放在每一个块组中。

八、实例操作说明文件系统工作原理

1)查找/etc/issue文件的过程

下图画出了一个块组内的大概信息,然后根据这一个块组来进行一个issue文件的查找,更好地说明一下文件系统的工作原理。

Linux系统原理之文件系统

1. 查找超级块

2. Linux中的每一个文件都在/下所以必须从/开始找,/是自引用的通过查找metadata中的inode表知道/1号块;

3. 然后找到1号数据块根据1数据号块里面的表知道etcinode号是2;

4. 然后返回到inode表中找到2inode从而查到etc3号数据块里面;

5. 然后根据3号数据块里面的表找到issueinode号是7;

6. 在返回到inode表中根据inode7找到对应的数据块5;

7. 最后直接找5号数据块从而找到issue文件的数据;

2)新建文件/root/1.txt,大小20k,每个磁盘块4k的过程

1. 先找空闲的inode1.txt分配一个inode号;

2. 在根据/找到root对应的inode号;

3. 在回来查找inode根据/root返回的inode号找到对应的块;

4. 然后找到root后在root存在的块中建立一个表填写文件1.txt和所对应的inode号;

5. 最后在返回metadata区域找块位图为1.txt找空闲的数据块存放数据;假设这里1.txt大小为20k而每个块大小为4k;系统一般会为1.txt多分几个块用不完在回收到块位图中以避免磁盘碎片(出现磁盘碎片再次访问文件时就会跳跃查找非常慢)

3)删除一个文件过程

1. 先查询到文件的位置;

2. 系统不会去清除数据块中的数据;而是把块位图中的数据块标记为未使用,等待下次在有需要存储数据时直接覆盖就可以了(简单的数据恢复就是通过未被覆盖的数据块来还原数据的,而一些文件粉碎机在删除文件时就是往数据块中填充一些二进制数据);

4)复制文件的过程

1. 文件复制就是创建一个新文件把数据块填充为原数据一样的数据,所以慢;

5)剪切文件的过程

1. 在同一个文件系统中剪切数据非常快因为系统只是把原目录项更改一下放到别的目录项上去了,而inode没有变数据也没有变;

2. 但是如果是跨分区也会很慢,该有的步骤一步都不会少;

九、链接文件

ln 源文件 链接文件

硬链接两个文件的inode号相同ls -i可以查看;硬链接指向的是inode号,因此删除原文件而链接文件还是可以访问,硬链接就是内容相同路径不同。

1. 只能对文件创建不能应用与目录;

2. 不能跨文件系统;

3. 创建硬链接会增加文件被链接的次数。

ln -s 源文件 链接文件

软链接两个文件的inode好不同ls–i可以查看,软链接指向的是原文件的路径符号,因此删除原文件后而链接文件不可以在使用但是当重新复制一个文件名字和路径为原文件时,软链接文件就链接到当前文件,因为它不是根据inode号来做的链接。

1. 可应用与目录;

2. 可以跨文件系统;

3. 不会增加被链接的次数;

4. 其大小为指定的路径所包含字符的个数。

十、设备文件

设备文件没有大小只有主设备号(major number)用来标识设备类型和次设备号(minor number)用来标识相同设备之间的不通类型的,便于系统引用。并不占用磁盘空间,只在inode中存在,不适用磁盘块。

b:以块为单位,随机访问的设备;

c:以字符为单位,线性访问的设备;


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!