细说Linux系统管理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 磁盘配额

1.1.1 什么是磁盘配额

磁盘配额(Quota)就是Linux系统中用来限制特定的普通用户或用户组在指定的分区上占用的磁盘空间或文件个数的。在这个概念中有三个重点需要注意:第一,限制的用户和用户组只能是普通用户和用户组,也就是说超级用户root是不能做磁盘配额的;第二,磁盘配额限制只能针对分区,而不能针对某个目录;第三,我们可以限制用户占用的磁盘容量大小(block),当然也能限制用户允许占用的文件个数(inode)。

磁盘配额在实际生活中其实是很常见的,比如,我们的邮箱不管多大,都是有限制的,而不可能无限制地存储邮件;我们可以上传文件的服务器也是有容量限制的;网页中的个人空间也不可能让我们无限制地使用。

磁盘配额就好像我们出租写字楼,虽然整栋楼的空间非常大,但是租用整栋楼的成本太高。我们可以分开出租,用户如果觉得不够用,则还可以租用更大的空间。不过租用是不能随便进行的,其中有几个规矩必须遵守:第一,我的楼是租给外来用户的(普通用户),可以租给一个人(用户),也可以租给一家公司(用户组),但是这栋楼的所有权是我的,所以不能租给我自己(root用户);第二,如果要租用,则只能在每层租用一定大小的空间,而不能在一个房间中再划分出子空间来租用(配额只能针对分区,而不能限制某个目录);第三,租户可以决定在某层租用多大的空间(磁盘容量限制),也可以在某层租用几个人员名额,这样只有这几个人员才能进入本层(文件个数限制)。

磁盘配额要想正常使用,有几个前提条件。

· 内核必须支持磁盘配额。CentOS 6.x版本的Linux默认支持磁盘配额,不需要做任何修改。如果不放心,则可以查看内核配置文件,看是否支持磁盘配额。命令如下:

    [root@localhost ~]# grep CONFIG_QUOTA /boot/config-2.6.32-279.el6.i686
    CONFIG_QUOTA=y
    CONFIG_QUOTA_NETLINK_INTERFACE=y
    # CONFIG_QUOTA_DEBUG is not set
    CONFIG_QUOTA_TREE=y
    CONFIG_QUOTACTL=y

可以看到,内核已经支持磁盘配额。如果内核不支持,就需要重新编译内核,加入quota supper功能。

· 系统中必须安装了Quota工具。我们的Linux中默认安装了Quota工具,查看命令如下:

    [root@localhost ~]# rpm -qa | grep quota
    quota-3.17-16.el6.i686

· 要支持磁盘配额的分区必须开启磁盘配额功能。这项功能需要手工开启,不再是默认开启的。

1.1.2 磁盘配额中的常见概念

1.用户配额和组配额

用户配额是指针对用户个人的配额,而组配额是指针对整个用户组的配额。如果我们需要限制的用户数量并不多,则可以给每个用户单独指定配额。如果用户比较多,那么单独限制太过麻烦,这时我们可以把用户加入某个用户组,然后给组指定配额,就会简单得多。需要注意的是,组中的用户是共享空间或文件数的。也就是说,如果用户lamp1、lamp2和lamp3都属于brother用户组,我给brother用户组分配100MB的磁盘空间,那么,这三个用户不是平均分配这100MB空间的,而是先到先得,谁先占用,谁就有可能占满这100MB空间,后来的就没有空间可用了。

2.磁盘容量限制和文件个数限制

我们除了可以通过限制用户可用的block数量来限制用户可用的磁盘容量,也可以通过限制用户可用的inode数量来限制用户可以上传或新建的文件个数。

3.软限制和硬限制

软限制大家可以理解为警告限制,硬限制就是真正的限制了。比如,规定软限制为100MB,硬限制为200MB,那么,当用户使用的磁盘空间为100~200MB时,用户还可以继续上传和新建文件,但是每次登录时都会收到一条警告消息,告诉用户磁盘将满。

4.宽限时间

