《Linux私房菜》-第七章-文件系统

Linux文件系统

索引式文件系统(ext2)

ext2系统在格式化的时候会区分为多个区块群组,每个区块群组都有独立的inode、数据区块、superblock等,而不是将所有的inode和数据区块放在一起,这样会造成管理困难。

启动扇区

文件系统最前面有一个启动扇区,用来安装启动引导程序

而每个区块群组主要有六部分组成:

数据区块

数据区块是用来存储真正数据的地方。

ext2系统中支持的区块大小有1K、2K、4K,并且区块的大小在文件系统格式化的时候就会确定,不再更改。

每一个数据区块都有一个自己的编号,记录在inode,以便于寻找数据。

数据区块还有四个基本限制:

  1. 原则上,区块的大小和数量在格式化完成之后就不能再修改。
  2. 每个区块只能放置一个文件的数据。(导致存储空间的浪费)
  3. 较大的文件会占用多个区块用来存储。
  4. 文件小于区块,则该区块中的剩余空间并不能再使用。
inode table

inode用来记录文件的的属性和文件放置区块的编号(每个区块编号占据的空间为4B)

  • 她所记录的数据还有有:
  1. 文件的读写属性(r-w-x)
  2. 文件的拥有者和用户组
  3. 文件的大小
  4. 文件建立或状态改变的时间
  5. 最近一次的读取时间
  6. 最近修改的时间
  7. 定义文件特性的标识,如SetUID
  8. 该文件真正内容的指向
  • inode的一些特性:
  1. 在ext2文件系统中,每个inode的大小固定为128B;ext4和xfs中每个inode的大小为256B
  2. 每个文件占有一个inode,所以文件的数量和inode的数量是相关的(总的文件数不能超过inode的最大数量)
  3. 系统读取文件时,首先要先找到inode,并分析inode所记录的文件权限与用户是否符合,符合之后才能读取到区块的内容

​ 在这里,inode的大小只有128B(以ext2为例),那么他是怎样来储存大量的数据的呢?

​ 原来,inode记录区块号码的区域定义为12个直接、1个间接、1个双间接、1个三间接记录区,如图所示:

“inode”的图片搜索ç"“æžœ

以1K大小的区块来说明:

  1. 12个直接指向即直接存储12个区块的号码

  2. 1个间接指向,即再拿一个区块来记录区块号码,这里一个区块为1K=1024B,可以存储1024/4=256个区块号码

  3. 依次类推,双间接可以存储256×256个区块号码;三间接可以存储256³个区块号码。

    所以126B的inode可以记录总大小为16GB的区块们的号码。

超级区块(superblock)

superblock是用来记录整个文件系统相关信息的地方,一般为1024B

他记录的文件系统信息有:

  1. 数据区块和inode的数量
  2. 未使用与已使用的 数据区块和inode 的数量
  3. 数据区块和inode 的大小
  4. 文件系统的挂载时间(文件系统即一个分区,需要挂载在目录上才能使用)、最近一次写入数据的时间、最近一次检验磁盘的时间等信息
  5. 一个有效位数值,若此文件系统已被挂载,则有效位为0,若未被挂载,则有效位为1。

此外,每个区块群组都可能含有超级区块。首先,第一个区块群组有一个超级区块,而其他区块群组可能有超级区块(为第一个区块群组的超级区块做备份)

文件系统描述说明(filesystem description)

描述每个区块群组的开始与结束的区块,记录数据区块、indoe table、superblock、区块对照表所在的区块。

区块对照表(block bitmap)

用来记录那些区块是空的、哪些非空。

inode对照表

记录已被使用的inode和未被使用的inode

目录、文件在文件系统中的记录
目录

目录的内容为目录下的文件名,而文件才是真正存储数据的地方

当新建一个目录时,系统会分配给该目录一个inode和至少一个区块,inode中会记录所分配区块的号码;区块则记录目录下的文件名和文件名所占用的inode(这样通过访问目录,可以得到特定文件的inode,进而访问特定的文件)

文件

建立一个新文件时,系统会分配一个inode和相对于该文件大小的区块给该文件。

