Зачем проектные квоты и чем они лучше user/group
Дисковая квота нужна в любой многопользовательской среде: хостинг с несколькими сайтами, CI/CD кэши, каталоги с логами, CDN-артефакты, окружения разработки. Классические квоты (по пользователям/группам) упираются в модель прав: в одном каталоге работают разные пользователи и сервисы, файлы меняют владельца, а ответственность остаётся на проекте.
Проектные квоты (project quota) ограничивают использование диска по дереву директорий, независимо от владельцев файлов. Вы назначаете проекту ID и привязываете его к каталогу: все новые файлы и подкаталоги наследуют ID проекта и учитываются в квоте. Это предсказуемый способ держать под контролем окружения вроде /var/www/siteA, /data/media, /srv/ci/cache без плясок с chown и группами.
Ключевые преимущества: независимость от владельцев файлов, автоматическое наследование в поддеревьях, гибкая настройка лимитов по блокам и инодам, удобные отчёты. Поддерживается на ext4 и XFS.
Для полноценного управления квотами нужен root-доступ на сервер. Это привычный сценарий на VDS, где вы контролируете файловую систему, монтирование и пакеты.
ext4 vs XFS: что выбрать
Обе ФС поддерживают проектные квоты и стабильно работают на современных ядрах. Практическая разница:
- XFS — нативная поддержка project quota и удобный инструмент
xfs_quota. Отлично чувствует себя на больших объёмах, при большом числе файлов и высокой параллельности. - ext4 — «дефолт» во многих дистрибутивах, проектные квоты включаются опцией монтирования
prjquota, управление — утилитами из пакетаquota(setquota,repquota,edquota).
Если у вас уже XFS — используйте его родные инструменты. Если ext4 — нет причин мигрировать только ради квот.

Требования и подготовка
- Современное ядро Linux (из практики: 5.x и выше) с поддержкой квот.
- Пакеты инструментов:
xfsprogsиquota. - Раздел, смонтированный с опцией
prjquota(и, при необходимости,usrquota/grpquotaпараллельно).
# проверить версии
uname -r
xfs_quota -V
quota -V
Включаем project quota на XFS
1) Монтирование с prjquota
Добавьте в /etc/fstab опцию prjquota для раздела с данными, например:
/dev/vdb1 /data xfs defaults,noatime,prjquota 0 0
mount -o remount /data
# или при первом запуске:
mount /data
Проверьте, что проектные квоты активны:
xfs_quota -x -c "state" /data
2) Маппинг проектов и привязка каталогов
Для удобства используйте стандартные файлы маппинга:
/etc/projects— соответствиеPROJECT_ID:путь/etc/projid— соответствиеимя:PROJECT_ID
mkdir -p /data/projects/prod
mkdir -p /data/projects/stage
echo "1001:/data/projects/prod" >> /etc/projects
echo "1002:/data/projects/stage" >> /etc/projects
echo "prod:1001" >> /etc/projid
echo "stage:1002" >> /etc/projid
Инициализируйте проекты (включение наследования ID для поддеревьев):
xfs_quota -x -c "project -s prod" /data
xfs_quota -x -c "project -s stage" /data
3) Лимиты по блокам и инодам
Выставляем жёсткие/мягкие лимиты по месту и количеству файлов:
# 40 ГБ мягко, 45 ГБ жёстко; без лимита по инодам
xfs_quota -x -c "limit -p bsoft=40g bhard=45g isoft=0 ihard=0 prod" /data
xfs_quota -x -c "limit -p bsoft=10g bhard=12g isoft=0 ihard=0 stage" /data
Смотрим отчёт:
xfs_quota -x -c "report -h" /data
Включаем project quota на ext4
1) Монтирование с prjquota
В /etc/fstab добавьте prjquota:
/dev/vdb1 /data ext4 defaults,noatime,prjquota 0 0
mount -o remount /data
# при первом запуске: mount /data
Инициализация таблиц квот (при необходимости) и включение:
quotacheck -P /data
quotaon -P /data
2) Назначаем PROJECT_ID каталогу
На ext4 привязка каталога к проекту делается через атрибут проекта:
# создаём каталоги
mkdir -p /data/projects/prod
mkdir -p /data/projects/stage
# назначаем ID проекта каталогу
chattr -p 1001 /data/projects/prod
chattr -p 1002 /data/projects/stage
# включаем наследование ID
chattr +P /data/projects/prod
chattr +P /data/projects/stage
# проверяем
lsattr -p /data/projects/prod
lsattr -p /data/projects/stage
Важно: атрибут наследования ставьте на корневой каталог проекта до массовой записи данных, чтобы все новые объекты корректно учитывались квотой.
3) Лимиты и отчёты
Используйте setquota и repquota из пакета quota:
# мягко 40 ГБ, жёстко 45 ГБ; без лимитов по инодам
setquota -P 1001 40G 45G 0 0 /data
setquota -P 1002 10G 12G 0 0 /data
# краткие отчёты
repquota -P -s /data

