初识Linux(十一)------ 磁盘配额与进阶文件系统管理

  如果Linux 服务器有多个用户经常存取数据时,为了维护所有使用者在硬盘容量的公平使用,磁盘配额 (Quota) 就是一项非常有用的工具。另外,如果磁盘容量不够用,那么更进阶的文件系统就得要学习学习。 本章我们会介绍磁盘阵列 (RAID) 及逻辑卷轴文件系统 (LVM),这些工具都可以帮助管理与维护使用者可用的磁盘容量。

1. 磁盘配额 (Quota)

1.1 什么是 Quota

  在Linux 系统中,由于是多用户多任务的环境,所以会有多人共同使用一个硬盘空间的情况发生,所以应该合理分配硬盘容量。


Quota 的一般用途

  quota 比较常使用的几个情况是:

  • 针对 WWW server ,例如:每个人的网页空间的容量限制!
  • 针对 mail server,例如:每个人的邮件空间限制。
  • 针对 file server,例如:每个人最大的可用网络硬盘空间 (教学环境中最常见!)

  上面的是针对网络服务的设计,如果是针对 Linux 系统主机上面的设置那么使用的方向有下面这一些:

  • 限制某一群组所能使用的最大磁盘配额 (使用群组限制):
    你可以将你的主机上的使用者分门别类,有点像是目前很流行的付费与免付费会员制的情况, 你比较喜好的那一群的使用配额就可以给高一些!呵呵! ^_^...
  • 限制某一使用者的最大磁盘配额 (使用使用者限制):
    在限制了群组之后,你也可以再继续针对个人来进行限制,使得同一群组之下还可以有更公平的分配!
  • 限制某一目录 (directory, project) 的最大磁盘配额:
    在旧版的 CentOS 当中,使用的默认文件系统为 EXT 家族,这种文件系统的磁盘配额主要是针对整个文件系统来处理,所以大多针对“挂载点”进行设计。 新的 xfs 可以使用 project 这种模式,就能够针对个别的目录 (非文件系统) 来设计磁盘配额。

  比较特别的是,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 这个功能。
  • 只对一般身份使用者有效:
    这就有趣了!并不是所有在 Linux 上面的帐号都可以设置 quota 呢,例如 root 就不能设置 quota , 因为整个系统所有的数据几乎都是他的! ^_^
  • 若启用 SELinux,非所有目录均可设置 quota :
    新版的 CentOS 默认都有启用 SELinux 这个核心功能,该功能会加强某些细部的权限控制。由于担心管理员不小心设置错误,因此默认的情况下, quota 似乎仅能针对 /home 进行设置而已~因此,如果你要针对其他不同的目录进行设置,请参考到后续章节查阅解开 SELinux 限制的方法,这就不是 quota 的问题了...

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