如果用户的空间占用数处于软限制和硬限制之间,那么系统会在用户登录时警告用户磁盘将满,但是这个警告不会一直进行,而是有时间限制的,这个时间就是宽限时间,默认是7天。如果到达宽限时间,用户的磁盘占用量还超过软限制,那么软限制就会升级为硬限制。也就是说,如果软限制是100MB,硬限制是200MB,宽限时间是7天,此时用户占用了120MB,那么今后7天用户每次登录时都会出现磁盘将满的警告,如果用户置之不理,7天后这个用户的硬限制就会变成100MB,而不是200MB了。

1.1.3 磁盘配额的实现过程

我们开始进行磁盘配额实验,首先来规划一下我们的实验。

· 磁盘配额是限制普通用户在分区上所使用的磁盘空间和文件个数的,所以我们需要指定一个分区。那么,我们手工建立一个容量为5GB的/dev/sdb1分区,把它挂载到/disk目录当中。

· 我们需要建立被限制的用户和用户组。假设需要限制lamp1、lamp2和lamp3用户,这三个用户均属于brother用户组。

· brother组的磁盘容量硬限制为500MB,软限制为450MB,文件个数没有限制。lamp1用户为了便于测试,设定磁盘容量硬限制为50MB,软限制为40MB;文件个数硬限制为10个,软限制为8个。lamp2和lamp3用户的磁盘容量硬限制为250MB,软限制为200MB,文件个数没有限制。

· 大家发现,lamp1、lamp2和lamp3用户加起来的磁盘容量硬限制为550MB,超过了brother组的磁盘容量硬限制500MB。这样一来,某个用户可能还达不到自己的用户限制,而达到组限制时就不能再写入数据了。也就是说,如果用户限制和组限制同时存在,那么哪个限制更小,哪个限制优先生效。

· 系统宽限时间为8天。

规划好了实验,我们开始进行磁盘配额设置吧。

1.建立要指定配额的分区

我们按照实验规划,划分5GB的/dev/sdb1分区,并将它挂载到/disk目录中,然后查看这个目录。命令如下:

    [root@localhost ~]# df -h
    文件系统              容量   已用   可用 已用%% 挂载点
    /dev/sda3            28G  2.2G   24G   9% /
    tmpfs                504M    0  504M   0% /dev/shm
    /dev/sda1           194M   26M  158M  14% /boot
    /dev/sdb1           494M   11M  458M   3% /disk

    [root@localhost ~]# mount
    /dev/sda3 on / type ext4 (rw)
    proc on /proc type proc (rw)
    sysfs on /sys type sysfs (rw)
    /dev/sda1 on /boot type ext4 (rw)
    /dev/sdb1 on /disk type ext4 (rw)

2.建立需要进行限制的用户和用户组

命令如下:

    [root@localhost ~]# groupadd brother
    [root@localhost ~]# useradd -G brother lamp1
    [root@localhost ~]# useradd -G brother lamp2
    [root@localhost ~]# useradd -G brother lamp3
    [root@localhost ~]# passwd lamp1
    [root@localhost ~]# passwd lamp2
    [root@localhost ~]# passwd lamp3

建立lamp1、lamp2和lamp3用户,并把它们加入brother用户组中。

3.在分区上开启磁盘配额功能

如果仅仅是临时开启,用于实验,那么可以直接使用命令来开启/disk分区的磁盘配额功能。命令如下:

    [root@localhost ~]# mount -o remount, usrquota, grpquota /disk
    #重新挂载/disk分区,并加入用户和用户组的磁盘配额功能

这里首先需要注意,如果采用命令的方式开启磁盘配额功能,那么只在本次开机中生效,一旦系统重新启动,这个功能就会失效;其次需要注意,开启磁盘配额功能的参数是usrquota和grpquota,不要写错了。

使用命令临时挂载分区,系统会同步更新/etc/mtab文件。那么/etc/mtab和/etc/fstab这两个文件有什么联系和区别吗?其实/etc/mtab文件中记录的是操作系统已经挂载的文件系统(分区),包括操作系统建立的虚拟文件系统,所以,如果磁盘配额功能是临时生效的,那么使用命令修改的就是这个文件;而/etc/fstab文件中记录的是操作系统准备挂载的文件系统,也就是下次启动后系统会挂载的文件系统,所以,如果磁盘配额功能是永久生效的,就应该修改这个文件。

