Квоты на дисковое пространство для папки (XFS project quota)

Возникла задача, ограничить определенные папки на сервере определенным размером. Поиск решения привел к файловой системе XFS в которой сразу присутствует данный фунционал. Разбираемся как им пользоваться. Для простоты эксперимента работы проводим на виртуалке.

Сервер с ОС Ubuntu 20.04.3 LTS

Добавляем диск нужного размера, создаем таблицу разделов, раздел и файловую систему XFS на разделе:

fdisk -l
Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
parted /dev/sdb
(parted) mktable gpt
(parted) mkpart primary xfs 0% 100%
(parted) quit
mkfs.xfs /dev/sdb1

Теперь монтируем созданую файловую систему в нужное место, у меня это /mnt/sdb1, обязательно с параметром uquota, gquota или prjquota, так как мне нужно управлять квотами на папки я монтирую с параметром prjquota (project quota):

mkdir /mnt/sdb1
mount -o rw,prjquota /dev/sdb1 /mnt/sdb1

Запись для /etc/fstab:

/dev/sdb1 /mnt/sdb1 xfs rw,prjquota 0 0

Создаем структуру папок которую будим ограничивать, я просто скопировал нужные мне папки с существующего проекта, структура примерно такая:

cd /mnt/sdb1/SharedDomains/
ls -il
Directory
Settings
prohorov.site
test.prohorov.site

Ограничивать в размере будем папки prohorov.site и test.prohorov.site, в них лежат почтовые домены, задача — ограничить почтовый домен в размере на диске, чтобы один домен не сожрал своей почтой все дисковое пространство и не поставил под угрозу функционирование других доменов.
В терминологии XFS папка которую мы будем ограничивать это project.
Project-ы можно создавать на лету с помощью команды xfs_quota, но правильнее будет создать их с помощью специальных файлов /etc/projects и /etc/projid. Вот содержимое моих файлов. projid не является обязательным, в нем сопоставляется id проекта и его название, для облегчения обращения к нему. В файле /etc/projects задается id проекта и путь к папке, которую будем ограничивать.

cat /etc/projects
10:/mnt/sdb1/SharedDomains/test.prohorov.site
20:/mnt/sdb1/SharedDomains/prohorov.site
cat /etc/projid
test.prohorov.site:10
prohorov.site:20

Теперь нужно задать лимиты для проекта, сделать можно либо в интерактивном режиме , либо в командном режиме администратора (параметр -x) утилиты xfs_quota.
Командный режим:

xfs_quota -x -c 'limit -p bsoft=100m bhard=170m prohorov.site'

Интерактивный режим:

xfs_quota -x
xfs_quota> limit -p bsoft=100m bhard=170m prohorov.site

Далее для удобства интегрирование примеров в скрипты, примеры указаны в командном режиме.

Есть 4 значения для каждого лимита, текущее использование, мягкий лимит bsoft, жесткий лимит bhard и таймер. Таймер начинает отсчет когда происходит превышение мягкого лимита, и по срабатыванию таймера при попытке записи будет происходить ошибка. Таймер сбрасывается когда превышение мягкого лимита исчезает. По умолчанию таймер установлен на 7 дней. Жесткий лимит не может быть превышен никогда. Мягкий лимит можно не устанавливать (bsoft=0).

Отчет по лимитам:

xfs_quota -x -c 'report -h'

Бэкап лимитов проектов:

xfs_quota -x -c 'dump -p' > /root/xfs_quota_dump

Восстановление лимитов проектов из бэкапа:

xfs_quota -x -c 'restore -p' < /root/xfs_quota_dump

Автоматизировать процесс восстановления лимитов можно с помощью systemd. Создаем скрипты бэкапа, восстановления и юнит systemd:

nano /root/xfs_quota_backup.sh
#!/bin/bash
xfs_quota -x -c 'dump -p' > /root/xfs_quota_dump
nano /root/xfs_quota_restore.sh
#!/bin/bash
xfs_quota -x -c 'restore -p' < /root/xfs_quota_dump
nano /etc/systemd/system/xfs.service

[Unit]
Description=XFS quota limits restore

[Service]
Type=simple
ExecStart=/root/xfs_quota_restore.sh
TimeoutStartSec=0

[Install]
WantedBy=default.target
systemctl daemon-reload
systemctl enable xfs.service