Понимание лимитов: блоки, иноды, грейс-период
- Блоки — фактическое место на диске. Если задан только жёсткий лимит, запись прекратится при достижении порога.
- Иноды — ограничение по числу файлов и каталогов. Полезно для проектов с множеством мелких файлов.
- Мягкий лимит и grace-период — позволяет временно превышать мягкий лимит; по истечении grace запись блокируется, пока использование не вернётся ниже мягкого порога или пока вы не увеличите лимит.
На XFS управление grace-периодом выполняется через xfs_quota, на ext4 — через утилиты quota (edquota, setquota).
Типовые сценарии и шаблоны
Разделение окружений
Создавайте отдельные проекты под prod, stage, dev: так вы не уроните прод при разрастании кэшей на стендах. В CI храните кэши и артефакты в отдельных деревьях со своими квотами.
Логи и аплоады
Логи приложения, access-логи, аплоады пользователей — самостоятельные проекты со строгими жёсткими лимитами. Вместе с квотой включите ротацию и удаление старых файлов.
Docker/containers
Если у вас каталоги с томами контейнеров (например, /var/lib/docker/volumes/<name>/_data), на XFS имеет смысл выделять отдельные каталоги-проекты под крупные сервисы. Помните, что overlayfs добавляет свой слой абстракции: квоты корректно работают на нижнем уровне ФС. Для гарантии учитывайте реальные пути хранения данных контейнеров.
Отчёты и оповещения (alerts)
Быстрые периодические отчёты по почте
Простейший путь — раз в день или неделю слать отчёт администраторам.
# XFS: человеко-читаемый отчёт по проектам
xfs_quota -x -c "report -h" /data | mail -s "[quota] XFS /data report" root
# ext4: отчёт по проектам
repquota -P -s /data | mail -s "[quota] ext4 /data report" root
Если нет локальной доставки почты, отправляйте в системный журнал и собирайте централизованно:
xfs_quota -x -c "report -h" /data | logger -t quota_report
Пороговые алерты с простым shell-скриптом
Скрипт ниже берёт отчёт XFS, вычисляет процент использования по жёсткому лимиту и шлёт предупреждение, если порог превышен. Для ext4 используйте аналогично repquota и адаптируйте разбор.
#!/usr/bin/env bash
set -euo pipefail
MOUNT="/data"
THRESHOLD=85
TMP=$(mktemp)
trap 'rm -f "$TMP"' EXIT
# табличный отчёт без human-readable
xfs_quota -x -c "report -p -b -i" "$MOUNT" > "$TMP"
# примерный парсинг: подгоните awk под свой формат (локаль, ширина столбцов)
awk -v th="$THRESHOLD" '
/^Project/ {next}
/^$/ {next}
/^#|^\s*ID/ {next}
/^*$/ {next}
NF>=7 {
name=$1; used=$2; soft=$3; hard=$4;
if (hard == "0" || hard == "-") next;
pct = (used * 100.0) / hard;
if (pct >= th) {
printf("ALERT project=%s used=%s hard=%s pct=%.1f\n", name, used, hard, pct);
}
}
' "$TMP" | while read -r line; do
logger -t quota_alert "$line"
echo "$line" | mail -s "[quota] threshold reached on $MOUNT" root || true
done
Рекомендуется поместить скрипт в /usr/local/sbin/quota-threshold и запускать через systemd таймер каждые 5–10 минут.
Метрики для мониторинга
Если вы собираете метрики, удобно экспортировать текущее использование квот. Минимальный подход — выводить пары «проект — использовано — лимит» в простой текст, который забирает агент.
#!/usr/bin/env bash
set -euo pipefail
MOUNT="/data"
OUT="/var/lib/metrics/quota.txt"
mkdir -p "$(dirname "$OUT")"
xfs_quota -x -c "report -p -b -i" "$MOUNT" | awk '
/^Project/ || /^$/ {next}
/^#|^\s*ID/ {next}
NF>=7 {
name=$1; used=$2; hard=$4; iused=$(NF-2); ihard=$(NF);
if (hard == "0" || hard == "-") hard = 0;
if (ihard == "0" || ihard == "-") ihard = 0;
printf("project=%s used_blocks=%s hard_blocks=%s used_inodes=%s hard_inodes=%s\n", name, used, hard, iused, ihard);
}
' > "$OUT"
Эксплуатационные тонкости
Наследование и перемещения
- Проект наследуется вниз по каталогу. На XFS команда
project -sвключает наследование; на ext4 используйтеchattr +Pу корня проекта. - Перемещение внутри одного проекта не меняет учёт. Перемещение в каталоги другого проекта изменит учёт для новых файлов; существующие файлы сохранят прежний project ID. Для массовых переносов проще пересоздать дерево и скопировать данные.
Производительность
- Оверхед квот есть, но для XFS он минимален в типичных веб-нагрузках. На ext4 заметен при большом числе операций с метаданными — тестируйте под своей нагрузкой.
- Много мелких файлов увеличивает стоимость учёта инодов. Если критична скорость, ограничивайте и объём, и число файлов, и держите порядок в структуре каталогов.
Резервное копирование и восстановление
- Квоты — не бэкап. При восстановлении на чистую ФС не забудьте повторно назначить project ID и лимиты до заливки данных.
- Инструменты копирования переносят данные, но не всегда переносят атрибут проекта. Надёжнее: подготовить пустое дерево с нужным project ID и копировать внутрь.
Обслуживание и аудит
- Регулярно пересматривайте лимиты: рост контента неизбежен. Планируйте запас и автоматические уведомления.
- Для аудита держите опорный файл с описанием проектов, владельцами, контактами и установленными лимитами.
Связанное чтение: Тюнинг ext4 и XFS на VDS и Ограничения ресурсов systemd для сервисов.
Чек-лист внедрения
- Выберите раздел с данными и включите
prjquotaв/etc/fstab. - На XFS — используйте
/etc/projectsи/etc/projid, затемxfs_quota project -s. На ext4 — назначьтеchattr -pи включите наследованиеchattr +P. - Поставьте мягкие и жёсткие лимиты по объёму и, при необходимости, по инодам.
- Настройте ежедневные отчёты и пороговые алерты.
- Задокументируйте проекты, лимиты и контакты ответственных.
Типичные ошибки и как их избежать
- Забыли включить наследование. Итог — часть файлов не учитывается в проекте. Решение:
project -sна XFS,chattr +Pна ext4 и пересоздание подкаталогов при необходимости. - Нет жёсткого лимита. Мягкий лимит без grace или с огромным grace бесполезен. Всегда задавайте
bhard. - Один общий проект для всего. Теряете управляемость. Дробите по логическим единицам: сайт, логи, загрузки, кэши.
- Парсинг «красивого» отчёта. Human-readable формат нестабилен для автоматики. Используйте табличный/числовой формат или свой слой агрегации.
- Перенос между ФС. Копирование на другой раздел требует повторного проставления project ID и лимитов до копирования bulk-данных.
Заключение
Проектные квоты — простой и надёжный способ не допустить переполнения диска и изолировать проекты по использованию пространства. На XFS всё делается «из коробки» через xfs_quota, на ext4 — через prjquota, chattr и пакет quota. Добавьте отчёты и пороговые оповещения — и вы закроете большинство эксплуатационных рисков, сохранив предсказуемость роста данных.