Quota 的规范设置项目

  quota 针对 XFS filesystem 的限制项目主要分为下面几个部分:

  • 分别针对使用者、群组或个别目录 (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 的限制。

1.2 一个 XFS 文件系统的 Quota 操作范例

  这里我们使用一个范例来设计一下如何处理 Quota 的设置流程。

  • 目的与帐号:现在五个人的账号为一组,这五个人的帐号分别是 myquota1, myquota2, myquota3, myquota4, myquota5,这五个用户的密码都是 password ,且这五个用户所属的初始群组都是 myquotagrp 。 其他的帐号属性则使用默认值。
  • 帐号的磁盘容量限制值:这五个用户都能够取得 300MBytes 的磁盘使用量(hard),文件数量则不予限制。 此外,只要容量使用率超过 250MBytes ,就予以警告 (soft)。
  • 群组的限额 (option 1):由于我的系统里面还有其他用户存在,因此我仅承认 myquotagrp 这个群组最多仅能使用 1GBytes 的容量。 这也就是说,如果 myquota1, myquota2, myquota3 都用了 280MBytes 的容量了,那么其他两人最多只能使用 (1000MB - 280x3 = 160MB) 的磁盘容量,这就是使用者与群组同时设置时会产生的后果。
  • 共享目录限额 (option 2):另一种设置方式,每个用户还是具有自己独立的容量限制,但是这五个人的共享目录在 /home/myquota 这里,该目录请设置为其他人没有任何权限的共享目录空间,仅有 myquotagrp 群组拥有全部的权限。 且无论如何,该目录最多仅能够接受 500MBytes 的容量。请注意,群组 (group) 的限制与目录 (directory/project) 无法同时并存。所以下面的流程中,我们会先以群组来设计,然后再以目录限制来进一步说明。
  • 宽限时间的限制:最后,我希望每个使用者在超过 soft 限制值之后,都还能够有 14 天的宽限时间。
# 制作帐号环境时,由于有五个帐号,因此使用 script 来创建环境!
[root@study ~]# vim addaccount.sh
#!/bin/bash
# 使用 script 来创建实验 quota 所需的环境
groupadd myquotagrp
for username in myquota1 myquota2 myquota3 myquota4 myquota5
do
	useradd -g myquotagrp $username
	echo "password" | passwd --stdin $username
done
mkdir /home/myquota
chgrp myquotagrp /home/myquota
chmod 2770 /home/myquota

[root@study ~]# sh addaccount.sh

1.2.1 文件系统的支持与观察

  以 XFS 文件系统为例,如果你使用的是 EXT 家族,请自行查阅资料。 此外,不要在根目录下面进行 quota 设计,因为文件系统会变得太复杂。

  下面我们是以 /home 这个 xfs 文件系统为例,首先就是要来检查看看:

[root@study ~]# df -hT /home
Filesystem              Type  Size  Used Avail Use% Mounted on
/dev/mapper/centos-home xfs   5.0G   67M  5.0G   2% /home 

  此外,由于 VFAT 文件系统并不支持 Linux Quota 功能,所以我们得要使用 mount 查询一下 /home 的文件系统。

  在过去的版本中,管理员似乎可以通过 mount -o remount 的机制来重新挂载启动 quota 的功能,不过 XFS 文件系统的 quota 似乎是在挂载之初就宣告了, 因此无法使用 remount 来重新启动 quota 功能,一定得要写入 /etc/fstab 当中,或者是在初始挂载过程中加入这个项目, 否则不会生效。

[root@study ~]# vim /etc/fstab
/dev/mapper/centos-home  /home  xfs  defaults,usrquota,grpquota   0 0
# 其他项目并没有列出来,重点在于第四字段,于 default 后面加上两个参数!

[root@study ~]# umount /home
[root@study ~]# mount -a
[root@study ~]# mount | grep home
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota)

  基本上,针对 quota 限制的项目主要有三项,如下所示:

  • uquota/usrquota/quota:针对使用者帐号的设置;
  • gquota/grpquota:针对群组的设置;
  • pquota/prjquota:针对单一目录的设置,但是不可与 grpquota 同时存在。

  修改完 /etc/fstab 后,务必要测试一下。若有发生错误得要赶紧处理,因为这个文件如果修改错误,是会造成无法开机完全的情况。最好使用 vim 来修改,有语法的检验。此外,由于一般用户的主文件夹在 /home 里面,因此针对这个项目的卸载时, 一定要将所有一般帐号的身份注销,否则肯定无法卸载。

1.2.2 观察 Quota 报告数据

  文件系统支持之后,使用 xfs_quota 这个指令看看是否正确的将 quota 的管理数据列出来。

[root@study ~]# xfs_quota -x -c "指令" [挂载点]
选项与参数:
-x  :专家模式,后续才能够加入 -c 的指令参数
-c  :后面加的就是指令,这个小节我们先来谈谈数据回报的指令
指令:
      print :单纯的列出目前主机内的文件系统参数等数据
      df    :与原本的 df 一样的功能,可以加上 -b (block) -i (inode) -h (加上单位) 等
      report:列出目前的 quota 项目,有 -ugr (user/group/project) 及 -bi 等数据
      state :说明目前支持 quota 的文件系统的信息,有没有起动相关项目等

 

范例一:列出目前系统的各的文件系统,以及文件系统的 quota 挂载参数支持
[root@study ~]# xfs_quota -x -c "print"
Filesystem          Pathname
/                   /dev/mapper/centos-root
/srv/myproject      /dev/vda4
/boot               /dev/vda2
/home               /dev/mapper/centos-home (uquota, gquota)  # 所以这里就有显示支持啰

范例二:列出目前 /home 这个支持 quota 的载点文件系统使用情况
[root@study ~]# xfs_quota -x -c "df -h" /home
Filesystem     Size   Used  Avail Use% Pathname
/dev/mapper/centos-home
               5.0G  67.0M   4.9G   1% /home
# 如上所示,其实跟原本的 df 差不多啦!只是会更正确就是了。

范例三:列出目前 /home 的所有用户的 quota 限制值
[root@study ~]# xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root           4K      0      0  00 [------]      4      0      0  00 [------]
dmtsai      34.0M      0      0  00 [------]    432      0      0  00 [------]
.....(中间省略).....
myquota1      12K      0      0  00 [------]      7      0      0  00 [------]
myquota2      12K      0      0  00 [------]      7      0      0  00 [------]
myquota3      12K      0      0  00 [------]      7      0      0  00 [------]
myquota4      12K      0      0  00 [------]      7      0      0  00 [------]
myquota5      12K      0      0  00 [------]      7      0      0  00 [------]
# 所以列出了所有用户的目前的文件使用情况,并且列出设置值。注意,最上面的 Block
# 代表这个是 block 容量限制,而 inode 则是文件数量限制喔。另外,soft/hard 若为 0,代表没限制