我们要让磁盘配额功能永久生效,则需要修改/etc/fstab文件。命令如下:

    [root@localhost ~]# vi /etc/fstab
    /dev/sdb1   /disk      ext4   defaults, usrquota, grpquota     0 0
    …省略部分输出…
    [root@localhost ~]# mount –o remount /disk
    #修改的配置文件如果想要生效,则必须重启系统;否则也需要把分区重新挂载一遍

修改/etc/fstab文件时一定要小心,一旦改错就有可能造成系统无法正常启动。

4.建立磁盘配额配置文件

接下来我们需要建立磁盘配额配置文件,这个配置文件不是手工建立的,而是通过quotacheck命令来扫描建立的。quotacheck命令会扫描分区,查看分区中每个用户和用户组已经占用的磁盘空间和文件总数,并把扫描结果记录在该分区的最高一级目录下,保存成aquota.user和aquota.group文件。也就是说,我们会利用quotacheck命令生成aquota.user(用户配额文件)和aquota.group(组配额文件)这两个磁盘配额配置文件,这两个文件会保存在/disk目录下,因为/disk是一个独立的分区。quotacheck命令的格式如下:

    [root@localhost ~]# quotacheck [选项] [分区名]
    选项:
        -a:扫描/etc/mtab文件中所有启用磁盘配额功能的分区。如果加入此参数,命令后面
            就不需要加入分区名了
        -c:不管原有的配置文件,重新扫描并建立新的配置文件
        -u:建立用户配额的配置文件,也就是生成aquota.user文件
        -g:建立组配额的配置文件,会生成aquota.group文件
        -v:显示扫描过程
        -m:强制以读写的方式扫描文件系统,和-M类似。一般在扫描根分区时使用
        -f:强制扫描文件系统,并写入新的配置文件。一般在扫描新添加的硬盘分区时使用

我们常用的参数就是-avug,而-fm参数一般在文件系统已经启动Quota,如果需要重新扫描分区时使用。我们来扫描一下/disk分区,命令如下:

    [root@localhost ~]# quotacheck -avug
    quotacheck: Your kernel probably supports journaled quota but you are not using
    it. Consider switching to journaled quota to avoid running quotacheck after an
    unclean shutdown.
    quotacheck: Scanning /dev/sdb1 [/disk] done
    quotacheck: Cannot stat old user quota file: 没有那个文件或目录
    quotacheck: Cannot stat old group quota file: 没有那个文件或目录
    quotacheck: Cannot stat old user quota file: 没有那个文件或目录
    quotacheck: Cannot stat old group quota file: 没有那个文件或目录
    quotacheck: Checked 2 directories and 0 files
    quotacheck: Cannot create new quotafile /disk/aquota.user.new: 权限不够
    quotacheck: Cannot initialize IO on new quotafile: 权限不够
    quotacheck: Cannot create new quotafile /disk/aquota.group.new: 权限不够
    quotacheck: Cannot initialize IO on new quotafile: 权限不够

这里出现了报错,我们创建磁盘配额的配置文件时权限不够。这是由于SELinux造成的,把SELinux关闭即可。命令如下:

    [root@localhost ~]# vi /etc/selinux/config
    SELINUX=enforcing
    #把这句话改为下面这样
    SELINUX=disabled

记得要重新启动Linux系统,然后再来创建配置文件。命令如下:

    [root@localhost ~]# quotacheck -avug
    quotacheck: Your kernel probably supports journaled quota but you are not using
    it. Consider switching to journaled quota to avoid running quotacheck after an
    unclean shutdown.
    quotacheck: Scanning /dev/sdb1 [/disk] done
    quotacheck: Cannot stat old user quota file: 没有那个文件或目录
    quotacheck: Cannot stat old group quota file: 没有那个文件或目录
    quotacheck: Cannot stat old user quota file: 没有那个文件或目录
    quotacheck: Cannot stat old group quota file: 没有那个文件或目录
    #上面的报错只是说明旧的配置文件不存在,可以忽略
    quotacheck: Checked 2 directories and 0 files
    #实际扫描的信息
    quotacheck: Old file not found.
    quotacheck: Old file not found.

