认识Linux文件系统

Linux最传统的磁盘文件系统使用的是ext2,文件系统是建立在磁盘之上的。重点在于inode、数据区块(block)还有超级区块(superblock)等文件系统的基本部分。

磁盘组成与区分

磁盘的组成:

  • 圆形的碟片(记录数据部分)
  • 机械手臂及机械手臂上的磁头(可擦写碟片上的数据)
  • 主轴马达,可以转动碟片,让机械手臂的磁头在碟片上读写数据
  • 扇区(Sector):为最小的物理存储单位,主要有512B与4KB俩种格式
  • 柱面:将扇区组成一个圆即为柱面
  • 早期的分区主要以柱面为最小分区单位,现在的分区通常使用扇区为最小分区单位
  • 磁盘分区表主要有两种格式:一种是限制较多的MBR分区表,一种是较新且限制较少的GPT分区表
  • MBR:第一个扇区最重要,里面有:主引导记录及分区表,其中MBR占有446B,而分区表则占有64B
  • GPT:除了分区数量扩充较多之外,支持的磁盘容量也可以超过2TB
    image.png
    所有物理磁盘的文件名都已经被模拟成/dev/sd[a-p]额格式,分区的文件名若以第一块磁盘为例,则为/dev/sda[1-128]
  • /dev/sd[a-p][1-128]:为物理磁盘的文件名
  • /dev/vd[a-d][1-128]:为虚拟机磁盘的文件名
    大容量磁盘大多要使用GPT分区表才能够使用全部的容量,建议使用GPT分区表而不是MBR分区表

文件系统特性

格式化:每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需要的数据,因此就需要将分区进行格式化,以称为操作系统能够利用的文件系统格式(WIN98以前用FAT,WIN2000之后用的NTFS,Linux为ext2)。
LVM与软件磁盘阵列这些技术可以将一个分区格式化为多个文件系统(LVM),也能够将多个分区合成一个文件系统(LVM,RAID)。目前格式化时已经不再说成针对硬盘分区来格式化了,通常可以称呼一个可被挂载的数据为一个文件系统而不是一个分区
文件系统通常会将权限与属性放置到inode,实际数据则放置到数据区块中

  • 超级区块:记录此文件系统的整体信息,包括inode与数据区块的总理、使用了、剩余量,以及文件系统的格式与相关信息等
  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的区块号码
  • 数据区块:实际记录文件的内容,若文件太大时,会占用多个区块
    索引式文件系统(ext2,含有inode)与FAT(u盘,不含有inode)
    碎片整理:碎片整理的的原因就是文件写入的区块太多于离散,此时文件读取的性能将会变得很差所致。这个时候可以通过碎片整理将同一个文件所属的区块集合在一起,这样数据的读取会比较容易。因此FAT的文件系统需要不时地碎片整理一下,ext2是索引式文件系统,基本上不太需要进行碎片整理

Linux的ext2文件系统(inode)

Linux的文件系统除了原有的数据内容外,还含有非常多的权限与属性,这些权限与属性是为了保护每个用户所拥有的数据的隐密性,标准的ext2就是使用这种inode为基础的Linux文件系统。
文件系统一开始就将inode与数据区块规划好了,除非重新格式化(或利用resize2fs等命令修改其大小),否则inode与数据区块固定后就不再变动
ext2文件系统格式化的时候基本上区分为多个区块群组(block group),每个区块群组都有独立的inode、数据区块、超级区块系统。
文件系统最前面有一个启动扇区,这个启动扇区可以安装启动引导程序

数据区块(data block)

数据块是用来放置文件数据地方,在ext2文件系统中所支持的区块大小有1K、2K及4K三种

  • 区块的大小与数量在格式化完成就不能够再修改(除非重新格式化)
  • 每个区块内最多只能够放置一个文件的数据
  • 如果文件大于区块的大小,则一个文件会占用多个区块数量
  • 若文件小于区块,则该区块的剩余容量就不能狗再被使用了(磁盘空间会浪费)
    总结:大的区块可能会产生较严重的磁盘容量浪费,区块较小的话,大型文件会占用数量更多的区块,inode也要记录更多的区块号码,造成文件系统读写性能不佳

inode table(inode 表)

inode的内容在记录文件的属性以及该文件实际数据是放置在哪几个区块内
记录数据如下:

  • 该文件的读写属性(rwx)
  • 该文件的拥有者与用户组(owner、group)
  • 该文件的大小
  • 该文件建立或状态改变的时间(ctime)
  • 最近一次的读取时间(atime)
  • 最近修改的时间(mtime)
  • 定义文件特性的标识(flag、如SetUID)
  • 该文件真正内容的指向(pointer)
    inode的数量与大小在格式化时已经固定了
  • 每个indoe大小均固定为128B(新的ext4与xfs可设置到256B)
  • 每个文件都仅会占用一个inode而已
  • 文件系统能够建立的文件数量与inode的数量有关
  • 系统读取文件需要先找到inode,并分析inode所记录的权限与用户是否相符合,若符合才能够读取区块的内容