范例四:列出目前支持的 quota 文件系统是否有起动了 quota 功能?
[root@study ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON    # 有启用计算功能
  Enforcement: ON   # 有实际 quota 管制的功能
  Inode: #1568 (4 blocks, 4 extents)  # 上面四行说明的是有启动 user 的限制能力
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #1569 (5 blocks, 5 extents)  # 上面四行说明的是有启动 group 的限制能力
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF
  Enforcement: OFF
  Inode: #1569 (5 blocks, 5 extents)  # 上面四行说明的是 project 并未支持
Blocks grace time: [7 days 00:00:30]  # 下面则是 grace time 的项目
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]

1.2.3 限制值设置方式

   确认文件系统的 quota 支持顺利启用后,也能够观察到相关的 quota 限制,接下来就是要实际的给予用户/群组限制。

[root@study ~]# xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name"
[root@study ~]# xfs_quota -x -c "timer [-ug] [-bir] Ndays"
选项与参数:
limit :实际限制的项目,可以针对 user/group 来限制,限制的项目有
        bsoft/bhard : block 的 soft/hard 限制值,可以加单位
        isoft/ihard : inode 的 soft/hard 限制值
        name        : 就是用户/群组的名称啊!
timer :用来设置 grace time 的项目喔,也是可以针对 user/group 以及 block/inode 设置

   我们需要每个用户 250M/300M 的容量限制,群组共 950M/1G 的容量限制,同时 grace time 设置为 14 天。

范例一:设置好用户们的 block 限制值 (题目中没有要限制 inode )
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota1" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota2" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota3" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota4" /home
[root@study ~]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota5" /home
[root@study ~]# xfs_quota -x -c "report -ubih" /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquota1      12K   250M   300M  00 [------]      7      0      0  00 [------]

范例二:设置好 myquotagrp 的 block 限制值
[root@study ~]# xfs_quota -x -c "limit -g bsoft=950M bhard=1G myquotagrp" /home
[root@study ~]# xfs_quota -x -c "report -gbih" /home
Group quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes
Group ID     Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotagrp    60K   950M     1G  00 [------]     36      0      0  00 [------]

范例三:设置一下 grace time 变成 14 天吧!
[root@study ~]# xfs_quota -x -c "timer -ug -b 14days" /home
[root@study ~]# xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)
.....(中间省略).....
Blocks grace time: [14 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]

范例四:以 myquota1 用户测试 quota 是否真的实际运行呢?
[root@study ~]# su - myquota1
[myquota1@study ~]$ dd if=/dev/zero of=123.img bs=1M count=310
dd: error writing ‘123.img’: Disk quota exceeded
300+0 records in
299+0 records out
314552320 Bytes (315 MB) copied, 0.181088 s, 1.7 GB/s
[myquota1@study ~]$ ll -h
-rw-r--r--. 1 myquota1 myquotagrp 300M Jul 24 21:38 123.img

[myquota1@study ~]$ exit
[root@study ~]# xfs_quota -x -c "report -ubh" /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks
User ID      Used   Soft   Hard Warn/Grace
---------- ---------------------------------
myquota1     300M   250M   300M  00 [13 days]
myquota2      12K   250M   300M  00 [------]
# 因为 myquota1 的磁盘用量已经破表,所以当然就会出现那个可怕的 grace time 

1.2.4 project 的限制 (针对目录限制)

  现在让我们来想一想,如果需要限制的是目录而不是群组时,那该如何处理呢?举例来说,我们要限制的是 /home/myquota 这个目录本身, 而不是针对 myquotagrp 这个群组。这两种设置方法的意义不同,例如,前一个小节谈到的测试范例来说, myquota1 已经消耗了 300M 的容量,而 /home/myquota 其实还没有任何的使用量 (因为在 myquota1 的主文件夹做的 dd 指令)。 不过如果你使用了 xfs_quota -x -c "report -h" /home 这个指令来查看,就会发现其实 myquotagrp 已经用掉了 300M 了。如此一来,对于目录的限制来说,就不会有效果。( 有点晕 _(¦3」∠)_ )

  为了解决这个问题,因此这个小节要来设置那个很有趣的 project 项目。只是这个项目不可以跟 group 同时设置,因此得要取消 group 设置并且加入 project 设置才行。

  • 修改 /etc/fstab 内的文件系统支持参数

  首先,要将 grpquota 的参数取消,然后加入 prjquota ,并且卸载 /home 再重新挂载。

# 1. 先修改 /etc/fstab 的参数,并启动文件系统的支持
[root@study ~]# vim /etc/fstab
/dev/mapper/centos-home /home xfs  defaults,usrquota,grpquota,prjquota  0 0
# 记得, grpquota 与 prjquota 不可同时设置喔!所以上面删除 grpquota 加入 prjquota