目录树的读取过程

目录树由根目录读起,首先由挂载的信息可以得到根目录的inode,innode规范的权限让我们读取区块中的内容即文件名数据和文件的inode,再一层层往下(根据inode)读到正确的文件。

文件的存取和日志式文件系统的功能
  • 当我们新增一个文件时,文件系统的操作如下:

    1. 首先确定用户对于新增文件的目录是否具有w、x权限,有权限才能操作。
    2. 根据inode对照表找到一个空的inode,将新文件的属性写入其中。
    3. 根据区块对照表找到一个未使用的区块,将文件的数据写入其中,更新文件的inode,将区块号码写入其中
    4. 根据分配的inode和区块更新inode对照表和区块对照表,之后再更新superblock

    一般,我们将数据区块称为数据存放区域,而将超级区块、indoe对照表、区块对照表称为元数据(metadata)。元数据是经常变动的,每次新增、编辑、删除都会改变元数据的内容

    文件系统的操作正常来说是不会出现问题的,但当我们操作不当或由于其他原因使系统突然终止,就会导致数据更新信息不完成,出现数据不一致现象,如区块已被分配,但区块对照表的数据并未改变。这个时候我们就需要检查数据的不一致状态,然后做出修改更正,但是常规的检查十分耗时间,所以为了方便,新的文件系统出现了–––日志式文件系统。

  • 日志式文件系统

    即在文件系统中专门划分出一个区块,用来记录写入或修改文件的步骤。

    操作步骤如下:

    1. 当要写入一个文件时,首先在日志记录区块中记录某个文件准备要写入的信息。
    2. 接着,写入文件的权限和数据,更新metadata的数据。
    3. 完成数据和元数据(metadata)的更新,在日志中完成该文件的记录。

    这样就可以使一致性检查更加便利。

Linux文件系统的运行

我们知道,内存的速度和磁盘的速度差距是比较大的,木桶的容量取决于最短的那块木板,所以磁盘的写入速度会拖内存的后退。在这种情况下,Linux采用了异步处理的方式来提高效率:

加载一个文件至内存中后,若文件未被修改过,则打上clean的标记。若被更改过,打上dirty的标记,这些操作都在内存中进行,并没有写入磁盘,而系统会不定期的将dirty的数据写回磁盘,来保证磁盘和内存数据的一致性。

Linux为提高效率,会将常用的文件加载到内存中,所以:

  1. 系统会将常用的文件数据放在内存的缓冲区中,来加速文件的读写操作
  2. 所以linux的物理内存最后都会被用光,用来加速系统性能
  3. 可以手动使用sync命令让dirty的文件写回磁盘
  4. 正常关机时,关机命令也会调用sync命令将内存中dirty的数据写回磁盘
linux挂载点

文件系统必须挂载到目录上才能使用,目录即相当于文件系统的入口。

我们可以根据inode来判断不同文件名是否为同一个文件,如/、/.、/… 三者标识同一文件–-根目录。

挂载点一定是目录,目录是进入文件系统的入口

VFS

不同的磁盘分区可能会使用不同的文件系统,而VFS(virtual filesystem switch)会自动帮我们处理文件系统的读取工作,我们不需要知道每个磁盘分区的文件系统。

XFS文件系统(CentOS)

ext文件系统是预先规划好所有的inode、区块,除非格式化否则不能再进行改变,做不到动态配置。而面对越来越大的磁盘容量,格式化所需要的时间越来越长,ext逐见颓势。

xfs是一个日志式文件系统,数据的分布,规划为三个部分:

  1. 数据区 data section
  2. 文件系统活动登陆区 log section
  3. 实时运行区 realtime section
数据区

包含indoe、数据区块、超级区块等数据。

数据区 分为了多个存储区群组,每个存储区群组都包括:

  1. 整个文件系统的superblock
  2. 剩余空间的管理机制(?)
  3. inode的分配和追踪

此外,inode和区块都是当有需求时才会动态配置产生,并不是一开始就规划好,所以格式化速度更快。

