【Linux上分之路】第六篇:Linux文件系统

冲鸭

Linux磁盘和文件系统

Linux系统管理员最重要的工作就是管理好自己的磁盘文件系统,每个分区太大会造成磁盘容量造成浪费,分区太小会导致磁盘系统没有空间存储文件,Linux最传统的磁盘文件系统使用的是EXT2,文件系统是创建在磁盘上

磁盘

磁盘组成

回顾一下磁盘的组成,主要可以分为:

  • 圆形的盘片(主要记录数据的部分)
  • 机械手臂与机械手臂上的磁头(用于读写盘片上的数据)
  • 主轴马达可以转动盘片,让机械手臂的磁头在盘片上读写数据
  • 扇区是最小的物理存储单位,每个扇区大小为512bytes
  • 将一个扇区组成一个圆就是一个柱面,柱面是分区的最小单位
  • 第一个扇区很重要,有硬盘主引导记录(MBR)及分区表,其中MBR为446bytes,分区表大小为64bytes,其余2bytes为扇区标识
Linux磁盘结构

Linux磁盘的结构2

磁盘分区

磁盘分区是指定分区的起始与结束柱面,即柱面范围

磁盘分区指定分区的柱面范围记录在第一个扇区的分区表中,但大小只有64bytes,最多只能记录四个分区,这个四个分区可以分为主分区和扩展分区,其中扩展分区还可以分为逻辑分区,能被格式化只有主要分区与逻辑分区

  • 主分区与扩展分区最多可以有4个(硬盘的限制)
  • 扩展分区只能有一个(操作系统的限制)
  • 逻辑分区是由扩展分区持续分出来的分区
  • 能够被格式化后作为数据访问的分区为主要分区和逻辑分区,扩展分区无法格式化
  • 逻辑分区的数量依操作系统不同,在Linux系统中,IDE硬盘最多有59个逻辑分区(5-63号),SATA硬盘则有11个逻辑分区(5到15号)

文件系统特性

磁盘分区完毕之后还需要进行格式化,操作系统才能使用这个分区,因为每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,需要将数据格式化,以成为操作系统能够利用的文件系统格式

Linux的正规文件系统为EXT2,一个可挂载的数据为一个文件系统而不是一个分区

Linux文件系统通常会将操作系统的文件数据分别放在不同的块,权限和属性放置到inode中,而实际数据则放置到data block块中,除此之外,一个超级块(superblock)会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量,每个inode和block都有编号

  • superblock:记录此文件系统的基本信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息
  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的block号码
  • block:实际记录文件的内容,若文件太大时,会占用多个block

每个inode和block都会有对应的编号,每一个文件都占用一个inode,inode内则会有文件数据放置的block号,即可以根据文件的inode号找到block号,就能出该文件的实际数据

Linux的EXT2文件系统

标准的Linux文件系统Ext2就是使用inode为基础的文件系统

文件系统一开始就将inode和block规划好了,除非重新格式化(或者改变文件系统大小),否则inode与block固定之后就不再变动了,当文件系统容量过大时,inode和block的数量太大不适合放在一起管理

Ext2文件系统在格式化时会划分很多块组(block group),每个块组都有独立的inode/block/superblock系统

文件系统最前面有一个启动扇区,这个启动扇区可以安装引导程序,可以将不同的引导装载程序安装到个别的文件系统最前端,而不同覆盖整块硬盘唯一的MBR,这样才能制作出多重引导的环境

inode本身不记录文件名,文件名是记录在block中

Linux文件系统块组系统

块组

每一个块组主要包括六个部分:

data block

data block:主要是用来放置文件内容地方,在Ext2文件系统中所支持block大小有1KB、2KB以及4KB三种

Block大小1KB2KB4KB
最大单一文件限制16GB256GB2TB
最大文件系统总容量2TB8TB16TB
  1. 原则上,block的大小和数量在格式化完就不能再改变(除非重新格式化)
  2. 每个block内最多只能放置一个文件的数据
  3. 如果文件大小大于block大小,则一个文件会占用多个block数量
  4. 若文件大小小于block大小,则该block的剩余空间就不能够再被使用了(磁盘空间会被浪费)