[root@study ~]# umount /home
[root@study ~]# mount -a
[root@study ~]# xfs_quota -x -c "state"
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #1568 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF         <==已经取消啰!
  Enforcement: OFF
  Inode: N/A
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: ON          <==确实启动啰!
  Enforcement: ON
  Inode: N/A
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]
  • 规范目录、选项名称(project)与选项 ID

  目录的设置必须要指定一个所谓的“选项名称、选项识别码(ID)”来规范才行!而且还需要用到两个配置文件。

  现在,我们要规范的目录是 /home/myquota 目录,这个目录我们给个 myquotaproject 的名称和 11 的识别码。

# 2.1 指定选项识别码与目录的对应在 /etc/projects
[root@study ~]# echo "11:/home/myquota" >> /etc/projects

# 2.2 规范选项名称与识别码的对应在 /etc/projid
[root@study ~]# echo "myquotaproject:11" >> /etc/projid

# 2.3 初始化选项名称
[root@study ~]# xfs_quota -x -c "project -s myquotaproject"
Setting up project myquotaproject (path /home/myquota)...
Processed 1 (/etc/projects and cmdline) paths for project myquotaproject with recursion 
depth infinite (-1).    # 会闪过这些讯息!是 OK 的!别担心!

[root@study ~]# xfs_quota -x -c "print " /home
Filesystem          Pathname
/home               /dev/mapper/centos-home (uquota, pquota)
/home/myquota       /dev/mapper/centos-home (project 11, myquotaproject)
# 这个 print 功能很不错!可以完整的查看到相对应的各项文件系统与 project 目录对应!

[root@study ~]# xfs_quota -x -c "report -pbih " /home
Project quota on /home (/dev/mapper/centos-home)
                        Blocks                            Inodes
Project ID       Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject      0      0      0  00 [------]      1      0      0  00 [------]
# 确定有获取到这个选项名称,接下来准备设置。
  • 实际设置规范与测试

   我们要将 /home/myquota 指定为 500M 的容量限制,450M 为 soft 的限制。

[root@study ~]# xfs_quota -x -c "limit -p bsoft=450M bhard=500M myquotaproject" /home
[root@study ~]# xfs_quota -x -c "report -pbih " /home
Project quota on /home (/dev/mapper/centos-home)
                            Blocks                            Inodes
Project ID       Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject      0   450M   500M  00 [------]      1      0      0  00 [------]

[root@study ~]# dd if=/dev/zero of=/home/myquota/123.img bs=1M count=510
dd: error writing '/home/myquota/123.img': No space left on device
501+0 records in
500+0 records out
524288000 Bytes (524 MB) copied, 0.96296 s, 544 MB/s
# 你看!连 root 在该目录下面创建文件时,也会被挡掉耶!这才是完整的针对目录的规范

1.3 XFS quota 的管理与额外指令对照表

   几个内部指令:

  • disable:暂时取消 quota 的限制,但其实系统还是在计算 quota 中,只是没有管制而已!应该算最有用的功能;
  • enable:就是回复到正常管制的状态中,与 disable 可以互相取消、启用;
  • off:完全关闭 quota 的限制,使用了这个状态后,你只有卸载再重新挂载才能够再次的启动 quota 。也就是说, 用了 off 状态后,你无法使用 enable 再次复原 quota 的管制,注意不要乱用这个状态!一般建议用 disable 即可,除非你需要执行 remove 的动作!
  • remove:必须要在 off 的状态下才能够执行的指令~这个 remove 可以“移除”quota 的限制设置,例如要取消 project 的设置, 无须重新设置为 0 。只要 remove -p 就可以了!
# 1. 暂时关闭 XFS 文件系统的 quota 限制功能
[root@study ~]# xfs_quota -x -c "disable -up" /home
[root@study ~]# xfs_quota -x -c "state" /home
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: OFF   <== 意思就是有在计算,但没有强制管制的意思
  Inode: #1568 (4 blocks, 4 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: OFF
  Enforcement: OFF
  Inode: N/A
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: OFF
  Inode: N/A
Blocks grace time: [7 days 00:00:30]
Inodes grace time: [7 days 00:00:30]
Realtime Blocks grace time: [7 days 00:00:30]

[root@study ~]# dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520
520+0 records in
520+0 records out  # 然没有任何错误发生!
545259520 Bytes (545 MB) copied, 0.308407 s, 180 MB/s

[root@study ~]# xfs_quota -x -c "report -pbh" /home
Project quota on /home (/dev/mapper/centos-home)
                        Blocks
Project ID       Used   Soft   Hard Warn/Grace
---------- ---------------------------------
myquotaproject   520M   450M   500M  00 [-none-]
# 其实,还真的有超过,只是因为 disable 的关系,所以没有强制限制住就是了。

[root@study ~]# xfs_quota -x -c "enable -up" /home  # 重新启动 quota 限制
[root@study ~]# dd if=/dev/zero of=/home/myquota/123.img bs=1M count=520
dd: error writing ‘/home/myquota/123.img’: No space left on device
# 又开始有限制!这就是 enable/disable 的相关对应功能喔!暂时关闭/启动用的!