Superblock(超级区块)

超级区块是记录整个文件系统相关信息的地方,没有超级区块,就没有这个文件系统,其记录信息如下

  • 数据块与inode的总量
  • 未使用与已使用的inode与数据区块数量
  • 数据区块与inode的大小(block为1、2、4K,inode为138B或256B)
  • 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息
  • 一个有效位数值,若此文件系统已被挂载,则有效位为0,若未被挂载,则有效位为1

与目录树的关系

Linux系统下,每个文件(不管是一般文件还是目录文件)都会占用一个inode,且可依据文件内容的大小来分配多个区块给该文件使用
目录的内容在于记录文件名
一般文件才是实际记录数据内容的地方

目录

在Linux下文件系统建立一个目录时,文件系统会分配一个inode与至少一块区块给该目录

文件

在Linux下的ext2建立一个一般文件时,ext2会分配一个inode与相对于该文件大小的区块数量给该文件

目录树读取

inode本身并不记录文件名,文件名记录是在目录的区块中。
新增、删除、修改文件名与目录的w权限有关。因为文件名是记录在目录的区块当中,因此当我们要读取某个文件时,就务必会经过目录的inode与区块,然后才能够找到那个待读取文件的inode号码,最终才会读取到该文件区块中的数据

目录与文件数据读取流程为

/etc/passwd读取流程(假设读取者身份为一般身份用户)

  • 1./的inode:
    通过挂载点的信息找到inode号码为128的目录indoe,且inode规范的权限让我们可以读取该区块的内容(有r与x)
  • 2./的区块:
    经过上个步骤取得区块的号码,并找到该内容由etc/目录的inode号码
  • 3.etc/的inode:
    读取inode号码得到inode获取得知用户具有r与x权限,因此可以读取etc/的区块内容
  • 4.etc/的区块:
    取得区块号码,并找到该内容有passwd文件的inode号码
  • 5.passwd的inode:
    读取inode查看得知用户具有r权限,因此可以读取passwd的区块内容
  • 6.passwd的区块:
    最后将该区块内容的数据读出来

ext2/ext3/ext4文件的存取与日志式文件系统的功能

新建一个文件或目录时系统的操作:

  • 1.先确定用户对于欲新增文件的目录是否具有w与x的权限,若有的话才能新增
  • 2.根据inode对照表找到没有使用的inode号码,并将新文件的权限/属性写入
  • 3.根据区块对照表找到没有使用中的区块号码,并将实际的数据写入区块中,且更新inode的区块指向数据
  • 4.将刚刚写入的inode与区块数据同步跟新inode对照表与区块对照表,并更新超级区块的内容
    数据存放区域:inode对照表与数据区块超微数据存放区
    元数据:超级区块、区块对照表与inode对照表等区段被称为元数据,超级区块、inode对照表及区块对照表的数据时经常变动的,每次新增、删除、编辑时都可能会影响到这三个部分的数据,因此才被称为元数据

数据的不一致状态

当写入文件系统时,因为某些原因导致系统中断,写入的数据仅有inode对照表及数据区块而已,最后一个同步更新元数据的步骤并没有完成,此时就会发生元数据的内容与实际数据存放区产生不一致的情况。
以前ext2文件系统中,系统在重新启动的时候,就会借由超级区块当中记录的有效位(是否有挂在)与文件系统状态(正确卸载与否)等状态来判断是否强制进行数据一致性的检查,如果文件系统容量较大时,会造成恢复的时间过长,所以日志文件系统才会兴起

日志式文件系统(Journaling filesystem)

在文件系统当中规划出一个区块,该区块专门记录写入或修改文件时的步骤,可以简化一致性检查的步骤

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

Linux文件系统的运行

所有数据都要加载到内存后CPU才能够进行处理,为了解决在磁盘读取上的效率,Linux使用异步处理的(asynchronously)方式。
异步处理方式:
当系统加载一个文件到内存后,如果该文件没有被修改过,则在内存区段的文件数据会被设置为【干净(clean)】。但如果内存中的文件数据被更改过了(例如编辑过文件),此时该内存中的数据会被设置为【脏的(Dirty)】,此时所有的操作都还在内存中执行,并没有写入到磁盘中。系统会不定时的将内存中设置为【Dirty】的数据写回磁盘,以保存磁盘与内存数据的一致性,也可以使用sync命令来手动强制写入磁盘。
Linux系统文件系统与内存的关系:

  • 系统会将常用的文件数据放置到内存的缓冲区,以加速文件系统的读写操作
  • Linux的物理内存最后都会被用光,这是正常的情况,可加速系统性能
  • 可以手动使用sync来强制内存中设置为Dirty的文件回写到磁盘中
  • 正常关机时,关机命令会主动调用sync来将内存的数据回写入磁盘内
  • 但若不正常关机,由于数据尚未回写到磁盘内,因此重新启动后可能会花很多时间在进行磁盘校验,甚至可能导致文件系统的损坏(非磁盘损坏)