这个命令会出现报错,这些报错只是告诉我们旧的配置文件不存在,可以忽略。我们只要确认aquota.user和aquota.group配置文件已经建立,就说明quotacheck命令正常执行了。查看命令如下:

    [root@localhost ~]# ll /disk/
    总用量 24
   -rw-------1 root root  6144 4月  17 01:08 aquota.group
   -rw-------1 root root  6144 4月  17 01:08 aquota.user
    #/disk目录中的两个磁盘配额配置文件已经建立

我把/分区也开启了磁盘配额功能,命令如下:

    [root@localhost ~]# vi /etc/fstab
    UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2  /  ext4  defaults, usrquota, grpquota
    1 1
    #开启/分区的磁盘配额功能
    [root@localhost ~]# mount -o remount /
    #重新挂载/分区

当我们自动扫描/分区建立磁盘配额配置文件时,因为/分区已经被挂载成读写系统,而quotacheck命令需要把分区先挂载成只读分区,然后建立配置文件,最后再挂载回来,所以不能直接在/分区中建立配置文件。这时就需要使用-m选项强制以读写方式扫描文件系统了,命令如下:

    [root@localhost ~]# quotacheck -avug
    quotacheck: Your kernel probably supports journaled quota but you are not using
    it. Consider switching to journaled quota to avoid running quotacheck after an
    unclean shutdown.
    quotacheck: Cannot remount filesystem mounted on / read-only so counted values
    might not be right.
    Please stop all programs writing to filesystem or use -m flag to force checking.
    #出现报错提示,因为/分区已经被挂载,所以需要使用-m选项强制扫描
    [root@localhost ~]# quotacheck -avugm
    quotacheck: Your kernel probably supports journaled quota but you are not using
    it. Consider switching to journaled quota to avoid running quotacheck after an
    unclean shutdown.
    quotacheck: Scanning /dev/sda3 [/] done
    quotacheck: Cannot stat old user quota file: 没有那个文件或目录
    quotacheck: Cannot stat old group quota file: 没有那个文件或目录
    quotacheck: Cannot stat old user quota file: 没有那个文件或目录
    quotacheck: Cannot stat old group quota file: 没有那个文件或目录
    quotacheck: Checked 6809 directories and 74529 files
    quotacheck: Old file not found.
    quotacheck: Old file not found.
    quotacheck: Scanning /dev/sdb1 [/disk] done
    quotacheck: Checked 2 directories and 2 files
    #扫描完成
    [root@localhost ~]# ll /
    总用量 115
   -rw-------  1 root root  8192 4月  17 01:17 aquota.group
   -rw-------  1 root root  7168 4月  17 01:17 aquota.user
    …省略部分输出…
    #配置文件建立

也就是说,如果我们需要在/分区中建立磁盘配额配置文件,则使用的参数是-avugm,而不是-avug。

5.设置用户和组的配额限制

我们已经在/disk分区中建立了配置文件,接下来需要给lamp1、lamp2和lamp3用户及brother用户组设置配额限制了。当然不能用vi直接编辑aquota.user和aquota.group文件(这两个文件是二进制文件),而要使用edquota命令来进行配置。命令格式如下:

    [root@localhost ~]# edquota [选项] [用户名或组名]
    选项:
        -u用户名:  设定用户配额
        -g组名:    设定组配额
        -t:        设定宽限时间
        -p:        复制配额限制。如果已经设定好某个用户的配额限制,而其他用户的配额限
                    制和这个用户相同,那么可以直接复制配额限制,而不用全部手工指定

我们给lamp1用户设定的配额限制是:磁盘容量软限制是40MB,硬限制是50MB;文件个数软限制是8个,硬限制是10个(设置得稍微小一点,以方便测试)。命令如下:

    [root@localhost ~]# edquota -u lamp1
    #使用edquota命令进入之后,就是标准的vi操作方法
    Disk quotas for user lamp1 (uid 500):
    #给用户lamp1(UID是500)设定磁盘配额
      Filesystem         blocks     soft    hard    inodes      soft     hard
      /dev/sdb1          0          0       0       0           0        0
    #分区名              已占用容量  软限制  硬限制  已占用文件数 软限制   硬限制