# 完全关闭 quota 的限制行为吧!同时取消 project 的功能试看看!
[root@study ~]# xfs_quota -x -c "off -up" /home
[root@study ~]# xfs_quota -x -c "enable -up" /home
XFS_QUOTAON: Function not implemented
# 没有办法重新启动!因为已经完全的关闭了 quota 的功能!所以得要 umouont/mount 才行!

[root@study ~]# umount /home; mount -a
# 这个时候使用 report 以及 state 时,管制限制的内容又重新回来了!如何移除project

[root@study ~]# xfs_quota -x -c "off -up" /home
[root@study ~]# xfs_quota -x -c "remove -p" /home
[root@study ~]# umount /home; mount -a
[root@study ~]# xfs_quota -x -c "report -phb" /home
Project quota on /home (/dev/mapper/centos-home)
                        Blocks
Project ID       Used   Soft   Hard Warn/Grace
---------- ---------------------------------
myquotaproject   500M      0      0  00 [------]
# 全部归零!就是“移除”所有限制值的意思!

   那个 remove -p 是“移除所有的 project 控制列表”的意思。也就是说,如果你有在 /home 设置多个 project 的限制, 那么 remove 会删的一个也不留。如果想要回复设置值,那...只能一个一个重新设置回去了。

   上面就是 XFS 文件系统的简易 quota 处理流程~那如果你是使用 EXT 家族呢?下面有简单的指令对照表:

 

1.4 不变动已有系统的 quota 实例

  如果你的主机原先没有想到要设置成为邮件主机,所以并没有规划将邮件信箱所在的 /var/spool/mail/ 目录独立成为一个 partition ,然后目前你的主机已经没有办法新增或分区出任何新的分区了。那我们知道 quota 的支持与文件系统有关, 所以并无法跨文件系统来设计 quota 的 project 功能。因此,你是否就无法针对 mail 的使用量给予 quota 的限制呢?

  此外,如果你想要让使用者的邮件信箱与主文件夹的总体磁盘使用量为固定,那又该如何是好? 由于 /home 及 /var/spool/mail 根本不可能是同一个 filesystem (除非是都不分区,使用根目录,才有可能整合在一起), 所以,该如何进行这样的 quota 限制呢?

  既然 quota 是针对 filesystem 来进行限制,假设你又已经有 /home 这个独立的分区了,那么你只要:

  • 将 /var/spool/mail 这个目录完整的移动到 /home 下面;
  • 利用 ln -s /home/mail  /var/spool/mail 来创建链接数据;
  • 将 /home 进行 quota 限额设置

   需要注意的是,由于目前新的 distributions 大多有使用 SELinux 的机制, 因此你要进行如同上面的目录搬移时,或许你得要先暂时关闭 SELinux 才能测试。

2. 软件磁盘阵列 (Software RAID)

2.1 什么是 RAID

  磁盘阵列全名是“ Redundant Arrays of Inexpensive Disks, RAID ”,意思是:容错式廉价磁盘阵列。 RAID 可以通过一个技术(软件或硬件),将多个较小的磁盘整合成为一个较大的磁盘设备; 而这个较大的磁盘功能可不止是储存而已,还具有数据保护的功能。整个 RAID 由于选择的等级 (level) 不同,而使得整合后的磁盘具有不同的功能,基本常见的 level 有这几种:


RAID-0 (等量模式, stripe):性能最佳

  这种模式如果使用相同型号与容量的磁盘来组成时,效果较佳。这种模式的 RAID 会将磁盘先切出等量的区块 (名为chunk,一般可设置 4K~1M 之间), 然后当一个文件要写入 RAID 时,该文件会依据 chunk 的大小切割好,之后再依序放到各个磁盘里面去。由于每个磁盘会交错的存放数据, 因此当你的数据要写入 RAID 时,数据会被等量的放置在各个磁盘上面。举例来说,你有两颗磁盘组成 RAID-0 , 当你有 100MB 的数据要写入时,每个磁盘会各被分配到 50MB 的储存量。RAID-0 的示意图如下所示:

RAID-0 的磁盘写入示意图

  由于数据已经先被切割并且依序放置到不同的磁盘上面,因此每颗磁盘所负责的数据量都降低了。照这样的情况来看, 越多颗磁盘组成的 RAID-0 性能会越好,因为每颗负责的数据量就更低了。这表示我的数据可以分散让多颗磁盘来储存,当然性能会变的更好。

  只是使用此等级你必须要自行负担数据损毁的风险,由上图我们知道文件是被切割成为适合每颗磁盘分区区块的大小, 然后再依序放置到各个磁盘中。想一想,如果某一颗磁盘损毁了,那么文件数据将缺一块,此时这个文件就损毁了。 由于每个文件都是这样存放的,因此 RAID-0 只要有任何一颗磁盘损毁,在 RAID 上面的所有数据都会遗失而无法读取。

  另外,如果使用不同容量的磁盘来组成 RAID-0 时,由于数据是一直等量的依序放置到不同磁盘中,当小容量磁盘的区块被用完了, 那么所有的数据都将被写入到最大的那颗磁盘去,此时的性能就变差了。