挂载点的意义(mount point)

每个文件系统都有独立的inode、区块、超级区块等信息,这个文件系统要能够连接到目录树才能被我们使用。将文件系统与目录树结合的操作我们称为【挂载】。**挂载点一定是目录,该目录为进入该文件系统的入口。**因此并不是任何文件系统都能使用,而是必须要挂载到目录树的某个目录后,才能够使用该文件系统。同一个文件系统的某个inode只会对应到一个文件内容而已(因为一个文件占用一个inode),因此我们可以通过判断inode号码来却仍不同文件名是否问相同的文件

其他Linux支持的文件系统与VFS

Linux常见的支持文件系统有:

  • 传统文件系统:ext2、minx、FAT(用vfat模块)、iso9660(光盘)等
  • 日志式文件系统:ext3、ext4、ReiserFS、Windows'NTFS、IBM'sJFS、SGI's XFS、ZFS
  • 网络文件系统:NFS、SMBFS
    查看Linux支持的文件系统:
    image.png
    系统目前已加载到内存中支持的文件系统:
    image.png

Linux VFS(Virtual Filesystem Switch)

Linux识别的文件系统式VFS在进行管理,用户并不需要知道每个硬盘分区上面的文件系统是什么,VFS会主动帮我们做好读取的操作

XFS文件系统简介

CetnOS 7开始,默认的文件系统已经由原本的ext4变成了xfs文件系统

ext的弊端:支持度广,但格式化超慢

磁盘容量越来越大,传统的MBR都已经被GPT取代

XFS文件系统的配置

基本上xfs就是一个日志式文件系统,CentOS 7拿它当默认的文件系统,是因为xfs就是被开发用于高容量磁盘以及高型嫩南瓜文件系统之用,因此,相当适合现在的系统环境。
xif主要规划为三个部分:数据区(data section)、文件系统活动登陆区(log section)以及实时运行区(realtime section)

数据区

基本上与ext系列一样,包括inode、数据区块、超级区块等数据,但inode与区块都是系统需要用到时才动态配置产生,所以格式化操作块,这与ext不同

文件系统活动登录区

主要被用来记录文件系统的变量,有点像是日志区

实时运行区

当有文件要被建立时,xfs会在这个区段里面找一个到数个的extent区块,将文件放置在这个区块内,等到分配完毕后,再写入到data section的inode与区块中。extend大小(4K~1G)在格式化的时候指定

XFS文件系统的描述数据观察

xfs_info
image.png
man xfs_info
image.png

文件系统的简单操作

查询文件系统的总容量与每个目录所占的容量及链接文件(link file)

磁盘与目录的容量

磁盘的整体数据是在超级区块中,但是每个文件的容量在inode中

  • df:列出文件系统的整体磁盘使用量
  • du:查看文件系统的磁盘使用量(常用在查看目录所占磁盘空间)

df

df -[ahikHTm] [目录或文件名]
df主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在超级区块内的信息,所以这个命令显示结果的速度非常快
选项与参数

  • -a:列出所有的文件系统,包括系统特有的/proc等文件系统
  • -k:以KBytes的容量显示各文件系统
  • -m:以MBytes的容量显示各文件系统
  • -h:以人们较易阅读的GBytes、Mbytes、kBytes等格式自行显示
  • -H:以M=1000K替换M=1024K的进位方式
  • -T:连同该硬盘分区的文件系统名称(例如xfs)也列出
  • -i:不用磁盘容量,而已inode的数量来显示
    image.png
    image.png
    image.png
  • Filesystem:代表该文件系统是在那个硬盘分区,所以列出设备名称
  • 1k-blocks:说明夏敏的数字单位是1KB,可利用-h或-m来改变容量
  • Used:使用掉的磁盘空间
  • Available:剩下的磁盘空间大小
  • Use%:磁盘使用率,如果在90%以上,就得注意,免得容量不足造成系统问题
  • Mounted on:磁盘的挂载目录(挂载点)
    image.png

du