inodetable

inode主要记录的是文件的属性和文件内容放置的block编号,则inode记录的文件数据有:

  • 该文件的访问模式(rwx)
  • 该文件的所有者和组(owner/group)
  • 该文件的大小
  • 该文件创建或状态改变的时间
  • 最近一次读取的时间
  • 最近修改的时间
  • 定义文件特性的标志(flag),如SetUID
  • 该文件真正的指向
  • 每个inode固定大小为128bytes
  • 每个文件只会占用一个inode
  • 文件系统能够创建的数量与inode数有关

系统读取文件时先找到文件的inode编号,并分析inode所记录的权限与用户是否符合,符合才能开始实际读取block的内容

Linux文件系统inode表格

分析inode/block与文件大小的关系

inode的大小为128bytes,inode记录一个block就要花掉4bytes,系统将inode记录block号码的区域定义为12个直接、1个间接、1个双间接以及1个三间接,当文件较小时会通过12个直接来记录block号码,当文件较大时,会拿一个block来当做记录block号码的记录区,这就是间接、双间接、三间接的原理

以上图为例:

  • 12个直接指向可以指向:12 x 1K = 12K 条记录
  • 间接指向:256 x 1K = 256条记录 (inode记录block会用掉4bytes,1Kblock大小可以记录256个inode)
  • 双间接、三间接:原理同上

总额∶将直接、间接、双间接、三间接加总,得到12+256+256×256+256×256×256(K)=16GB 此时我们知道当文件系统将block 格式化为 1K大小时,能够容纳的最大文件为 16GB,比较一下文件系统限制表的结果可发现是一致的。但这个方法不能用在 2K 及 4K 的 block 大小的计算中,因为大于 2K 的 block 将会受到 Ext2 文件系统本身的限制,所以计算的结果会不太符合之故

superblock

superblock:是记录整个文件系统相关信息的地方,没有superblock就没有这个文件系统

  • superblock主要记录的信息为:
  • blcok与inode的总量
  • 未使用与已使用的inode/block数量
  • block与inode大小(block为1k、2k、4k,inode为128bytes)
  • 文件系统的挂载时间、最近一次写入时间、最近一次检验磁盘的时间的文件系统相关信息
  • 一个validbit数值,若此文件系统已被挂载,则valid bit为0,若未被挂载则valid bit为1

FIle system Description

文件系统描述说明:可以描述每个block group的开始与结束的block号码

block bitmap

块对照表:从block bitmap当中可以知道哪些block是空置状态,便于系统能够快速找到可使用的空间来处置文件,当删除某些文件时,那些文件原本占用的block号就会释放出来,此时在block bitmap中相对应的block号码的标志就会修改为未使用中

inode bitmap

inode对照表,功能与block bitmap类似,都是对未使用的inode号进行管理

文件系统与目录树的关系

ls -li

ls -li:查看目录内文件所占用的inode号码

Linux文件系统ls

ll -d dir

ll -d dir:查看目录下文件的block数量

Linux文件系统ll--d

文件系统大小与磁盘读取性能

当文件系统大小规划很大时,整个文件系统上面的文件通常无法连续写在一起,即block不会连续,而是填入式地将数据填入没有被使用的block当中,如果文件写入的block分散很开,就会发生文件数据离散,会导致读取效率低,因为block分散很开会使磁头在整个文件系统中频繁的读取,并且当block编号跨度大时,会导致硬盘读取数据时机械手臂幅度较大,使得数据读取性能较低

Ext2/Ext3文件的访问

创建一个新文件,则文件系统所对应的行为有:

  • 先确定用户对于欲添加文件的目录是否具有w与x的权限,有才能进入目录和添加文件
  • 根据inode bitmap找到没有使用的inode编号,并将新文件权限/属性写入
  • 根据block bitmap找到没有使用的block编号,并将新建文件的实际数据写入block中,并更新inode的block指向数据
  • 将刚才写入的inode与block数据同步更新inode bitmap与block bitmap,并更新superblock的信息