RAID-1 (映射模式, mirror):完整备份

  这种模式也是需要相同的磁盘容量的,最好是一模一样的磁盘。如果是不同容量的磁盘组成 RAID-1 时,那么总容量将以最小的那一颗磁盘为主。这种模式主要是“让同一份数据,完整的保存在两颗磁盘上头”。举例来说,如果我有一个 100MB 的文件,且我仅有两颗磁盘组成 RAID-1 时, 那么这两颗磁盘将会同步写入 100MB 到他们的储存空间去。 因此,整体 RAID 的容量几乎少了 50%。由于两颗硬盘内容一模一样,好像镜子映照出来一样, 所以我们也称他为 mirror 模式。

  如上图所示,一份数据传送到 RAID-1 之后会被分为两股,并分别写入到各个磁盘里。 由于同一份数据会被分别写入到其他不同磁盘,因此如果要写入 100MB 时,数据传送到 I/O 总线后会被复制多份到各个磁盘, 结果就是数据量变大了。因此在大量写入 RAID-1 的情况下,写入的性能可能会变的非常差 (因为我们只有一个南桥)。 如果你使用的是硬件 RAID (磁盘阵列卡) 时,磁盘阵列卡会主动的复制一份而不使用系统的 I/O 总线,性能方面则还可以。 如果使用软件磁盘阵列,可能性能就不好了。

  由于两颗磁盘内的数据一模一样,所以任何一颗硬盘损毁时,你的数据还是可以完整的保留下来的。所以 RAID-1 最大的优点大概就在于数据的备份,不过由于磁盘容量有一半用在备份, 因此总容量会是全部磁盘容量的一半而已。虽然 RAID-1 的写入性能不佳,不过读取的性能则还可以。这是因为数据有两份在不同的磁盘上面,如果多个 processes 在读取同一笔数据时, RAID 会自行取得最佳的读取平衡。


RAID 1+0,RAID 0+1

  RAID-0 的性能佳但是数据不安全,RAID-1 的数据安全但是性能不佳,那么能不能将这两者整合起来设置 RAID 呢? 那就是 RAID 1+0 或 RAID 0+1。所谓的 RAID 1+0 就是: (1)先让两颗磁盘组成 RAID 1,并且这样的设置共有两组; (2)将这两组 RAID 1 再组成一组 RAID 0。这就是 RAID 1+0 。反过来说,RAID 0+1 就是先组成 RAID-0 再组成 RAID-1 的意思。

  如上图所示,Disk A + Disk B 组成第一组 RAID 1,Disk C + Disk D 组成第二组 RAID 1, 然后这两组再整合成为一组 RAID 0。如果我有 100MB 的数据要写入,则由于 RAID 0 的关系, 两组 RAID 1 都会写入 50MB,又由于 RAID 1 的关系,因此每颗磁盘就会写入 50MB 而已。 如此一来不论哪一组 RAID 1 的磁盘损毁,不会有任何问题发生了,这也是目前储存设备厂商最推荐的方法。

  为何会推荐 RAID 1+0 呢?想像你有 20 颗磁盘组成的系统,每两颗组成一个 RAID1,因此你就有总共 10组可以自己复原的系统。 然后这 10组再组成一个新的 RAID0,速度立刻拉升 10倍了!同时要注意,因为每组 RAID1 是个别独立存在的,因此任何一颗磁盘损毁, 数据都是从另一颗磁盘直接复制过来重建,并不像 RAID5/RAID6 必须要整组 RAID 的磁盘共同重建一颗独立的磁盘系统,性能上差非常多。而且 RAID 1 与 RAID 0 是不需要经过计算的 (striping),读写性能也比其他的 RAID 等级好太多了。


