Linux笔记:6-磁盘配额(Quota)与进阶文件系统管理

发布时间 2023-05-29 00:05:53作者: CD、小月

@

磁盘限额(Quota)与进阶文件系统管理

磁盘限额 (Quota) 的应用与实际操作案例

关于Quota

在 Linux 系统中,由于是多人多任务的环境,所以会有多人共同使用一个硬盘空间的情况发生, 如果其中有少数几个使用者大量的占掉了硬盘空间的话,那势必压缩其他使用者的使用权力。
因此管理员应该适当的限制硬盘的容量给用户,以妥善的分配系统资源。
 
基本上,quota 就是向管理员报告磁盘使用率以及让管理员管理磁盘使用情况的一个工具。

Quota 的一般用途 :

针对网络服务的限额:

  • 针对 WWW server ,例如:每个人的网页空间的容量限制!
  • 针对 mail server,例如:每个人的邮件空间限制。
  • 针对 file server,例如:每个人最大的可用网络硬盘空间
     

针对 Linux 系统主机上面的一些设定:

  • 限制某一群组所能使用的最大磁盘配额 (使用群组限制):
    你可以将你的主机上的用户分门别类,有点像是目前很流行的付费与免付费会员制的情况, 你比较喜好的那一群的使用配额就可以给高一些。

  • 限制某一用户的最大磁盘配额 (使用用户限制):
    在限制了群组之后,你也可以再继续针对个人来进行限制,使得同一群组之下还可以有更公平的分配。

  • 限制某一目录 (directory, project) 的最大磁盘配额:
    在旧版的 CentOS 当中,使用的预设文件系统为 EXT 家族,这种文件系统的磁盘配额主要是针对整个文件系统来处理,所以大多针对『挂载点』进行设计
    新的 xfs 可以使用 project 这种模式,就能够针对个别的目录 (非文件系统) 来设计磁盘限额。
     

总结:
基本上,quota 就是向管理员报告磁盘使用率以及让管理员管理磁盘使用情况的一个工具。
比较特别的是,XFS 的 quota 是整合到文件系统内,并不是其他外挂的程序来管理的,因此,透过 quota 来直接回报磁盘使用率,要比 unix 工具来的快速

举例来说, du这东西会重新计算目录下的磁盘使用率,但 xfs 可以透过 xfs_quota 来直接回报各目录使用率,速度上是快非常多

Quota 的使用限制:

Quota 很好用,但是使用上还是有些限制:

  • 在 EXT 文件系统家族仅能针对整个 filesystem:
    EXT 文件系统家族在进行 quota 限制的时候,它仅能针对整个文件系统来进行设计,无法针对某个单一的目录来设计它的磁盘配额。 因此,如果你想要使用不同的文件系统进行 quota 时,请先搞清楚该文件系统支持的情况!因为 XFS 已经可以使用 project 模式来设计不同目录的磁盘配额

  • 核心必须支持 quota :
    Linux 核心必须有支持 quota 这个功能才行:如果你是使用 CentOS 7.x 的预设核心,系统已经默认有支持 quota 这个功能;如果你是自行编译核心的, 那么请特别留意你是否已经『真的』开启了 quota 这个功能?否则其他操作任何 quota 均是无效。

  • 只对一般身份使用者有效:
    并不是所有在 Linux 上面的账号都可以设定 quota 呢,例如 root 就不能设定 quota , 因为整个系统所有的数据几乎都是他的。

  • 若启用 SELinux,非所有目录均可设定 quota :
    新版的 CentOS 预设都有启用 SELinux 这个核心功能该功能会加强某些细部的权限控制
    由于担心管理员不小心设定错误,因此预设的情况下, quota 似乎仅能针对 /home 进行设定~因此,如果你要针对其他不同的目录进行设定,请参考解开 SELinux 限制的方法, 这就不是 quota 的问题...
     