在使用edquota命令打开的界面中,我们使用标准vi方法进行操作(其实就是修改aquota.user文件)。第一行表示针对哪个用户设定磁盘配额。第二行分为7个字段,每个字段的含义如下。

· 文件系统名(分区名)(Filesystem):针对哪个分区设定磁盘配额。

· 磁盘容量(blocks):当前用户在当前分区中已经占用了多少磁盘空间,单位为KB。这项不能修改,是由系统自动检测的。

· 容量软限制(soft):限制用户使用磁盘容量的软限制,单位为KB。

· 容量硬限制(hard):限制用户使用磁盘容量的硬限制,单位为KB。

· 文件数量(inodes):当前用户在当前分区中已经占用的文件个数。这项不能修改,是由系统自动检测的。

· 文件个数软限制(soft):限制用户使用文件个数的软限制。

· 文件个数硬限制(hard):限制用户使用文件个数的硬限制。

如果限制数是0,则代表没有限制。我们先给lamp1用户配置限额,命令如下:

    Disk quotas for user lamp1 (uid 500):
      Filesystem        blocks      soft      hard    inodes    soft    hard
      /dev/sdb1           0     40000      50000         0       8       10
    #不用对齐,是7列就行

再给lamp2用户配置限额。lamp2用户要求磁盘容量软限制是250MB,硬限制是250MB,文件个数没有限制,命令如下:

                              [root@localhost ~]# edquota -u lamp2
                              Disk quotas for user lamp2 (uid 501):
                                Filesystem        blocks      soft      hard    inodes    soft    hard
                                /dev/sdb1     0         250000         300000         0       0       0

接下来给brother组配置限额。brother组要求磁盘容量软限制是450MB,硬限制是500MB,文件个数没有限制,命令如下:

    [root@localhost ~]# edquota -g brother
    Disk quotas for group brother (gid 500):
      Filesystem    blocks      soft      hard    inodes    soft    hard
      /dev/sdb1     0          450000    500000         0        0       0

6.配额复制

lamp3用户的配额值和lamp2用户完全一样,我们就可以使用lamp2用户作为模板进行复制。这样,我们如果需要建立大量的配额值一致的用户,就会非常方便,不用一个个地手工建立了。复制命令如下:

    [root@localhost ~]# edquota -p lamp2-u lamp3
    #命令 -p  源用户 -u  目标用户

7.修改宽限时间

我们要求把宽限时间改为8天,修改命令如下:

    [root@localhost ~]# edquota –t
    Grace period before enforcing soft limits for users:
    Time units may be: days, hours, minutes, or seconds
      Filesystem           Block grace period    Inode grace period
      /dev/sdb1                  8days                8days
    #分区名                 容量的宽限时间            个数的宽限时间

8.启动和关闭配额

配额的配置完成,接下来只需要启动配额就大功告成了。启动命令如下:

[root@localhost ~]# quotaon [选项] [分区名]
选项:
      -a:依据/etc/mtab文件启动所有的配额分区。如果不加-a,后面就一定要指定分区名
      -u:启动用户配额
     -g:启动组配额
     -v:显示启动过程的信息
     [root@localhost ~]# quotaon -vug /disk/
     /dev/sdb1 [/disk]: group quotas turned on
     /dev/sdb1 [/disk]: user quotas turned on
     #启动/disk分区的配额
    [root@localhost ~]# quotaon –avug
    #这条命令也可以

关闭配额的命令如下:

    [root@localhost ~]# quotaoff [选项] [分区名]
    选项
        -a:依据/etc/mtab文件关闭所有的配额分区。如果不加-a,后面就一定要指定分区名
        -u:关闭用户配额
        -g:关闭组配额

    [root@localhost ~]# quotaoff –a
    #依据/etc/mtab文件关闭配额分区

1.1.4 磁盘配额的查询

