跳到主要内容

17、Linux 实战:文件系统

文件系统

Filesystem(文件系统):可被挂载的数据,与partition(硬盘分区)不同

文件系统 说明
ext Linux扩展文件系统
ext2 Linux扩展文件系统的升级版
ext3 第3代扩展文件系统,支持日志功能
ext4 第4代扩展文件系统,支持高级日志功能
hpfs OS/2高性能文件系统
jfs IBM日志文件系统
iso9660 ISO 9660文件系统(CD-ROM)
minix MINIX文件系统
msdos 微软的FAT16
ncp Netware文件系统
nfs 网络文件系统
ntfs Microsoft NT文件系统
proc 访问系统信息
ReiserFS 高级Linux1文件系统
smb Samba SMB文件系统
ufs Unix文件系统
umsdos BSD文件系统
vfat Windows95文件系统(FAT 32)
XFS 高性能64位日志文件系统

磁盘基础

扇区(Sector):磁盘最小的物理存储单位,每个扇区的容量为512字节

1)其中第一个扇区最重要,存储主引导记录和分区表

//第一个扇区:446字节的主引导记录、64字节的分区表和2字节的结束符

如:第一个扇区的组成图
 

//所以磁盘仅能有四个主分区,各个主分区相互独立,且每个分区记录了该区段的启始与结束标记

硬件设备 命名规则
SCSI/SATA/U盘 /dev/sd[a-p]
IDE设备 /dev/hd[a-d]
软驱 /dev/fd[0-1]
光驱 /dev/cdrom
鼠标 /dev/mouse
打印机 /dev/lp[0-15]
磁带机 /dev/st0或/dev/ht0

//字母顺序a~p代表系统内核识别该设备/磁盘的顺序由系统识别顺序决定(并不是由主板插槽所决定的)

物理磁盘命名顺序:/dev/sd[a-p][1-128]

虚拟磁盘命名顺序:/dev/vd[a-p][1-128]

1)磁盘分区后必须进行格式化(format)才能使用

2)一个可被挂载的数据为一个文件系统(而不是一个分区)

Master Boot Record

MBR(主引导记录):存储主引导记录和分区表(最大支持2TB的硬盘)

1)主引导记录:可安装和使用启动引导程序,446字节

2)分区表:记录整块硬盘分区状态,64字节

如:划分4个主分区后的硬盘
 
//一般4个分区不能满足实际需求,就需通过扩展分区和逻辑分区增加分区

扩展分区:利用一个主分区记录更多的分区信息以增加分区

1)扩展分区和主分区是一样的,仅功能不同(仅把主分区重命名)

2)本质上就是占用16字节分区表空间指向下一个分区的指针(形成单向链表)

3)主分区和扩展分区只能有4个(硬盘限制)

4)扩展分区只能有一个(系统限制),逻辑分区可有无限个

逻辑分区:由扩展分区继续划分出来的分区

1)从扩展分区划分出的逻辑分区(通过链表进行链接);

2)逻辑分区的设备名称默认从5开始;

3)能被格式化使用的是:主要分区和逻辑分区(扩展分区不能被格式化)

//因为3和4为主分区保留,不能使用

如:1个主分区和通过扩展分区增加的5个逻辑分区
 

GUID partition table

GPT(全局唯一标识磁盘分区表):将磁盘所有区块以LAB划分

1)默认为512字节(不具有分区概念);

2)最大支持18EB的硬盘(该限制可忽视,可认为是无限制的)

LAB0(MBR兼容模块):存储主引导记录

LAB1(GPT表头记录):记录分区表相关信息(位置和大小)和GPT备份分区

//同时也存储了分区表的校验码(CRC32)

LAB2~33(实际信息存储):每个LBA可记录4组分区记录

文件系统特性

文件系统通常会将文件实际内容和文件属性分别存放在不同的区块,同时还会有一个超级区块(superblock)记录整个文件系统的整体信息

超级区块:记录该文件系统的整体信息,包括inode、数据区块的总量、使用量、剩余量和文件系统的格式以及其他相关信息

inode:记录文件的属性,同时记录此文件的数据所在的区块号码,且一个文件仅能占用一个inode

数据区块:实际记录文件的内容(若文件太大时,会占用多个区块)

1)ext文件系统创建之后就将inode和数据区块规划好了,除非重新格式化或利用resize2fs等命令修改其大小,否则inode与数据区块固定后就不再变化

文件系统 说明
Ext3 日志文件系统 能够在系统宕机时避免文件系统资料丢失, 且能自动修复数据的不一致和错误
Ext4 Ext3的升级版(日志文件系统) Centos6系统默认的文件系统 支持的存储容量为1EB,可批量分配Block块
XFS 高性能的日志文件系统 Centos7系统默认的文件系统 快速修复文件、占用资源少和支持存储容量为18EB

//日志文件系统修复本质:预先记录磁盘的每项操作

FAT文件系统

通过读取完一个数据区块后得知下一个数据区块号,再读取下一个数据区块

1)不存在inode;