另外,xfs区块的容量可在512B-64KB间调整,inode容量为256B-2M

文件系统活动登陆区

用来记录文件系统的变化,相当于日志区

在xfs中,可以指定外部的磁盘作为xfs文件系统的日志区块。

实时运行区

当有文件被建立时,文件首先会被放在一个或多个extent区块中,等待分配完毕后(应该是数据区块和inode的分配),才会被写入数据区。

而extent区块的大小在格式化时就被确定,一般在4K-1G之间。

文件系统的操作

读取磁盘和目录的容量
  • df 命令:列出问文件系统的磁盘使用量

    df [-hi] 目录或文件名

    -h : 以人们容易理解的格式输出

    -i : 不显示磁盘容量,而现实inode的数量

  • du 命令:查看目录所占的容量

    du [] 目录或文件名

硬链接和符号链接
硬链接

硬链接是在目录下新增一条链接到某一inode的文件名,即硬链接文件与某一文件具有相同的inode和权限,它们除了文件名外均相同,对任一文件做修改,所有的文件都会改变。

  • 硬链接的限制:

    1. 不能跨文件系统,既不能跨越文件系统建立链接
    2. 不能链接目录,只能链接文件(若链接目录,则对目录下的所有文件都要建立链接,复杂度高)
  • 硬链接的建立:使用 ln 命令

    ln -[sf] 源文件 目标文件

    -s : 不加s参数建立硬链接,加s参数则建立符号链接

    -f :若目标文件已存在,则之删除后再建立链接

符号链接

符号链接指的是 新建一个文件(新的inode),这个文件会让数据的读取指向他所链接的文件的文件名,相当于windows下的快捷方式,若源文件消失,则符号链接失效;同样修改符号链接,也会使源文件被修改。

硬链接是建立一个与源文件有相同inode的文件,他们本质上是一个文件,只不过文件名不同,即硬链接相当于源文件的一个副本。而符号链接是建立一个新文件,拥有自己的inode、区块,相当于快捷方式。

目录的链接数量

一个空目录中至少存在 . 和 **…**两个目录,他们具有相同的inode,所有当我们新建一个目录时,新目录的链接数为2,而上一层目录的链接数会加1。

1551228111222

图中17就是该目录的链接数

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

当我们想在我们的系统中增加一块磁盘时,我们需要做如下操作:

  1. 对磁盘进行分区

  2. 格式化磁盘分区,以建立系统可用的文件系统

    格式化磁盘的原因是:不同系统设置的文件属性和权限并不相同,需要将磁盘格式化为该系统可使用的文件系统才能正常使用。

  3. 对建立的文件系统进行检验

  4. 建立挂载点,将文件系统挂载到目录上,进而可以开始使用

下面详细介绍每一步的具体操作:

磁盘分区

磁盘的分区方式有两种,MBR和GPT,MBR现在逐渐淘汰

观察磁盘分区的状态
  • lsblk 命令:列出系统中的所有磁盘

    lsblk -[dfimpt] [device]

  • blkid 命令:列出设备的UUID等参数

    UUID时设别的全局标识符,每一个设备的UUID都是独一无二的,所以通常使用UUID来对磁盘进行分区,避免一些错误出现。

  • parted 命令:列出磁盘的分区表类型和分区信息

    parted device_name print # 列出磁盘的相关信息

磁盘分区

MBR使用fdisk命令进行分区,GPT使用gdisk命令(仅root可用)进行分区。注意:使用gdisk时设备名不能含有数字,因为我们的磁盘分区是针对于整个磁盘设备而不是某个分区。

/dev right /dev/sda1 wrong

fdisk/gdisk 设备名称

操作详情见鸟哥私房菜233页

注意的是,当我们新建一个分区,而该磁盘我们正在使用时,此时系统无法立即更新分区表,需要我们使用partprobe命令来手动更新分区表。

partprobe [-s]

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

使用mkfs(make filesystem)命令

mkfs [] 设备名称

  • 创建xfs文件系统,使用mkfs.xfs 命令
  • 创建ext4文件系统,使用mkfs.ext4命令