我们已经建立好了磁盘配额,但是还需要有效的查询配额的手段,这样才能知道系统中到底有哪些分区设定了哪些配额。查询磁盘配额有两种方法:一种方法是使用quota命令查询用户或用户组的配额;另一种方法是使用repquota命令查询整个分区的配额情况。

· quota命令查询用户或用户组配额。

    [root@localhost ~]# quota [选项] [用户名或组名]
    选项:
        -u用户名:  查询用户配额
        -g组名:    查询组配额
        -v:        显示详细信息
        -s:        以习惯单位显示容量大小,如M、G

    [root@localhost ~]# quota -uvs lamp1
    Disk quotas for user lamp1 (uid 500):
        Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
          /dev/sda3     20      0      0             6       0      0
          /dev/sdb1      0   40000   50000            0      8     10
    #查看lamp1用户的配额值
    [root@localhost ~]# quota -uvs lamp2
    Disk quotas for user lamp2 (uid 501):
        Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
          /dev/sda3   36752      0      0          2672      0      0
          /dev/sdb1      0   245M   293M             0      0       0
    #查看lamp2用户的配额值

lamp1用户的配额值还不够大,所以没有换算成MB单位,但是lamp2用户已经换算了。在选项列当中多出了grace字段,这里是用来显示宽限时间的,我们现在还没有达到软限制,所以grace字段为空。

· repquota命令查询文件系统配额。

    [root@localhost ~]# repquota [选项] [分区名]
    选项:
        -a:依据/etc/mtab文件查询配额。如果不加-a选项,就一定要加分区名
        -u:查询用户配额
        -g:查询组配额
        -v:显示详细信息
        -s:以习惯单位显示容量大小

    [root@localhost ~]# repquota –augvs
    *** Report for user quotas on device /dev/sdb1    ←用户配额信息
    Block grace time: 8days; Inode grace time: 8days
                        Block limits              File limits
    User          used   soft   hard  grace   used  soft  hard  grace
    ----------------------------------------------------------------------
    root     --     13       0      0             2    0    0
    lamp1    --      0   40000   50000            0    8   10
    lamp2    --      0   245M   293M            0    0    0
    lamp3    --      0   245M   293M            0    0    0
    #用户的配额值
    Statistics:
    Total blocks: 7
    Data blocks: 1
    Entries: 4
    Used average: 4.000000

    *** Report for group quotas on device /dev/sdb1       ←组配额信息
    Block grace time: 7days; Inode grace time: 7days
                        Block limits              File limits
    Group          used   soft   hard  grace   used  soft  hard  grace
    ----------------------------------------------------------------------
    root     --     13      0       0            2    0    0
    brother   --      0   440M   489M            0    0    0
    #组的配额值
    Statistics:
    Total blocks: 7
    Data blocks: 1
    Entries: 2
    Used average: 2.000000

1.1.5 磁盘配额的测试

我们的磁盘配额已经生效,接下来测试一下是否会限制我们的用户。以lamp1用户为例,因为lamp1用户除容量被限制外,也限制了文件个数。先测试文件个数是否被限制了,命令如下:

    [root@localhost ~]# chmod 777 /disk/
    #给/disk目录赋予权限,lamp1用户要拥有写权限
    [root@localhost ~]# su - lamp1
    #切换成lamp1用户
    [lamp1@localhost ~]$ cd /disk/
    #进入/disk目录
    [lamp1@localhost disk]$ touch 11
    #建立文件
    [lamp1@localhost disk]$ touch 22
    [lamp1@localhost disk]$ touch 33
    [lamp1@localhost disk]$ touch 44
    [lamp1@localhost disk]$ touch 55
    [lamp1@localhost disk]$ touch 66
    [lamp1@localhost disk]$ touch 77
    [lamp1@localhost disk]$ touch 88
    [lamp1@localhost disk]$ touch 99
    sdb1: warning, user file quota exceeded.      ←有警告信息了,因为软限制是8个
    [lamp1@localhost disk]$ ls
    11  22  33  44  55  66  77  88  99  aquota.group  aquota.user  lost+found
    #虽然警告了,但是第9个文件依然建立
    [lamp1@localhost disk]$ touch 10
    [lamp1@localhost disk]$ touch 111
    sdb1: write failed, user file limit reached.
    touch: 无法创建"111": 超出磁盘配额                 ←超出磁盘配额
    [lamp1@localhost disk]$ ls
    10  11  22  33  44  55  66  77  88  99  aquota.group  aquota.user  lost+found
    #第11个文件没有建立