如:一个文件依序写入是1->7->4->15,则读出时
 
//会存在区块太过离散,导致读取性能变差

索引式文件系统

inode(indexed
allocation)
:通过inode记录该文件的所有数据区块号,再根据磁盘的读取顺序,一次性将文件读取出

如:索引式文件系统一次性读出文件
 

Block group

Ext4文件系统格式化时会将区分为多个区块群组(Block group)

1)每个区块群组都有独立的inode、数据区块和超级区块系统
 

启动扇区:安装启动引导程序的扇区

超级区块(Superblock):记录整个文件系统相关信息

相关信息
数据区块与inode总量
未使用与已使用的inode和数据块数量
数据区块和inode大小
文件系统的挂载时间
最后一次写入数据的时间
最近依次检验磁盘(fsck)的时间
有效位数值(0为挂载,1为未挂载)

1)没有超级区块,就没有该文件系统

2)每个Block group都可能含有超级区块,但一个文件系统只能有一个超级区块

//除了第一个Block group含有超级区块,其他的Block group可能都不含有;若含有,也是第一个Block group的超级区块的备份

Filesystem Description(文件系统描述):描述每个区块群组的开始与结束

1)并说明每个区段分别属于的区块

区块对应表(Block bitmap):记录使用和未使用的区块

inode对应表(inode bitmap):记录使用和未使用的inode

inode表(Inode Table):记录文件基础权限、文件的属主和属组、文件的大小、文件的ctime、atmie和mtime、文件的标识符、文件的数据区块号

1)每个inode大小固定为128字节,且每个文件都会占用一个inode

2)文件系统能够建立的文件数量与inode的数量有关

3)用户操作文件时,系统会需先找到文件的inode,并分析inode所记录的权限与用户是否符合,若符合才能对数据区块的内容进行操作

inode记录区块号码的区域为:12个直接、1个间接、1个双间接、1个三间接

1)间接就是再利用一个区块当作记录区块号码的记录区

2)当一个文件的inode被写满后,系统就分配给该文件一个新的Block块,该Block块就会像inode一样记录相关信息
 
//磁盘的整体数据是在超级区块中,每个文件的容量则在inode中

数据区块(Data Block):用来放置文件数据的地方,在ext2文件系统中支持的区块大小有1K、2K和4K三种(格式化时就确定其区块的大小),且每个区块都有编号(方便inode记录)。

1)每个区块内最多只能存储一个文件的数据

//若文件大于区块的大小,则一个文件会占用多个区块
//若文件小于区块的大小,则占用的区块剩余容器也不能再被使用了

Directoy tree

目录树结构:以根为主,向下呈现为分枝状的目录结构的文件架构

1)Linux所有文件都是由根目录衍生出来的

当建立一个文件时:

1)ext2会分配一个inode和与该文件大小相匹配的区块数量

当建立一个目录时:

1)ext2会分配一个inode和至少一块大小相匹配的区块

2)inode记录该目录的相关权限、属性和分配到的区块号码

3)区块记录该目录下的文件名与该文件名占用的inode号码数据

目录树:由于目录树是由根目录开始读起,因此系统通过挂载的信息可以找到挂载点的inode号码,此时就能够得到根目录的inode内容,并依据该inode读取根目录的区块内的文件名数据,再一层一层的往下读到正确的文件名。

Journaling filesystem

元数据(中继数据):描述数据的数据

1)区块对照表、inode对照表和超级区块均为元数据(metadata)

2)数据不一致(Inconsistent)状态:元数据的内容与实际数据存放区不一致

如:当文件系统新增一个文件时,会进行以下操作:

1)先确定用户对与新增文件的目录是否具有w和x权限

2)根据inode对照表找到没有使用的inode号码,并将新文件的权限/属性写入

3)根据区块对照表找到没有使用的区块号码,并将实际的数据写入区块中

且更新inode的区块指向数据

4)用写入的inode和区块数据同步更新inode对照表和区块对照表,并更新超级区块的内容

日志式文件系统(Journaling filesystem):记录写入/修改文件时的操作

1)若文件出现数据不一致状态,就可通过日志排除

如:将数据写入日至式文件系统的文件时,系统会进行以下操作:

1)预备:系统写入文件时,先在日志记录区块中记录该文件准备要写入的信息

2)实际写入:开始写入文件的权限和数据;开始更新metadata的数据

3)结束:完成数据和metadata的更新,并在日志记录区块中记录该文件操作

异步处理(asynchronously):当系统加载一个文件到内存后,若该文件没有被修改过,则在内存区段的文件数据会被设置为“clean”;若内存中的文件数据已被更改了,则在内存区段的文件数据会被设置为“dirty”,此时所有的操作都还在内存中执行,并没有写入到磁盘中,但系统会不定时的将内存中设置为“dirty”的数据写入到磁盘。

dumpe2fs命令:查询ext文件系统系列超级区块和普通块的信息

指令格式:dumpe2fs 选项 设备文件名

选项 含义
-b 列出文件系统中预留的块信息
-h 仅列出superblock的数据

XFS