inodetable与data block称为数据存放区域,其他superblock、block bitmap、inode bitmap等区段称为metadata(中间数据),因为随着文件的删除与创建,编辑,这些metadata的数据是经常变动的,因为称为中间数据

日志文件系统

前提

日志文件系统产生的前提:文件系统数据不一致

当文件在写入文件系统时,发生不明原因(突然停电、系统内核发生错误)导致系统中断,所以写入的数据仅有inode table以及data block,最后一个同步更新中间数据步骤未做完,则此时meta data中的数据与实际数据存放区不一致,为了避免文件系统发生数据不统一的情况,产生了日志文件系统

专门用来记录写入文件或修改文件时的步骤

  1. 预备:当准备将一个文件写入文件系统时,会先在日志记录块中记录某个文件准备写入的信息
  2. 实际写入:开始写入文件的权限和数据,然后更新metadata的数据
  3. 结束:在完成数据与metadata的更新后,在日志记录块中完成该文件的记录

文件系统的操作

Linux文件系统采用异步处理的方式来解决文件读取的效率问题

当系统加载一个文件到内存后,如果该文件没有被改动过,则在内存区段的文件数据会被设置成clean,但如果内存中文件数据被更改过,此时内存中的数据被设置成dirty,此时所有的操作还在内存中,还没有写入到硬盘,系统会不定时的将内存中设置成dirty的数据写回磁盘。以保持内存与硬盘数据的一致性,也可以用sync命令手动强迫写入磁盘

Linux文件系统与内存

系统会将常用的文件数据放置在主存储器的缓冲区,以加速文件系统的读写

sync可手动强制内存中设置为dirty的文件回写到磁盘中

正常关机,关机命令会主动调用sync来将内存的数据写回磁盘

文件系统的简单操作

磁盘与目录的容量:df、du

df

df:列出文件系统的整体磁盘容量

df [参数] 目录或文件名 
参数: 
-a:列出所有的文件系统包括系统特有的/proc等文件系统 
-h:以人们较易阅读的GB、MB、KB等格式自行显示 
-i:不用硬盘容量。可以inode的数量来显示 

Linux文件系统df

结果信息:

  • Filesystem:代表文件系统是在哪个分区,所以列出设备名称
  • Size:磁盘空间总大小
  • Used:使用掉的磁盘空间
  • Avail:剩余的磁盘空间
  • Use%:磁盘的使用率
  • Mounted on:磁盘挂载的目录所在

df读取的数据几乎都是整个文件系统,读取的范围是在super block内的信息,显示中需要者注意根目录的磁盘使用率,当磁盘使用接近一百则Linux系统会出现很大问题

/dev/shm目录:其实是利用内存虚拟出来的磁盘空间,由于是通过内存虚拟出来的磁盘,访问速度很快,可以在该目录下新建任何数据文件,但是因为在内存中,下次开机时数据则该目录下的文件会消失

du

du:评估文件系统的磁盘使用期(常用于评估目录所占容量)

du [参数] 文件或目录名称 
参数: 
-h:以易读的容量格式显示 
-s:列出当前目录的总量,而不列出每个个别目录占用容量 
-S:不包含子目录下的总计 du不带参数会则默认为当前目录 

Linux文件系统du

总结

Linux最传统的磁盘文件系统使用的是EXT2,文件系统是创建在磁盘上,标准的Linux文件系统Ext2就是使用inode为基础的文件系统,Ext2文件系统在格式化时会划分很多块组(block group),每个块组都有独立的inode/block/superblock系统,了解了创建文件时,文件系统的具体行为操作

赶紧学习起来吧!我是一个正在努力找回自我的人,希望能和一起学习的人成长,有错误的地方请各位大佬帮忙指正,如果觉得有帮助就点个赞当作对我的一个小肯定❤,peace&love

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值