文件系统检验

当文件系统出现问题时,我们可以通过使用特定的命令对文件系统进行观察和处理。

  • xfs_repair 命令处理xfs文件系统
  • fsck.ext4 命令处理ext4文件系统

注意的是:只有身为root用户且文件系统有问题时才可以使用这些命令,在文件系统正常的时候使用这些命令有可能会对系统造成危害。

另:使用上述命令检查时,被检查的硬盘分区需要先卸载之后再检查。而**卸载时需要注意 **你在使用该磁盘分区的时候是无法卸载该磁盘的。

文件系统的卸载与挂载

挂载的一些限制:

  • 一个文件系统不应该被挂载在不同的挂载点上
  • 一个目录不能挂载多个文件系统
  • 作为挂载点的目录最好为空目录(若目录不为空,则挂载之后原来的内容会被暂时隐藏起来,直到分区被卸载之后再重新显现)

挂载使用mount命令,卸载使用umount命令

mount [-t 文件系统] UUID=“ ” 挂载点

umount [-fn] 设备文件名或挂载点

-f:强制卸载

-n:不更新/etc/mtab情况下卸载

挂载U盘时,注意U盘的文件系统不能是NTFS

磁盘/文件系统参数自定义
  • mknod命令
  • xfs_admin 命令修改XFS系统的UUID和Label name(设备名)

设置启动挂载

启动挂载/etc/fstab

当我们将某个文件系统挂载到目录上之后,重启后会需要我们手动再次挂载,而如何让系统自动在启动时挂载呢?这就需要我们将挂载的信息写入到/etc/fstab文件中,写入之后,务必使用mount -a命令来测试是否有语法错误(mount -a指的是加载文件/etc/fstab中所有的文件系统)

/etc/fstab文件的信息如下:

例:
/dev/mapper/centos-root / xfs defaults 0 0
对应于:
[设备名/UUID/LABEL] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
dump是一个用来做为备份的命令
fsck:是否以fsck检验扇区

系统挂载的一些限制:

  • 根目录必须挂载,且必须要先于所有其他挂载点 被挂载进来
  • 其他挂载点必须为已建立的目录,且一定要遵守FHS
  • 所有挂载点,同一时间,只能挂载一次
  • 所有硬盘分区,同一时间,只能挂载一次
  • 若要卸载文件系统,须将工作目录一道挂载点之外
镜像文件的挂载

镜像文件是否一定要刻录为挂盘才能使用?我们可以通过loop设备来挂载镜像文件,mount -o loop 文件名 挂载点

loop设备是一种伪设备,是使用文件来模拟块设备的一种技术,文件模拟成块设备后, 就像一个磁盘或光盘一样使用。

内存交换分区(Swap)的创建

交换分区(swap)是对内存不足情况的一种应对之道,当内存空间不足时,系统就会将内存中不使用的文件转移到swap中,以腾出足够的内存空间供其他程序使用。

建立内存交换分区有两种方式:

使用物理分区创建内存交换分区

操作步骤:

  1. 创建磁盘分区,使用gdisk命令(注意code为8200)
  2. 磁盘分区格式化,格式化为内存交换分区格式,使用mkswap 设备文件名
  3. 启动swap设备,使用swapon 设备文件名(此外,要关闭swap设备时,使用swapoff命令)
  4. 使用freeswapon -s来观察内存的使用量
  5. 记得将新建的分区写入/etc/fstab文件中,使得系统可以自动挂载
使用文件创建内存交换文件

操作步骤:

  1. 使用dd命令创建大文件
  2. swapon将文件格式化为内存交换文件格式
  3. swapon 文件名
  4. 写入/etc/fstab

利用parted命令进行磁盘分区操作

我们知道,fdisk支持MBR分区,gdisk支持GPT分区,而parted命令对二者均支持。

parted命令的格式:

parted [设备] [命令 [参数]]

命令有: 新增分区:mkpart [primary|extended|logical] [ext4|xfs|vfat]

​ 显示分区:print

​ 删除分区:rm [partition(即分区号码)]

鸟哥私房菜256页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值