还记得吗?磁盘配额的概念是指定的普通用户在指定的分区中使用磁盘空间和文件个数的限制。所以一定要记得切换用户和建立文件的目录,否则默认全部写入/分区,而我们并没有在/分区上设定磁盘配额。

我们切换到root身份,使用repquota命令查看一下。

    [root@localhost ~]# repquota -uvs /disk/
    *** Report for user quotas on device /dev/sdb1
    Block grace time: 8days; Inode grace time: 8days
                        Block limits              File limits
    User          used   soft   hard  grace   used  soft  hard  grace
    ----------------------------------------------------------------------
    root     --     13      0      0             2    0    0
    lamp1    -+      0   40000   50000           10    8   10  7days
    lamp2    --      0   245M   293M            0    0    0
    lamp3    --      0   245M   293M            0    0    0

    Statistics:
    Total blocks: 7
    Data blocks: 1
    Entries: 4
    Used average: 4.000000

看到了吗?lamp1用户的文件个数的grace字段开始倒数了。

删除一个文件,然后建立一个大于50MB的文件,看看磁盘容量是否被限制了。命令如下:

    [lamp1@localhost disk]$ rm -rf 10
    #删除文件10,空出文件个数
    [lamp1@localhost disk]$ dd if=/dev/zero of=/disk/testfile bs=1M count=60
    #建立testfile文件,指定文件大小为60MB
    sdb1: warning, user block quota exceeded.
    sdb1: write failed, user block limit reached.
    dd: 正在写入"/disk/111": 超出磁盘配额             ←报错,超出磁盘配额
    记录了49+0 的读入
    记录了48+0 的写出
    51200000字节(51 MB)已复制,0.538582 秒,95.1 MB/秒

    [lamp1@localhost disk]$ ll -h testfile
   -rw-rw-r--1 lamp1 lamp1 49M 4月  17 02:52 testfile
    #查看一下testfile文件的大小,并没有超出50MB的硬限制

在dd命令中,if用于指定输入项,这里我们用/dev/zero作为输入项,会不停地向目标文件中写0; of用于指定输出项,这里用/disk/testfile作为目标文件;bs指定每次复制1MB数据;count指定复制60次。也就是建立一个大小为60MB的testfile文件,但是这个文件大小超出了磁盘容量硬限制,所以只建立了49MB,证明容量限制也生效了。

1.1.6 非交互设定用户磁盘配额

如果我们需要写脚本建立大量的用户,并给每个用户都自动进行磁盘配额,那么edquota命令就不能在脚本中使用了,因为这个命令的操作过程和vi类似,需要和管理员产生交互。这时就需要利用setquota命令进行设置,这个命令的好处是通过命令行设定配额,而不用和管理员交互设定。命令格式如下:

    [root@localhost ~]# setquota -u用户名 容量软限制 容量硬限制 个数软限制  \
    个数硬限制 分区名

举个例子,我们再建立用户lamp4,并用setquota命令设定磁盘配额。

    [root@localhost ~]# useradd lamp4
    [root@localhost ~]# passwd lamp4
    #建立用户
    [root@localhost ~]# setquota-u lamp41000020000 5 8 /disk
    #设定用户在/disk分区中的容量软限制为10MB,硬限制为20MB;文件个数软限制为5个,硬限制为8个
    [root@localhost ~]# quota -uvs lamp4
    Disk quotas for user lamp4 (uid 503):
        Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
          /dev/sdb1      0   10000   20000              0      5      8
    #查看一下,配额生效了

这个命令在写脚本进行批量设置时更加方便。当然,在写脚本时也可以先建立一个模板用户,设定好磁盘配额,再进行配额复制。