XFS属于日志式文件系统,具有几乎所有ext文件系统系列具有的功能

1)由数据区、文件系统活动登录区和实时运行区三个区域构成

EXT XFS
inode节点 固定分配 动态分配
适用 小容量磁盘和普通文件 高容量磁盘和巨型文件
默认使用 Centos6.x Centos7.x

//由于ext文件系统系列在格式化时,使用静态配置直接规划处所有的inode、区块和元数据等数据;只能适用于小磁盘量,且格式化慢

三个区域

数据区(data section):分为多个存储群组存放实际数据

//也记录inode、数据区块和超级区块等数据

存储群组(allocation group)类似ext的区块群组(block group),配置:

1)整个文件系统的超级区块

2)剩余空间的管理机制

3)inode的分配与追踪

文件系统活动登录区(log section):记录文件系统的变化

1)因为所有操作都记录在该区块,所以该区块的磁盘活动比较频繁

//也可指定外部磁盘作为xfs文件系统的活动登录区

实时运行区(realtime section):当文件被建立时,xfs会在该区找到一个或多个extent区块(连续区块),将文件放置在这个区块内,等到分配完毕后,再写入到data section的inode区块中
//extent区块的大小在格式化时就设置大小

xfs_info命令:查询xfs文件系统系列超级区块和普通块的信息

指令格式:xfs_info 挂载点

如:查看当前主机的挂载设备的xfs文件系统
 

名称 含义
iseze inode的容量
agcount 存储群组的个数
agsize 每个存储群组具有的区块
sectsz 逻辑扇区的容量
bsize 区块的容量
sunit和swidth 与磁盘阵列的stripe有关
internal 登录区的位置在文件系统内
realtime 实时运行区域
extent extent容量

//整个文件系统的容量:agcount*agsize*bsize

VFS

VFS(Virtual Filesystem Switch)虚拟文件系统:集合各种文件系统

1)Linux系统通过VFS的内核功能去识别和调用各类文件系统,并提供统一的接口给用户/应用程序使用;

如:VFS提供给用户的接口
 

//实际的文件系统在VFS下隐藏了其特性和细节

文件系统操作

基础命令

df命令:列出各个挂载磁盘分区基本信息

指令格式1:df 选项

选项 含义
-a 列出所有的文件系统
-h 以易于阅读的方式显示
-i 不列出磁盘容量,而以inode数量显示
-T 显示磁盘分区的文件系统

//系统中存在很多特殊的文件系统,而这些特殊的文件系统几乎都是在内存中

如:以高可读性列出主机的磁盘分区
 
//查看多为第一项(系统真实使用的),后面两项为系统预分配使用的

指令格式2:df 选项 文档路径

1)列出该文档所属的文件磁盘分区的信息

如:查看/boot文件和/etc文件所属磁盘分区的信息
 

du命令:查看指定文档下的占用磁盘空间真实大小

指令格式:du 选项 目录路径

1)无选项和目录路径,则默认显示当前目录下所有文档各占用的磁盘空间

2)若文档为文件夹,则列出该文档下各个文档所占用的空间;

3)若列出目录的真实占用,应加上“-S”选项

选项 含义
-a 列出所有文档(包括子目录下的文件)的占用 默认仅列出目录(包括隐藏)的占用
-h 以高可读性列出
-s 仅列出所有文档的总占用
-S 列出各个目录所占用,并以总数显示文件占用

如:查看当前test2目录下占用的磁盘空间
 

df命令 du命令
从超级区块内读取信息 可读取到已经删除的文档 反应速度非常快 到文件系统内读取信息 仅能计算当前存在的文档 利用的是文档累加和

//文件被删除不是立刻就在系统中消失

链接

硬链接(Hard Link):新增一个附加文件,和源文件名使用同一个inode号码

1)硬链接的本质就是使多个文件名对应同一个inode号码;

2)硬链接不能跨文件系统,且不能链接目录;

3)每多一个文件名链接到inode号码,“ls -l”显示的第三栏链接数就增加1;

//当新建目录时:新目录的链接数为“2”,而上层目录的链接数会自动加“1”

软链接(Symbolic Link):新增一个独立文件,拥有独立的inode号码

1)该文档的数据读取指定链接的源文档;

2)创建软链接时,若源文件不和目标文件在同一目录时,应使用绝对路径;

//否则软链接将找不到源文件

3)软链接可跨文件系统,也可链接目录;

区别 软链接 硬链接
在指定的位置上生成一个 镜像 复制一个副本
源文件被删除时 不能使用 正常使用
增加inode和消耗区块 不会
相同点 两种链接都保持了文件的同步性(同步变化)

ln命令:给文件建立同步链接

指令格式:ln 选项 源文档 目标文档

1)无选项,则默认建立硬链接

选项 含义
-s 源文档与目标文档建立软链接
-f 若目标路径下已有同名文档,则删除后再建立(无提示)
-b 若目标路径下已有同名文档,在删除前先备份
-n 把已创建的软连接文档视为普通文档

如:使用和不适用-n选项的结果