Linux
看着鸟哥的课程一步一步的学习,记录一些自己的笔记,侵删。
文件系统
先来了解一下什么是文件系统
特性
每个操作系统使用的文件系统并不相同,Linux 的正统文件系统则为 Ext2 (Linux second extended file system, ext2fs)。
文件系统的运作与操作系统的文件数据有关,较新的操作系统的文件数据除了文件实际内容外,通常还有非常多的属性,例如之前提过的rwx等。
文件系统通常会将文件属性和文件内容放在不同的区块,其中权限和属性放到inode中,实际数据放到data block中。同时还有一个**超级区块(superblock)**用于记录整个文件系统的整体信息,其中包括inode和block的总数、使用量、剩余量等。
Linux的EXT2文件系统
EXT2文件系统示意图如下:
EXT2文件系统在格式话的时候基本上都是区分为多个区块组群(block group),每个区块群组都有独立的inode/block/superblock系统。
其中文件系统最前面的为启动扇区,启动扇区可以安装开机管理程序。
每个区块组群的六个主要内容介绍如下
data block 资料区块
data block 是用来放置文件内容数据的,在EXT2文件系统中所支持的block大小有1k,2k,4k三种,在格式化的时候block大小被固定。
注意:block的大小会对EXT2文件系统有限制
block还有如下基本限制:
- 原则上,block的大小与i数量在格式化后就不能进行修改(除非重新格式化)
- 每个block内最多只能存放一个文件的数据
- 如果一个文件的大小大于block的大小,则一个文件就会占用多个block数量
- 如果一个文件的大侠小于block的大小,则block的剩余容量就不能再被使用了(磁盘空间会被浪费)
综上
- 如果你的文件都较小,却选用较大的block,那么就会产生一些容量上的浪费
- 如果你的文件都较大,却选用较小的block,那么一个文件就会占用较多的block,inode则需要记录更多的block号码,会造成文件系统的不良读写效果。
inode table (inode表格)
inode记录的文件数据至少有:
- 该文件的存取模式(read/write/excute)
- 该文件的拥有者与组群(owner/group)
- 该文件的容量
- 该文件建立或状态改变的时间(ctime)
- 最近一次读取的时间(atime)
- 最近修改的时间(mtime)
- 定于文件特性的旗标(flag),例如setuid等
- 该文件真正内容的指向(pointer)
与data block相同的是,inode的数量和大小也是在格式化的时候就已经固定了,同时也有一定的限定:
- 每个inode大小均为128bytes
- 每个文件都仅占用一个inode,所以一个文件系统能建立的文件舒利昂与inode数量有关
- 系统读取文件需要先找到inode,并分析inode所记录的权限与用户是否符合,如果符合才能够开始实际读取block的内容
superblock(超级区块)
superblock是用于记录整个filesystem相关信息的地方,没有superblock,就没有filesystem
其中记录的主要信息有:
- block和inode的总量
- 未使用和已使用的inode/block数量
- block和inode的大小
- filesystem的挂载时间,最近一次写入数据的时间、最近一次检验磁盘的时间等文件系统的相关信息
- 一个valid bit数值,如果此文件系统已被挂载,则valid bit为0,若违背挂载,则valid bit为1
(PS:挂载指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件,如下图)
filesystem description(文件系统描述说明)
用于描述每个block group的开始与结束的block号码,以及每个区段分别位于哪一个block号码之间。
block bitmap(区块对照表)
用于记录那些block是空的,方便系统很快找到可以使用的空间来处理文件。
inode bitmap(inode对照表)
与block bitmap功能类似,用于记录未使用的inode号码。
dumpe2fs:查询EXT家族superblock信息
dumpe2fs [-bh] 装置文件名
- 这里的装置文件名即为挂载在Linux上装置的文件,例如/dev/vad5。
目录树的读取
之前提过,对文件名的更改以及删除等操作是与目录的w权限有关的,这是因为文件名并不储存于block中,而是储存于对应目录的block中。同样,我们读取文件是经过目录的inode和block的,然后再找到待读取文件inode,最后读取想要的文件block内的数据。
目录树是由根目录开始读起的,下面以读取/etc/passwd文件为例:
- / 的inode:通过挂载点的信息找到inode为128的根目录inode,并且inode规范的权限让我们可以读取该block的内容(rx)。
- / 的block:经过上一个步骤取得block的号码,并找到该内容有etc/目录的inode号码
- etc/ 的inode:读取inode号码得知该用户拥有rx的权限,因此可以读取etc/的block内容
- etc/的block:经过上面几个步骤取得的block号码,并找到该内容有passwd文件的inode号码
- passwd的inode:读取inode号码得知该用户拥有r的权限,因此可以读取改文件的block内容
- passwd的block:最后将block内容的数据读取出来
ps,查询inode等信息可以如下:
文件的存取和日志式文件系统的功能
文件和目录的新建需要block bitmap 和inode bitmap。具体操作过程如下:
- 先确定用户对欲新增的文件的目录是否有wx的权限,如果有才能够进行添加操作
- 根据inode bitmap找到没有使用的inode号码,并将新文件的权限和属性写入
- 根据blocck bitmap找到没有使用中的block号码,并将实际的数据写入到该block中,并且根性inode的block指向数据
- 将刚刚写入的inode和block数据同步更新inode bitmap 和block bitmap, 并更新superblock的内容
一般将superblock, inode bitmap 以及block bitmap区段称为metadata(中介资料)。因为这几个区段的数据经常发生变化,每次增加移除等操作都会对这三个区段造成数据的改写。
数据的不一致状态
如果上述四个步骤都顺利完成则没有问题,如果在运行的过程中,出现中断(例如断电,系统核心发生错误等)而导致写入的数据只有inode table和data block而已,最后一个同步跟新中介数据的步骤没有完成。
所以工程师对文件的添加操作进行了如下改进:
- 预备:当系统需要写入一个文件的时候,会先在日志记录区块中记录某个文件准备写入的信息
- 实际写入:开始写入文件的权限和数据,然后开始更新中介资料的数据
- 结束:完成数据与中介资料的更新后,在日志记录区块中完成改文件的记录
所以我们只需要去检查日志记录区块,即可得知哪个文件出现了问题。
Linux文件系统的运作
数据需要加载到内存中,CPU才能对数据进行处理,如果文件较大,则将会消耗大量的时间在磁盘的写入和读取上,导致效率的降低。
Linux中处理的方法如下(之前有提到过的):
系统加载一个文件到内存后,如果改文件没有被更改过,那么在内存区段的文件数据就会被设定为clean,如果被更改过,那么就会被设定为dirty。此时所有的动作都在内存中执行,并没有写入到磁盘中。系统会不定时的将内存中设定为dirty的数据写入到磁盘中,保持磁盘与内存数据的一致。
因为内存的速度比磁盘快,所以如果能将常用的文件放置到内存中,那么就会增加系统的性能,所以linux的文件系统和内存有很大的关系:
- 系统会将常用的文件数据放置到主存储器的缓冲区中,用来加速文件系统的读写,因此linux的物理内存最后都会备用光,以达到加速系统效能
- 可以手动使用sync来强制内存中设定为dirty的文件写回到磁盘中去
- 如果正常关机,那么关机指令将会呼叫sync来将内存数据写回到磁盘中去
- 如果不正常关机,数据尚未写回到磁盘中去,因此重启会花费大量的时间来进行磁盘检验,甚至可能导致文件系统的损毁(非磁盘损毁)
挂载点
挂载: 将文件系统和目录树结合的动作我们称为挂载
注意: 挂载点必须是目录,并且该目录为进入文件系统的入口,必须要挂载到目录树的某个目录后才能够使用这个文件系统。
XFS文件系统
EXT文件系统虽然支持度最广,但是格式化超慢,因为EXT文件系统对于文件格式化的处理方式为预先规划出所有inode/block/meta data等数据,未来系统可以直接使用,不需要动态配置。但是当磁盘的容量越来越大后,文件系统预先分配inode和block就消耗了大量的时间。
综上,从centos7开始,文件系统预设为XFS。XFS可以具备所有EXT4文件系统有的功能。他的资源主要规划为:资料区data section、 一个文件系统登录区 log section 、实时运作区realtime section。主要内容如下:
资料区
与ext类似,包括了inode、data block、superblock等数据。与ext不同的是,inode和block都是在系统需要的时候才进行动态配置的, 所以有较快的格式化速度。
文件系统活动登录区
主要用于记录文件系统的变化,和之前提到的EXT相同,只有当文件完整写入到数据区后,记录才会被终结。
这个区块的磁盘活动相当频繁,因为文件系统所有的动作都会在这个区块内记录。为了提高工作效率,XFS允许指定外部的磁盘作为文件系统的日志区块,例如可以将ssd磁盘作为xfs的登陆区。
实时运作区
文件建立时,xfs会在区段内找到一个或数个extent区块,将这个文件放置在区块内,等到分配完成后,再写入到资料区的inode和block中去,extent的大小在格式化的时候指定,范围为4K~1G。