跳转至

磁盘限额

目前仅支持对ext4格式的文件系统进行限额,其他文件系统待支持,如果您在主机设置中启用了磁盘限额,但磁盘文件系统不是ext4则限额设置无效。
此外,由于实例的系统盘为Docker设置的root dir目录,而数据盘为您在私有云后台设置的数据盘目录,因此如果需要对系统盘和数据盘都限额则必须两个目录对应的文件系统均为ext4格式,否则只能对系统盘或者数据盘进行限额,或两种都无法限额(如果都不是ext4)

使用方法

建议您按使用方法操作完成后,使用文档最下放的测试方法验证后再在私有云中开启磁盘限额功能

检查系统依赖

需要 Linux 内核版本 >= 4.5;e2fsprogs 和 quota tools 也需要较高版本

uname -r
# 5.15.0-116-generic

# Ubuntu安装quota依赖,CentOS 7 上某些命令因为版本太低无法操作,需要自行解决
apt install quota

格式化磁盘

运行 mkfs.ext4 -O project,quota /dev/sdb 格式化分区为 ext4 格式,同时开启 prjquota 特性。
运行 lsblk -f 可以看到文件存储类型(FSTYPE)。
运行 dumpe2fs -h /dev/sdb | grep quota 查看文件系统信息:

dumpe2fs 1.46.5 (30-Dec-2021)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize quota metadata_csum project
User quota inode:         3
Group quota inode:        4
Project quota inode:      12
可以看到已经成功地开启了 prjquota 特性

挂载

运行 mount -o prjquota /dev/sdb /data_quota 挂载到 /data_quota 目录,/data_quota 是挂载点,同时开启 prjquota 限制。
如果运行的是 mount /dev/sdb /data_quota,则挂载后需要再运行 quotaon -P /data_quota 开启 projquota 限制。
运行 quotaon -Ppv /data_quota 查看 quota 状态:

# 如果输出的是 project quota on /data_quota (/dev/sdb) is on (accounting),
# 则说明没有开启 prjquota 限制,需要开启。
project quota on /data_quota (/dev/sdb) is on (enforced)

建议直接配置 /etc/fstab 系统启动时自动挂载:

# 编辑 /etc/fstab,添加
/dev/sdb    /data_quota    ext4    prjquota    0    0

测试

下面测试时先切换到非 root 权限的用户,因为写入时 quota 限制对 root 权限的用户不起作用

# 查看 /data_quota 挂载点下的 quota 情况。
sudo repquota -P /data_quota

# *** Report for project quotas on device /dev/sdb
# Block grace time: 7days; Inode grace time: 7days
#                         Block limits                File limits
# Project         used    soft    hard  grace    used  soft  hard  grace
# ----------------------------------------------------------------------
# #0        --      24       0       0              3     0     0

# 创建 test 目录
sudo mkdir /data_quota/test && sudo chmod 777 /data_quota/test

# 给 /data_quota/test 目录设置 ProjectID 为 12345,
# 同时让子文件和子目录继承父目录的 ID(即 12345)。
sudo chattr +P -p 12345 /data_quota/test

# 给 /data_quota 挂载点下的 ProjectID 为 12345 的 Project,
# 设置 soft limit 为 11M,hard limit 为 11M。
sudo setquota -P 12345 11M 11M 0 0 /data_quota

# 写入一个 10M 的文件到 /data_quota/test/test(不加 sudo)。
dd if=/dev/zero of=/data_quota/test/test bs=1024K count=10

# 查看 /data_quota 挂载点下的 quota 情况。
sudo repquota -P /data_quota

# *** Report for project quotas on device /dev/sdb
# Block grace time: 7days; Inode grace time: 7days
#                         Block limits                File limits
# Project         used    soft    hard  grace    used  soft  hard  grace
# ----------------------------------------------------------------------
# #0        --      20       0       0              2     0     0
# #12345    --   10244   11264   11264              2     0     0

# 可以看到 ProjectID 为 12345 的 Project,已经使用了 10M 多一点的大小(目录本身也占用一点大小)。

# 再写入一个 10M 的文件到 /data_quota/test/test2(不加 sudo)。
dd if=/dev/zero of=/data_quota/test/test2 bs=1024K count=10

# 报错了,提示超出了磁盘的 quota 值。
# dd: error writing '/data_quota/test/test2': Disk quota exceeded
# 1+0 records in
# 0+0 records out
# 1044480 bytes (1.0 MB, 1020 KiB) copied, 0.00169563 s, 616 MB/s

# 查看 /data_quota 挂载点下的 quota 情况。
sudo repquota -P /data_quota

# *** Report for project quotas on device /dev/sdb
# Block grace time: 7days; Inode grace time: 7days
#                         Block limits                File limits
# Project         used    soft    hard  grace    used  soft  hard  grace
# ----------------------------------------------------------------------
# #0        --      20       0       0              2     0     0
# #12345    --   11264   11264   11264              2     0     0

# 可以看到 ProjectID 为 12345 的 Project,已经使用了 11M 的大小,无法再写入了。