Сообщить об ошибке.

Ограничение использования диска disk quota в Linux

Содержание:

Disk quota - это механизм ядра Linux, позволяющий ограничивать использование дискового пространства на уровне файловой системы. Она может:

  • Ограничивать объём данных, который может использовать пользователь или группа.
  • Контролировать количество файлов (inodes).
  • Задавать мягкие (soft) и жёсткие (hard) лимиты.
  • Уведомлять пользователей о приближении к лимиту.

Похоже на "тарифный план" для пользователей:
"Вы можете использовать до 10 ГБ, а если превысите - получите предупреждение или блокировку".

Возможности quota

ФункцияОписание
User quotaОграничение на пользователя
Group quotaОграничение на группу
Soft limitМягкий лимит: можно превысить на время (с grace period)
Hard limitЖёсткий лимит: нельзя превысить ни при каких условиях
Block quotaОграничение по объёму (в килобайтах)
Inode quotaОграничение по количеству файлов

Как включить и настроить quota

Шаг 1: Установка пакетов

Установка Ubuntu/Debian:

sudo apt install quota quotatool -y

Установка CentOS/RHEL/Fedora:

sudo yum install quota -y
# или
sudo dnf install quota -y

quotatool - удобная утилита для управления лимитами.

Шаг 2: Включение поддержки quota в /etc/fstab

Открой файл:

sudo nano /etc/fstab

Найди строку с нужной файловой системой, например:

/dev/sda1  /home  ext4  defaults  0  2

Добавь опции:

/dev/sda1  /home  ext4  defaults,usrquota,grpquota  0  2
  • usrquota - включает пользовательские квоты
  • grpquota - включает групповые квоты

Обычно квоты включают на /home, /var, или отдельный раздел.

Шаг 3: Перемонтирование раздела

sudo mount -o remount /home

Шаг 4: Создание файлов квоты

sudo quotacheck -cug /home
  • -c - создать новые файлы
  • -u - пользовательские квоты
  • -g - групповые квоты

Создастся:

  • aquota.user - для пользователей
  • aquota.group - для групп

На XFS используй xfs_quota - отличается синтаксис.

Шаг 5: Включить квоты

sudo quotaon /home

Проверить:

sudo quotaon -p /home

Установка лимитов на дисковое пространство

Например, выделим пользователю alice лимит 5 ГБ файлового пространства на сервере

sudo edquota -u alice

Когда запускаем команду edquota -u username или смотрим repquota, то видим такую таблицу:

Filesystem   blocks   soft   hard   inodes   soft   hard
/dev/sda1    123456   4000000  5000000   800      0       0

Расшифровка таблицы

КолонкаЧто означает
FilesystemНа каком разделе действует квота
blocksСколько КБ уже используется
soft (1)Мягкий лимит по объёму (в КБ)
hard (1)Жёсткий лимит по объёму (в КБ)
inodesСколько файлов уже создано
soft (2)Мягкий лимит по количеству файлов
hard (2)Жёсткий лимит по количеству файлов

Группа 1: Ограничение по дисковому пространству (в блоках)

ПолеЗначениеОписание
blocks123456Сколько килобайт сейчас использует пользователь
soft4000000Мягкий лимит - 4 ГБ (в килобайтах)
hard5000000Жёсткий лимит - 5 ГБ (в килобайтах)

1 блок = 1 КБ - это единица измерения в системе квот (не путать с блоками ФС).
То есть:

  • 4000000 блоков = 4 000 000 КБ ≈ 4 ГБ
  • 5000000 блоков = 5 000 000 КБ ≈ 5 ГБ

Группа 2: Ограничение по количеству файлов (inodes)

ПолеЗначениеОписание
inodes800Сколько файлов и директорий пользователь создал
soft0Мягкий лимит на количество inodes (0 = не ограничен)
hard0Жёсткий лимит на количество inodes (0 = не ограничен)

Пример: полная настройка для пользователя alice

Хочу, чтобы alice:

  • Могла использовать до 4 ГБ (мягко) и не более 5 ГБ (жёстко)
  • Могла создать до 10 000 файлов (мягко) и не более 12 000 (жёстко)

Шаг 1: Запускаем редактор

sudo edquota -u alice

Шаг 2: Вводим значения

Disk quotas for user alice (uid 1001):
  Filesystem  blocks   soft   hard   inodes   soft   hard
  /dev/sda1   0        4000000  5000000   0       10000   12000

Разбор:

  • blocks: 0 - сейчас ничего не использует
  • soft: 4 000 000 КБ = 4 ГБ
  • hard: 5 000 000 КБ = 5 ГБ
  • inodes: 0 - пока нет файлов
  • soft: 10 000 - мягкий лимит на количество файлов
  • hard: 12 000 - жёсткий лимит на количество файлов

Что будет, если alice превысит лимит?

Превысила soft limit по диску (4 ГБ):

  • Можно писать ещё, но система начнёт предупреждать при входе:
    Warning: You are over quota...
  • Есть grace period (например, 3 дня), чтобы освободить место.
  • После grace period - запись заблокирована, пока не станет ≤ 4 ГБ.

