Новинка Виртуальный VDS сервер в Нидерландах от 390р
Выберите продукт

Квоты на диск для проектов: ext4/XFS project quotas, отчёты и алерты

Проектные квоты ограничивают использование диска по дереву каталогов, независимо от владельцев файлов. В статье — настройка на XFS и ext4: prjquota, /etc/projects, назначение PROJECT_ID, лимиты и grace, отчёты, скрипты алертов и эксплуатационные нюансы. Подойдёт администраторам и DevOps.
Квоты на диск для проектов: ext4/XFS project quotas, отчёты и алерты

Зачем проектные квоты и чем они лучше 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 — нет причин мигрировать только ради квот.

Отчёт xfs_quota по проектным квотам в терминале

Требования и подготовка

  • Современное ядро Linux (из практики: 5.x и выше) с поддержкой квот.
  • Пакеты инструментов: xfsprogs и quota.
  • Раздел, смонтированный с опцией prjquota (и, при необходимости, usrquota/grpquota параллельно).
# проверить версии
uname -r
xfs_quota -V
quota -V
FastFox VDS
Облачный VDS-сервер
Виртуальные серверы с быстрым запуском и гибкой конфигурацией от 390₽ / мес
Доступные локации
Россия Нидерланды

Включаем 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

Команды chattr и setquota для проектных квот на ext4

Понимание лимитов: блоки, иноды, грейс-период

  • Блоки — фактическое место на диске. Если задан только жёсткий лимит, запись прекратится при достижении порога.
  • Иноды — ограничение по числу файлов и каталогов. Полезно для проектов с множеством мелких файлов.
  • Мягкий лимит и 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 для сервисов.

Чек-лист внедрения

  1. Выберите раздел с данными и включите prjquota в /etc/fstab.
  2. На XFS — используйте /etc/projects и /etc/projid, затем xfs_quota project -s. На ext4 — назначьте chattr -p и включите наследование chattr +P.
  3. Поставьте мягкие и жёсткие лимиты по объёму и, при необходимости, по инодам.
  4. Настройте ежедневные отчёты и пороговые алерты.
  5. Задокументируйте проекты, лимиты и контакты ответственных.

Типичные ошибки и как их избежать

  • Забыли включить наследование. Итог — часть файлов не учитывается в проекте. Решение: project -s на XFS, chattr +P на ext4 и пересоздание подкаталогов при необходимости.
  • Нет жёсткого лимита. Мягкий лимит без grace или с огромным grace бесполезен. Всегда задавайте bhard.
  • Один общий проект для всего. Теряете управляемость. Дробите по логическим единицам: сайт, логи, загрузки, кэши.
  • Парсинг «красивого» отчёта. Human-readable формат нестабилен для автоматики. Используйте табличный/числовой формат или свой слой агрегации.
  • Перенос между ФС. Копирование на другой раздел требует повторного проставления project ID и лимитов до копирования bulk-данных.

Заключение

Проектные квоты — простой и надёжный способ не допустить переполнения диска и изолировать проекты по использованию пространства. На XFS всё делается «из коробки» через xfs_quota, на ext4 — через prjquota, chattr и пакет quota. Добавьте отчёты и пороговые оповещения — и вы закроете большинство эксплуатационных рисков, сохранив предсказуемость роста данных.

Поделиться статьей

Вам будет интересно

Как безопасно выполнить bootstrap MariaDB Galera после полного останова

Как безопасно выполнить bootstrap MariaDB Galera после полного останова

После одновременной остановки всех узлов Galera обычного запуска MariaDB недостаточно. Сначала найдите сервер с последней транзакц ...
CoreDNS в Kubernetes: исправляем CrashLoopBackOff, SERVFAIL и DNS-петлю

CoreDNS в Kubernetes: исправляем CrashLoopBackOff, SERVFAIL и DNS-петлю

Разберём, почему CoreDNS перезапускается или отвечает SERVFAIL, как обнаружить замкнутую пересылку DNS-запросов, проверить доступн ...
Apache Kafka KRaft на VDS: отдельные controller и broker

Apache Kafka KRaft на VDS: отдельные controller и broker

Соберём новый Kafka-кластер без ZooKeeper на шести Linux VDS: три узла controller образуют отказоустойчивый metadata quorum, а три ...