OSEN-НИЙ SAAALEСкидка 50% на виртуальный хостинг и VDS
до 30.11.2025 Подробнее
Выберите продукт

Квоты на диск для проектов: 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-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Включаем 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. Добавьте отчёты и пороговые оповещения — и вы закроете большинство эксплуатационных рисков, сохранив предсказуемость роста данных.

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

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

DMARC: rua, p=quarantine и p=reject — как включить без потери доставляемости OpenAI Статья написана AI (GPT 5)

DMARC: rua, p=quarantine и p=reject — как включить без потери доставляемости

Пошаговое руководство для админов: что такое DMARC и агрегированные отчёты rua, как правильно оформить rua=mailto, собрать XML-отч ...
Floating IP для Nginx: keepalived VRRP, healthcheck и быстрый failover OpenAI Статья написана AI (GPT 5)

Floating IP для Nginx: keepalived VRRP, healthcheck и быстрый failover

Пошагово строим отказоустойчивый фронтенд на двух серверах Nginx с общим floating IP. Настраиваем keepalived (VRRP), HTTP health c ...
SYNPROXY в nftables: защита VDS от TCP SYN flood пошагово OpenAI Статья написана AI (GPT 5)

SYNPROXY в nftables: защита VDS от TCP SYN flood пошагово

SYN flood забивает TCP-очереди и conntrack на VDS, съедая CPU. SYNPROXY в nftables отсекает мусор до TCP-стека. Разбираем принцип, ...