总结:
新版的 CentOS 使用的 xfs 确实比较特别;
不但无须额外的 quota 纪录文件,也能够针对文件系统内的不同目录进行配置;
只是不同的文件系统在 quota 的处理情况上不太相同,因此这里要特别强调,进行 quota 前,先确认你的文件系统。

Quota 的规范设定项目:

针对 XFS 文件系统的限额,Quota的设置选项:

  • 分别针对用户、群组或个别目录 (user, group & project):
    XFS 文件系统的 quota 限制中,主要是针对群组、个人或单独的目录进行磁盘使用率的限制。

  • 容量限制或文件数量限制 (block 或 inode):
    文件系统主要规划为存放属性的 inode实际文件数据的block 区块,Quota 既然是管理文件系统,所以当然也可以管理 inode 或 block;
    这两个管理的功能为:

    • 限制 inode 用量:可以管理使用者可以建立的『文件数量』;
    • 限制 block 用量:管理用户磁盘容量的限制,较常见为这种方式。
  • 柔性劝导与硬性规定 (soft/hard):
    不管是 inode/block ,限制值都有两个,分别是 soft 与 hard。
    通常 hard 限制值要比 soft 还要高。
    举例来说,若限制项目为 block ,可以限制 hard 为 500MBytes而 soft 为 400MBytes。这两个限值的意义为:

    • hard:表示使用者的用量绝对不会超过这个限制值,以上面的设定为例, 用户所能使用的磁盘容量绝对不会超过 500Mbytes ,若超过这个值则系统会锁住该用户的磁盘使用权;

    • soft:表示使用者在低于 soft 限值时 (此例中为 400Mbytes),可以正常使用磁盘,但若超过 soft 且低于 hard的限值 (介于 400~500Mbytes 之间时),每次用户登入系统时,系统会主动发出磁盘即将爆满的警告讯息,且会给予一个宽限时间 (grace time)。

      不过,若使用者在宽限时间倒数期间就将容量再次降低于 soft 限值之下,则宽限时间会停止。

  • 会倒数计时的宽限时间 (grace time):
    这个宽限时间只有在用户的磁盘用量介于 soft 到 hard 之间时,才会出现且会倒数;
    由于达到 hard 限值时,用户的磁盘使用权可能会被锁住。为了担心用户没有注意到这个磁盘配额的问题, 因此设计了 soft ;
    当你的磁盘用量即将到达 hard 且超过 soft 时,系统会给予警告,但也会给一段时间让用户自行管理磁盘。 一般预设的宽限时间为七天,如果七天内你都不进行任何磁盘管理,那么 soft 限制值会即刻取代 hard 限值来作为 quota的限制。
    以上面设定的例子来说,假设你的容量高达 450MBytes 了,那七天的宽限时间就会开始倒数, 若七天内你都不进行任何删除文件的动作来替你的磁盘用量减肥, 那么七天后你的磁盘最大用量将变成 400MBytes (那个 soft 的限制值)此时你的磁盘使用权就会被锁住而无法新增文件了。

整个 soft, hard, grace time 的相关性我们可以用底下的图示来说明:
在这里插入图片描述

逻辑滚动条管理员 (Logical Volume Manager)(逻辑卷管理)

LVM:重点在于『可以弹性的调整 filesystem 的容量』而并非在于效能与数据保全上面。LVM 可以整合多个实体 partition在一起, 让这些 partitions 看起来就像是一个磁盘一样!而且,还可以在未来新增或移除其他的实体 partition 到这个 LVM 管理的磁盘当中。 如此一来,整个磁盘空间的使用上,实在是相当的具有弹性。

什么是 LVM: PV, PE, VG, LV 的意义

LVM 的全名是 Logical Volume Manager(逻辑卷管理);
之所以称为『滚动条』可能是因为可以将 filesystem 像滚动条一样伸长或缩短之故吧;
LVM 的作法是将几个实体的partitions (或 disk) 透过软件组合成为一块看起来是独立的大磁盘 (VG) ,然后将这块大磁盘再经过分区成为可使用分区槽 (LV), 最终就能够挂载使用了。

