opened image

Дисковые квоты на Linux: контроль использования дискового пространства

 

Без квот один пользователь или процесс может занять всё дисковое пространство и положить систему. На веб-серверах с несколькими клиентами, почтовых серверах и файловых хранилищах квоты - обязательный инструмент администратора.

 

Среда: Ubuntu 22.04 LTS, файловая система ext4, раздел /home.

 

 

1. Установка утилит quota

 

sudo apt update
sudo apt install quota quotatool -y

# Проверяем версию
quota --version
# Quota utilities version 4.06

 

 

2. Включение квот в файловой системе

 

Квоты нужно активировать на уровне файловой системы. Для этого добавляем опции монтирования в /etc/fstab.

 

Смотрим текущий /etc/fstab:

cat /etc/fstab

 

Находим строку с нужным разделом (например /home):

UUID=abc123... /home ext4 defaults 0 2

 

Меняем defaults на defaults,usrquota,grpquota:

UUID=abc123... /home ext4 defaults,usrquota,grpquota 0 2

 

Перемонтируем раздел без перезагрузки:

sudo mount -o remount /home

# Проверяем, что опции применились
mount | grep /home
# /dev/sda2 on /home type ext4 (rw,relatime,usrquota,grpquota)

 

 

 

 

3. Создание файлов базы квот

 

# Создаём файлы quota.user и quota.group на разделе
sudo quotacheck -ugm /home

# Проверяем созданные файлы
ls -la /home/aquota.*
# -rw------- 1 root root 8192 May 22 10:00 /home/aquota.group
# -rw------- 1 root root 8192 May 22 10:00 /home/aquota.user

 

Флаги quotacheck:

  • -u - создать файл квот для пользователей

  • -g - создать файл квот для групп

  • -m - не размонтировать раздел (для корневого FS)

 

# Включаем квоты
sudo quotaon -v /home
# /dev/sda2 [/home]: group quotas turned on
# /dev/sda2 [/home]: user quotas turned on

 

 

4. Установка квот для пользователя

 

Команда edquota открывает редактор (по умолчанию nano или vi) с текущими настройками квоты:

 

sudo edquota -u username

 

Содержимое файла квоты:

Disk quotas for user username (uid 1001):
  Filesystem    blocks   soft   hard   inodes   soft   hard
  /dev/sda2      4096    0      0      100      0      0

 

Меняем нули на лимиты:

Disk quotas for user username (uid 1001):
  Filesystem    blocks    soft      hard    inodes   soft   hard
  /dev/sda2      4096     512000   614400    0        0      0

 

Здесь:

  • blocks - текущее использование (в KB для ext4)

  • soft - мягкий лимит: 512 000 KB = 500 MB. Пользователь получает предупреждение, но может превысить его на время grace period (по умолчанию 7 дней)

  • hard - жёсткий лимит: 614 400 KB = 600 MB. Превысить нельзя никак

  • inodes - количество файлов (0 = без ограничений)

 

Сохраняем и выходим из редактора.

 

 

 

5. Копирование квот между пользователями

 

Если нужно установить одинаковые квоты для 20 пользователей, копируем настройки от одного к остальным:

 

# Копируем квоту пользователя template_user на user1, user2, user3
sudo edquota -p template_user user1 user2 user3

# Или копируем на всех пользователей из файла
cat users.txt | xargs sudo edquota -p template_user

 

 

6. Установка квот для группы

 

Групповые квоты суммируют использование всех членов группы:

 

sudo edquota -g groupname
Disk quotas for group groupname (gid 1002):
  Filesystem    blocks    soft       hard    inodes   soft   hard
  /dev/sda2      8192     2048000   2457600   0        0      0

 

Здесь группе выделено 2 GB (soft) и 2.4 GB (hard).

 

 

7. Настройка grace period

 

Grace period - время, в течение которого пользователь может превышать мягкий лимит. По умолчанию 7 дней для блоков и 7 дней для inodes.

 

sudo edquota -t
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem    Block grace period   Inode grace period
  /dev/sda2     3days                7days

 

Меняем на 3 дня для блоков. После grace period запись новых данных блокируется, даже если жёсткий лимит не достигнут.

 

 

8. Мониторинг через repquota

 

repquota выводит отчёт об использовании квот для всего раздела:

 

# Отчёт по пользователям
sudo repquota -u /home

# Отчёт по группам
sudo repquota -g /home

# Все разделы с включёнными квотами
sudo repquota -au

 

Пример вывода:

*** Report for user quotas on device /dev/sda2
Block grace time: 3days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --    4096       0       0           126     0     0
alice     --   98304  512000  614400            2041    0     0
bob       +-  498688  512000  614400  2days     8192    0     0
charlie   ++  602112  512000  614400            9856    0     0

 

Символы в колонке статуса:

  • -- - в пределах мягкого лимита

  • +- - превышен мягкий лимит, идёт отсчёт grace period

  • ++ - превышен мягкий лимит, grace period истёк (запись заблокирована)

 

 

 

 

9. Просмотр квоты конкретного пользователя

 

# Пользователь может сам посмотреть свою квоту
quota -v

# Администратор смотрит квоту любого пользователя
sudo quota -v username

# Вывод:
# Disk quotas for user alice (uid 1001):
#   Filesystem   blocks   quota   limit   grace   files   quota   limit   grace
#   /dev/sda2    98304   512000  614400            2041       0       0

 

 

 

10. Автоматическое включение квот при загрузке

 

Если quotaon -v /home выполнен вручную, квоты останутся включёнными после перезагрузки только если файловая система смонтирована с опциями usrquota,grpquota в /etc/fstab. На современных системах этого достаточно - systemd автоматически запускает quotaon при монтировании.

 

Проверяем после перезагрузки:

sudo reboot
# После перезагрузки:
sudo quotaon -p /home
# group quota on /home (/dev/sda2) is on
# user quota on /home (/dev/sda2) is on

 

 

Итог

 

Дисковые квоты на Linux настраиваются через три шага: добавить опции usrquota,grpquota в /etc/fstab, создать файлы базы квот через quotacheck, установить лимиты через edquota. Ключевое различие мягкого и жёсткого лимита: soft даёт временное превышение (grace period), hard блокирует запись немедленно. Для регулярного мониторинга запускайте repquota -au через cron и отправляйте вывод на почту администратора - так вы увидите приближение к лимитам до того, как сервер начнёт отказывать в записи.