Привіт! Я Kernelka. Сьогодні покажу, як увімкнути й налаштувати квоти диска в Linux для користувачів і цілих проєктів (каталогів) на XFS та EXT4, а ще — як додати автоматичну перевірку та оповіщення, щоб ви завжди тримали використання диска під контролем. Менше ручної рутини — більше спокою 🧠

Що таке квоти і навіщо вони вам

Квоти обмежують місце, яке може займати користувач, група або проєктний каталог. Ви задаєте soft-ліміт (попередження) і hard-ліміт (жорстка заборона), а також граційний період для перевищень. Це рятує сервер від випадкового «з’їдання» всього сховища одним активним акаунтом або CI-пайплайном.

Підготовка системи

1) Перевірте тип файлової системи

df -T

Нижче два сценарії — XFS і EXT4. Оберіть свій.

2) Встановіть утиліти

Debian/Ubuntu:

sudo apt update
sudo apt install -y quota quotatool xfsprogs mailutils

RHEL/CentOS/Fedora:

sudo dnf install -y quota xfsprogs mailx

Arch Linux:

sudo pacman -S --needed quota xfsprogs s-nail

Увімкнення квот у /etc/fstab

XFS

Додайте потрібні опції (для користувацьких/групових/проєктних квот відповідно): uquota, gquota, pquota. Приклад:

/dev/sdb1  /home  xfs  defaults,uquota,gquota,pquota  0 0
sudo mount -o remount /home

На XFS додаткова індексація не потрібна — все рахуються онлайн.

EXT4

Додайте в опції монтування usrquota,grpquota,prjquota:

/dev/sdc1  /srv/data  ext4  defaults,usrquota,grpquota,prjquota  0 2
sudo mount -o remount /srv/data

Ініціалізуйте облік квот (після першого вмикання):

sudo quotacheck -cugm /srv/data
sudo quotaon -v /srv/data

Налаштування користувацьких і групових квот

XFS (xfs_quota)

Приклади для каталогу /home і групи розробників:

# користувач alice: м'який ліміт 5G, жорсткий 6G
sudo xfs_quota -x -c 'limit bsoft=5G bhard=6G user alice' /home

# група devs: м'який 20G, жорсткий 25G
sudo xfs_quota -x -c 'limit bsoft=20G bhard=25G group devs' /srv/data

EXT4 (setquota/edquota)

Ті самі обмеження на /home та /srv/data:

# користувач alice (блокові ліміти), inode-ліміти 0 = без обмеження
sudo setquota -u alice 5G 6G 0 0 /home

# група devs
sudo setquota -g devs 20G 25G 0 0 /srv/data

Перевірити звіт по квотах:

sudo repquota -as

Проєктні квоти (каталоги) на XFS та EXT4

Проєктні квоти зручно обмежують цілі каталоги незалежно від власників файлів. Працює на XFS і EXT4 (з prjquota).

# 1) Описуємо каталог-проєкт у системних файлах
echo "1001:/srv/projects/projA" | sudo tee -a /etc/projects
echo "projA:1001" | sudo tee -a /etc/projid

# 2) Ініціалізуємо проєкт (встановлює projectID і спадкування)
sudo xfs_quota -x -c 'project -s projA' /srv/projects

# 3) Задаємо ліміти для проєкту projA (50G / 60G)
sudo xfs_quota -x -c 'limit -p bsoft=50G bhard=60G projA' /srv/projects

Для нових підкаталогів у projA ліміти успадковуються автоматично.

Автоматична перевірка та оповіщення

Зробимо невеликий інструмент: скрипт перевіряє квоти та, якщо знайдені перевищення (мітки «+» у звіті), надсилає e-mail і/або Telegram-сповіщення. Це класика про автоматизація задач і дуже зручно реалізується через cron та systemd timers.

1) Скрипт моніторингу квот

sudo tee /usr/local/sbin/quota-watch.sh >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

ADMIN_EMAIL="admin@example.com"      # змініть на свій e-mail
TELEGRAM_TOKEN=""                    # опціонально
TELEGRAM_CHAT_ID=""                  # опціонально

TS=$(date -Is)
REPORT=$(repquota -as 2>/dev/null || true)

# Шукаємо перевищення: позначки '+' у числах використання/лімітів
ISSUES=$(echo "$REPORT" | grep -E '[0-9]+[KMGTP]?\+' || true)

if [[ -z "$ISSUES" ]]; then
  exit 0
fi

SUBJ="[quota] Перевищення квот на $(hostname) @ $TS"
BODY="Виявлено перевищення квот (див. нижче):\n\n$REPORT"