RAID 5:性能与数据备份的均衡考虑

  RAID-5 至少需要三颗以上的磁盘才能够组成这种类型的磁盘阵列。这种磁盘阵列的数据写入有点类似 RAID-0 , 不过每个循环的写入过程中 (striping),在每颗磁盘还加入一个同位检查数据 (Parity) ,这个数据会记录其他磁盘的备份数据, 用于当有磁盘损毁时的恢复。RAID-5 读写的情况有点像下面这样:

  如上图所示,每个循环写入时,都会有部分的同位检查码 (parity) 被记录起来,并且记录的同位检查码每次都记录在不同的磁盘, 因此,任何一个磁盘损毁时都能够借由其他磁盘的检查码来重建原本磁盘内的数据。不过需要注意的是, 由于有同位检查码,因此 RAID 5 的总容量会是整体磁盘数量减一颗。以上图为例, 原本的 3 颗磁盘只会剩下 (3-1)=2 颗磁盘的容量。而且当损毁的磁盘数量大于等于两颗时,这整组 RAID 5 的数据就损毁了。 因为 RAID 5 默认仅能支持一颗磁盘的损毁情况。

  在读写性能的比较上,读取的性能还不可以,与 RAID-0 有的比。不过写的性能就不见得能够增加很多,这是因为要写入 RAID 5 的数据还得要经过计算同位检查码 (parity) 的关系。由于加上这个计算的动作, 所以写入的性能与系统的硬件关系较大。尤其当使用软件磁盘阵列时,同位检查码是通过 CPU 去计算而非专职的磁盘阵列卡, 因此性能方面还需要评估。

  另外,由于 RAID 5 仅能支持一颗磁盘的损毁,因此近来还有发展出另外一种等级,就是 RAID 6 ,这个 RAID 6 则使用两颗磁盘的容量作为 parity 的储存,因此整体的磁盘容量就会少两颗,但是允许出错的磁盘数量就可以达到两颗了。也就是在 RAID 6 的情况下,同时两颗磁盘损毁时,数据还是可以救回来。


Spare Disk:备份磁盘的功能

  当磁盘阵列的磁盘损毁时,就得要将坏掉的磁盘拔除,然后换一颗新的磁盘。换成新磁盘并且顺利启动磁盘阵列后, 磁盘阵列就会开始主动的重建 (rebuild) 原本坏掉的那颗磁盘数据到新的磁盘上,然后你磁盘阵列上面的数据就复原了! 这就是磁盘阵列的优点。不过,我们还是得要动手拔插硬盘,除非你的系统有支持热拔插,否则通常得要关机才能这么做。

  为了让系统可以实时的在坏掉硬盘时主动的重建,因此就需要预备磁盘 (spare disk) 的辅助。 所谓的 spare disk 就是一颗或多颗没有包含在原本磁盘阵列等级中的磁盘,这颗磁盘平时并不会被磁盘阵列所使用, 当磁盘阵列有任何磁盘损毁时,则这颗 spare disk 会被主动的拉进磁盘阵列中,并将坏掉的那颗硬盘移出磁盘阵列,然后立即重建数据系统。


磁盘阵列的优点

  你的系统如果需要磁盘阵列的话,其实重点在于:

  • 数据安全与可靠性:指的并非网络信息安全,而是当硬件 (指磁盘) 损毁时,数据是否还能够安全的恢复或使用之意;
  • 读写性能:例如 RAID 0 可以加强读写性能,让你的系统 I/O 部分得以改善;
  • 容量:可以让多颗磁盘组合起来,故单一文件系统可以有相当大的容量。

2.2 software, hardware RAID

  为何磁盘阵列又分为硬件与软件呢?所谓的硬件磁盘阵列 (hardware RAID) 是通过磁盘阵列卡来达成阵列的目的。 磁盘阵列卡上面有一块专门的芯片在处理 RAID 的任务,因此在性能方面会比较好。在很多任务 (例如 RAID 5 的同位检查码计算) 磁盘阵列并不会重复消耗原本系统的 I/O 总线,理论上性能会较佳。如果磁盘阵列卡都支持热拔插, 亦即在不关机的情况下抽换损坏的磁盘,对于系统的复原与数据的可靠性方面非常的好用。

  此外,操作系统也必须要拥有磁盘阵列卡的驱动程序,才能够正确的捕获到磁盘阵列所产生的磁盘驱动器。

  硬件磁盘阵列卡偏偏又很贵,因此就有发展出利用软件来仿真磁盘阵列的功能, 这就是所谓的软件磁盘阵列 (software RAID)。软件磁盘阵列主要是通过软件来仿真阵列的任务, 因此会损耗较多的系统资源,比如说 CPU 的运算与 I/O 总线的资源等。不过目前我们的个人计算机实在已经非常快速了, 因此以前的速度限制现在已经不存在。

  CentOS 提供的软件磁盘阵列为 mdadm 这套软件,这套软件会以 partition 或 disk 为磁盘的单位,也就是说,你不需要两颗以上的磁盘,只要有两个以上的分区 (partition) 就能够设计你的磁盘阵列了。此外, mdadm 支持刚刚我们前面提到的 RAID0/RAID1/RAID5/spare disk 等! 而且提供的管理机制还可以达到类似热拔插的功能,可以线上 (文件系统正常使用) 进行分区的抽换,使用上也非常的方便。

  另外要知道的是,硬件磁盘阵列在 Linux 下面看起来就是一颗实际的大磁盘,因此硬件磁盘阵列的设备文件名为 /dev/sd[a-p] ,因为使用到 SCSI 的模块之故。至于软件磁盘阵列则是系统仿真的,因此使用的设备文件名是系统的设备文件, 文件名为 /dev/md0, /dev/md1...,两者的设备文件名并不相同。

2.3 软件磁盘阵列的设置

  软件磁盘阵列的设置很简单,只需要mdadm 这个指令。