Превысила hard limit (5 ГБ):

  • Нельзя писать ни при каких условиях - даже если grace period не кончился.
  • Ошибка: No space left on device (даже если место есть у других).

Превысила inodes (12 000 файлов):

  • Нельзя создавать новые файлы, даже если диск пуст.
  • Ошибка: Disk quota exceeded или No space left on device.

Альтернатива: setquota (без редактора)

Гораздо понятнее и удобнее для скриптов.

sudo setquota -u alice \
  4000000 5000000 \    # soft и hard по блокам (в КБ)
  10000   12000 \      # soft и hard по inodes
  /home

Как посмотреть, сколько пользователь уже использует?

# Показать квоту текущего пользователя
quota

# Показать всех пользователей
repquota /home

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

User            usage   limit   limit   time left  count   limit   limit
                blocks                inodes
alice           3.2G    4.0G    5.0G               8500    10000   12000

Советы

  • Используй setquota вместо edquota, если не любишь vi.
  • Устанавливай soft + grace period - это дружелюбнее к пользователям.
  • Не забывай про inodes - можно "забить" диск миллионом мелких файлов, даже если объём мал.
  • Проверяй: repquota -a - лучший способ увидеть всё сразу.

Проверка квот

Для пользователя:

quota -u alice

Для текущего пользователя:

quota

Для всех на смонтированный раздел:

repquota /home

Grace period (период льготы)

Если пользователь превысил soft limit, у него есть время (по умолчанию 7 дней), чтобы освободить место.

Команда:

sudo edquota -t

Открывает редактор для настройки grace period (льготного периода) времени, в течение которого пользователь может превышать soft limit, не получая ошибки записи.

Grace period действует только для soft limit.
Как только grace period истекает - пользователь не сможет писать, пока не освободит место.

Пример: Установить grace period в 3 дня

Запусти команду

sudo edquota -t

Откроется редактор (обычно vi, но может быть nano, зависит от системы).

Видишь примерно такой текст:

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/sda1              7days                  7days

Измени значения на 3 дня. Измени строки:

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/sda1              3days                  3days

Ты просто меняешь 7days на 3days
Можно писать: 3 days, 3day, 3d - но лучше 3days (без пробела, как в оригинале)

Сохрани и выйди

Если используется vi (стандартный редактор):

  1. Нажми Esc
  2. Введи :wq и нажми Enter => сохранит и выйдет

Если используется nano:

  1. Нажми Ctrl+O => Enter (сохранить)
  2. Ctrl+X => выйти

Что изменилось? Теперь:

  • Если пользователь превысит soft limit по диску - у него будет 3 дня, чтобы исправиться.
  • После 3 дней - система заблокирует запись, пока он не удалит файлы и не вернётся в лимит.
  • То же самое для inodes (если установлен soft limit на количество файлов).

Проверка: посмотри текущие grace period

sudo quota -T

Или просто:

repquota -a

Вывод будет включать grace period:

Block grace time: 3days; Inode grace time: 3days

Альтернатива: команда setquota -t

Можно задать grace period без редактора:

sudo setquota -t 3days 3days /home

Формат:

setquota -t <block_grace> <inode_grace> <filesystem>

Это намного проще и понятнее, особенно в скриптах.

Настройка grace period в 3 дня через setquota
# Установить grace period 3 дня для блоков и inodes на /home
sudo setquota -t 3days 3days /home

Проверка:

repquota -a

Вывод команды:

Block grace time: 3days; Inode grace time: 3days

Итог по установке grace period

ЧтоКак
Редактировать grace periodsudo edquota -t
Где менять?В строке Block grace period и Inode grace period - меняй 7days на 3days
Сохранить в viEsc => :wq => Enter
Сохранить в nanoCtrl+O, Enter, Ctrl+X
Проще - без редактораsudo setquota -t 3days 3days /home

Рекомендация Используй setquota -t - он проще, понятнее и не зависит от редактора.

Отключение квот

sudo quotaoff /home

Особенности XFS

На XFS используется xfs_quota, а не классические quota:

xfs_quota -x -c 'limit bsoft=4g bhard=5g alice' /home
xfs_quota -c 'report' /home

xfs_quota - отдельная система, но цель та же.

Полезные команды - шпаргалка

КомандаНазначение
quotaon /dirВключить квоты
quotaoff /dirВыключить
quotacheck -cug /dirПроверить и создать файлы квоты
edquota -u userРедактировать квоту пользователя
setquota user soft hard isoft ihard /dirУстановить квоту
quotaПоказать свою квоту
repquota /dirОтчёт по всем квотам
xfs_quotaДля XFS

Советы

  • Используй quota на /home, /var, или выделенных разделах.
  • Давай soft limit + grace period - чтобы пользователи могли исправиться.
  • Регулярно проверяй: repquota /home
  • Настрой уведомления (можно скриптом).
  • Не включай на корне /, если не уверен - лучше выделить отдельный раздел.