du会直接到文件系统内存区查找所有的文件数据,
du [-ahskm] 文件或目录名称
选项与参数:

  • -a:列出所有的文件与目录容量,因为默认仅同级目录虾米那的文件量
  • -h:以易阅读的容量格式(G/M)显示
  • -s:仅列出总量,而不列出每个各别的目录占用容量
  • -S:不包括子目录下的总计,与-s有点差别
  • -k:以KBytes列出容量显示
  • -m:以MBytes列出容量显示
    du -sm /* :检查根目录下面每个目录所占用的容量

硬链接与符号链接:ln

在Linux系统下面的链接文件有两种:

  • 1.类似Windows的快捷方式功能的文件,可以快速地链接目标文件(或目录)
  • 2.通过文件系统地inode链接来产生新文件名,而不是产生新文件,这种称为硬链接(hard link)

硬链接(hard link,硬式链接或实际链接)

  • 每个文件都会占用一个inode,文件内容由inode地记录来指向
  • 想要读取该文件,必须要经过目录记录地文件名来指向到正确的inode号码才能读取
    简单地说硬链接只是在某个目录下新增一条文件名链接到某inode号码地关联记录
    image.png

硬链接的好处

  • 安全,如果将任何一个文件名删除,inode与区块都还是存在的。此时可以通过宁一个文件名来读取到正确的文件数据。此外不论通过哪个文件名来编辑,最终的结果都会写入到相同的inode与区块中因此均能进行数据的修改

硬链接限制

  • 不能跨文件系统
  • 不能链接目录(如果链接到目录时,链接的数据需要连同被链接目录下面的所有数据都建立链接,因此造成相当大的环境复杂度,所以目前硬链接对于目录暂时还是不支持的)

符号链接(软连接)

符号链接就是建立一个独立的文件,而这个文件会让数据的读取指向它链接的那个文件的文件名
符号链接与Windows的快捷方式划等号,由符号链接所建立的文件为一个独立的新的文件,所以会占用inode与区块
ln [-sf] 源文件 目标文件
选项与参数:

  • -s:如果不加任何参数就进行链接,那就是硬链接,至于-s就是符号链接
  • -f:如果目标文件存在时,就主动将目标文件直接删除后再建立

软硬链接总结

硬链接即使某一个目录下的关联数据被删除,也没有关系,只要有任何一个目录下存在着关联数据,该文件也会存在
由于硬链接限制太多,包括无法链接目录,所以在用途上比较受限,反而是符号链接(软链接)的使用方面较广。

磁盘的分区、格式化、检验与挂载

在系统里新增一张磁盘,有如下操作需要:

  • 1.对磁盘进行划分,以建立可用的磁盘分区
  • 2.对该硬盘分区进行格式化(format),以建立系统可用的文件系统
  • 3.对刚刚建立好的文件系统进行检验
  • 4.在Linux系统上,需要建立挂载点(亦即是目录),并将它挂载上来
    其他:硬盘分区的大小、日志功能、inode与区块的数量规划

观察磁盘分区状态

目前磁盘分区主要有MBR以及GPT两种格式,可以使用parted工具来处理。或者使用fdisk或gdisk来处理分区。

lsblk [list block device]列出系统上的所有磁盘列表

lsblk [-dfimpt] [device]
选项与参数:

  • -d:仅列出磁盘本身,并不会列出该磁盘的分区数据
  • -f:同时列出该磁盘内的文件系统名称
  • -i:使用ASCII的字符输出,不要使用复杂的编码(在某些环境下很有用)
  • -m:同时输出该设备在/dev下面的权限信息(rwx的数据)
  • -p:列出该设备的完整文件名,而不是仅列出最后的名字
  • -t:列出该磁盘设备的详细数据,包括磁盘阵列机制、预读写的数据量大小等
    image.png
    上图为sda为本地虚拟机使用的本地sata磁盘
    image.png
    上图vda为alibaba提供的Linux虚拟化磁盘
    信息显示:
  • NAME:设备的文件名,会省略/dev等前导目录
  • MAJ:MIN:内核识别的设备都是通过这两个代码来实现的,分别是主要与次要设备代码
  • RM:是否为可卸载设备(removable device),如光盘、USB磁盘等
  • SIZE:容量
  • RO:是否为只读设备
  • TYPE:是磁盘(disk)、分区(partition)还是只读存储器(rom)等输出
  • MOUNTPOINT:挂载点

blkid 列出设备的UUID等参数

lsblkc-f也可以列出设备的uuid
image.png

parted 列出磁盘的分区表类型与分区信息

parted [device_name] print
image.png

磁盘分区:gdisk/fdisk

磁盘格式化 (创建文件系统)

文件系统检验

文件系统挂载与卸载

磁盘/文件系统参数自定义

设置启动挂载

内存交换分区(swap)创建

建立内存交换分区步骤:
1.分区:先使用gdisk在磁盘中划分出一个分区给系统作为内存交换分区
2.格式化:利用建立内存交换分区格式的[mkswap 设备文件名]就能够格式化该分区称为内存交换分区格式
3.使用:最后将该swap设备启动,方法为[swapon 设备文件名]
4.观察:最终通过free与swapon -s这个命令来观察一下内存的使用量


这个家伙很懒,啥也没有留下😋