[root@study ~]# mdadm --detail /dev/md0
[root@study ~]# mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=NK \
> --raid-devices=N --spare-devices=N /dev/sdx /dev/hdx...
选项与参数:
--create          :为创建 RAID 的选项;
--auto=yes        :决定创建后面接的软件磁盘阵列设备,亦即 /dev/md0, /dev/md1...
--chunk=Nk        :决定这个设备的 chunk 大小,也可以当成 stripe 大小,一般是 64K 或 512K。
--raid-devices=N  :使用几个磁盘 (partition) 作为磁盘阵列的设备
--spare-devices=N :使用几个磁盘作为备用 (spare) 设备
--level=[015]     :设置这组磁盘阵列的等级。支持很多,不过建议只要用 0, 1, 5 即可
--detail          :后面所接的那个磁盘阵列设备的详细信息

  上面的语法中,最后面会接许多的设备文件名,这些设备文件名可以是整颗磁盘,例如 /dev/sdb , 也可以是分区,例如 /dev/sdb1 之类。不过,这些设备文件名的总数必须要等于 --raid-devices 与 --spare-devices 的个数总和才行。

2.4 模拟 RAID 错误的恢复模式

2.5 开机自启动 RAID 并自动挂载

2.6 关闭软件 RAID

3. 逻辑卷管理器 LVM

  想像一个情况,你在当初规划主机的时候将 /home 只给他 50G ,等到使用者众多之后导致这个 filesystem 不够大, 此时可以这样:再加一颗新硬盘,然后重新分区、格式化,将 /home 的数据完整的复制过来, 然后将原本的 partition 卸载重新挂载新的 partition 。好烦,若是第二次分区却给的容量太多,导致很多磁盘容量被浪费了。你想要将这个 partition 缩小时,又得将上述的流程再搞一遍,这个复制很花时间。有没有更简单的方法呢? 那就是我们这个小节要介绍的 LVM 。

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

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

  LVM 的全名是 Logical Volume Manager,逻辑卷管理器。至于为什么叫“卷”,可能是可以将文件系统像卷轴一样伸长缩短吧。但是为什么这样的系统可以进行 filesystem 的扩充或缩小呢?其实与一个称为 PE 的东西有关。

  • Physical Volume, PV, 物理卷

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

  • Volume Group, VG, 卷组

  所谓的 LVM 大磁盘就是将许多 PV 整合成这个 VG 的东西,所以 VG 就是 LVM 组合起来的大磁盘。 那么这个大磁盘最大可以到多少容量呢?这与下面要说明的 PE 以及 LVM 的格式版本有关。在默认的情况下, 使用 32位的 Linux 系统时,基本上 LV 最大仅能支持到 65534 个 PE 而已,若使用默认的 PE 为 4MB 的情况下, 最大容量则仅能达到约 256GB 而已~不过,这个问题在 64位的 Linux 系统上面已经不存在了,LV 几乎没有啥容量限制了。

  • Physical Extent, PE, 物理扩展块

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

  • Logical Volume, LV, 逻辑卷

  最终的 VG 还会被切成 LV,这个 LV 就是最后可以被格式化使用的类似分区的东西了。那么 LV 是否可以随意指定大小呢? 当然不可以!既然 PE 是整个 LVM 的最小储存单位,那么 LV 的大小就与在此 LV 内的 PE 总数有关。 为了方便使用者利用 LVM 来管理其系统,因此 LV 的设备文件名通常指定为“ /dev/vgname/lvname ”的样式。

  LVM 可弹性的变更 filesystem 的容量,其实就是通过“交换 PE ”来进行数据转换, 将原本 LV 内的 PE 移转到其他设备中以降低 LV 容量,或将其他设备的 PE 加到此 LV 中以加大容量。 VG、LV 与 PE 的关系有点像下图:

PE 与 VG 的相关性图示

  如上图所示,VG 内的 PE 会分给虚线部分的 LV,如果未来这个 VG 要扩充的话,加上其他的 PV 即可。 而最重要的 LV 如果要扩充的话,也是通过加入 VG 内没有使用到的 PE 来扩充的。


实践流程

  通过 PV, VG, LV 的规划之后,再利用 mkfs 就可以将你的 LV 格式化成为可以利用的文件系统了,而且这个文件系统的容量在未来还能够进行扩充或减少, 而且里面的数据还不会被影响。

  整个流程由基础到最终的结果可以这样看:

  如此一来,我们就可以利用 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 。

3.2 LVM 实践流程

3.3 放大 LV 容量

3.4 使用 LVM thin Volume 让 LVM 动态自动调整磁盘使用率

3.5 LVM 的 LV 磁盘快照

3.6 LVM 相关指令汇整与 LVM 的关闭

 

ps:我觉得我暂时用不到,所以只是大致了解了一下。

 

posted @ 2022-12-06 11:20  莫莫君不恋爱  阅读(368)  评论(0编辑  收藏  举报