Physical Volume, PV, 实体滚动条

我们实际的 partition (或 Disk) 需要调整系统标识符 (system ID) 成为 8e (LVM 的标识符),然后再经过 pvcreate 的指令将他转成 LVM 最底层的实体滚动条 (PV) ,之后才能够将这些 PV 加以利用。
调整 system ID 的方是就是透过 gdisk

Volume Group, VG, 滚动条群组

所谓的 LVM 大磁盘就是将许多 PV 整合成这个 VG;
这个大磁盘最大容量;与底下要说明的 PE以及 LVM 的格式版本有关。
在预设的情况下, 使用 32 位的 Linux 系统时,基本上 LV 最大仅能支持到 65534 个 PE 而已,若使用预设的 PE 为 4MB 的情况下, 最大容量则仅能达到约 256GB;这个问题在 64 位的 Linux 系统上面已经不存在了。

Physical Extent, PE, 实体范围区块

LVM 预设使用 4MBPE 区块,而 LVM 的 LV 在 32 位系统上最多仅能含有 65534 个 PE(lvm1 的格式),因此预设的 LVM 的 LV 会有 4M*65534/(1024M/G)=256G。
他是整个 LVM 最小的储存区块,也就是说,其实我们的文件资料都是藉由写入 PE 来处理的。简单的说,这个 PE 就有点像文件系统里面的 block 大小。所以调整 PE 会影响到 LVM 的最大容量。
不过,在 CentOS 6.x 以后,由于直接使用 lvm2 的各项格式功能,以及系统转为 64 位,因此这个限制已经不存在了。

Logical Volume, LV, 逻辑滚动条

最终的 VG 还会被切成 LV这个 LV 就是最后可以被格式化使用的类似分区槽
PE 是整个 LVM 的最小储存单位那么 LV的大小就与在此 LV 内的 PE 总数有关,所以LV不能随意指定大小
为了方便用户利用 LVM 来管理其系统,因此 LV 的装置文件名通常指定为『 /dev/vgname/lvname 』的样式。
LVM 可弹性的变更 filesystem 的容量,其实他就是透过『交换 PE 』来进行数据转换, 将原本 LV 内的 PE 移转到其他装置中以降低 LV 容量,或将其他装置的 PE 加到此 LV 中以加大容量。

实际流程

透过 PV, VG, LV 的规划之后,再利用 mkfs 就可以将你的 LV 格式化成为可以利用的文件系统了!而且这个文件系统的容量在未来还能够进行扩充或减少, 而且里面的数据还不会被影响。
整个流程由基础到最终的结果的示例图如下:
在这里插入图片描述

数据写入LV的两种模式:

  • 线性模式 (linear):假如我将 /dev/vda1, /dev/vdb1 这两个 partition 加入到 VG 当中,并且整个 VG 只有一个 LV 时,那么所谓的线性模式就是:当 /dev/vda1 的容量用完之后,/dev/vdb1 的硬盘才会被使用到这也是我们所建议的模式。

  • 交错模式 (triped)就是我将一笔数据拆成两部分,分别写入 /dev/vda1 与/dev/vdb1 的意思,感觉上有点像 RAID 0 !如此一来,一份数据用两颗硬盘来写入,理论上,读写的效能会比较好。

基本上,LVM 最主要的用处是在实现一个可以弹性调整容量的文件系统上, 而不是在建立一个效能为主的磁盘上,所以,我们应该利用的是 LVM 可以弹性管理整个 partition 大小的用途上,而不是着眼在效能上的。
因此,LVM 默认的读写模式是线性模式;
如果你使用 triped 模式,要注意,当任何一个 partition 『归天』时,所有的数据都会『损毁』;如果要强调效能与备份,那么就直接使用 RAID 即可, 不需要用到 LVM。