# e-mail (mail/mailx/mailutils)
if command -v mail >/dev/null; then
  echo -e "$BODY" | mail -s "$SUBJ" "$ADMIN_EMAIL"
fi

# Telegram (якщо задані токен і чат)
if [[ -n "$TELEGRAM_TOKEN" && -n "$TELEGRAM_CHAT_ID" ]]; then
  MSG="$(printf '%s' "$SUBJ"; printf '\n'; printf '%s' "$ISSUES" | head -n 30)"
  curl -fsS -X POST \
    -H 'Content-Type: application/json' \
    -d "{\"chat_id\":\"$TELEGRAM_CHAT_ID\",\"text\":\"${MSG//"/\\"}\",\"disable_notification\":false}" \
    "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" >/dev/null || true
fi
EOF

sudo chmod +x /usr/local/sbin/quota-watch.sh

2) Запуск через cron

echo '15 * * * * root /usr/local/sbin/quota-watch.sh' | sudo tee /etc/cron.d/quota-watch
sudo systemctl restart cron 2>/dev/null || sudo systemctl restart crond 2>/dev/null || true

3) Або запуск через systemd timers

# unit
sudo tee /etc/systemd/system/quota-watch.service >/dev/null <<'EOF'
[Unit]
Description=Quota watch

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/quota-watch.sh
EOF

# timer (щогодини)
sudo tee /etc/systemd/system/quota-watch.timer >/dev/null <<'EOF'
[Unit]
Description=Run quota watch hourly

[Timer]
OnBootSec=5m
OnUnitActiveSec=1h
Persistent=true

[Install]
WantedBy=timers.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now quota-watch.timer

Альтернативні способи

  • edquota — інтерактивне редагування квот у вашому $EDITOR. Зручно, якщо ви любите ручне налаштування.
  • warnquota — відсилає e-mail користувачам, які перевищили квоту. Додайте у cron для щоденної розсилки.
  • Окремі FS: у Btrfs можна використовувати qgroup, але це інша історія.

GUI-спосіб (Webmin)

Якщо вам комфортніше в браузері, Webmin має модуль Disk Quotas.

  1. Встановіть Webmin (Debian/Ubuntu):
wget -qO - http://www.webmin.com/jcameron-key.asc | sudo apt-key add -
echo 'deb http://download.webmin.com/download/repository sarge contrib' | sudo tee /etc/apt/sources.list.d/webmin.list
sudo apt update && sudo apt install -y webmin
  1. Зайдіть на https://<IP>:10000 → System → Disk Quotas, оберіть файлову систему, увімкніть та задайте ліміти для користувачів/груп/проєктів.

FAQ

1) repquota показує «No filesystems with quotas»
Перевірте опції монтування у /etc/fstab (XFS: uquota/gquota/pquota; EXT4: usrquota/grpquota/prjquota). Перемонтуйте файлову систему.

2) EXT4: quotacheck дуже довго рахує
Це очікувано на великих томах при першій ініціалізації. Заплануйте поза піковими годинами або використайте «швидкі квоти» (mount з prjquota/usrquota/grpquota на сучасних ядрах).

3) «Operation not supported»/«XFS quota not enabled»
На XFS завжди потрібні опції uquota/gquota/pquota. Перевірте dmesg і /proc/mounts.

4) Проєктні квоти на EXT4 не працюють
Переконайтеся, що додано prjquota, встановлено свіжий пакет xfsprogs (утиліта xfs_quota потрібна навіть для EXT4), і каталог ініціалізований командою project -s.

5) Чи працюють квоти всередині Docker-контейнерів?
Зазвичай ні: overlay2 не використовує класичні квоти FS. Налаштовуйте квоти на хості або використовуйте інші механізми ізоляції/лімітів.

6) Як подивитися швидкий звіт по XFS?
Спробуйте: xfs_quota -x -c "report -h" /mountpoint.

Порада від Kernelka

Зробіть невеликий дашборд або текстовий звіт, який надсилається щотижня: це 10 хвилин праці та нуль сюрпризів. Для цього якраз ідеальні bash скрипти + автоматизація задач через cron та systemd timers. Так ви завжди бачитимете тенденції використання диска і встигатимете розширювати сховище завчасно 🚨

Підсумок

  • Увімкніть квоти у /etc/fstab (XFS: u/g/pquota; EXT4: usr/grp/prjquota).
  • Для EXT4 один раз запустіть quotacheck і quotaon.
  • Користувацькі/групові ліміти: xfs_quota (XFS) або setquota (EXT4).
  • Проєктні квоти: /etc/projects, /etc/projid та xfs_quota project/limit.
  • Автоматичні оповіщення: quota-watch.sh + cron або systemd timer.
  • GUI-альтернатива: Webmin Disk Quotas.