Утром открываешь терминал, пытаешься сохранить файл, и вдруг система выдает: "Disk quota exceeded". Работа встала. Что случилось? В многопользовательских Linux-системах каждому выделяется определенный лимит дискового пространства. Превысил его, и все: ни записать, ни создать новый файл не получится. Разберемся, как выбраться из этой ситуации и не попасть в нее снова.

Что происходит за кулисами квот

В университетских кластерах, на корпоративных серверах, в системах с NFS администраторы устанавливают квоты, чтобы один пользователь не мог захватить все доступное место. Квоты бывают двух видов. Soft limit действует как мягкое предупреждение: превысить можно, но система дает обычно семь дней на исправление, это называется grace period. Hard limit жесткий, абсолютный, как стена: достиг его, и дальше система просто откажет в записи.

Интересный момент: квоты контролируют не только объем данных в блоках (обычно 1 КБ каждый), но и количество файлов, которые называются inodes. Можно исчерпать лимит, создав тысячи мелких файлов размером в несколько байт каждый. Проверить это помогает команда df -i. Еще квоты могут быть групповыми: если ваши файлы принадлежат группе с ограничениями, превышение группового лимита тоже вызовет ошибку.

Бывает путаница: команда du показывает одно использование, а quota совсем другое. Почему? Возможно, какие-то процессы держат открытыми удаленные файлы, или таблица квот не обновлена после сбоя. В таких случаях администратор должен запустить quotacheck для пересчета, но обычный пользователь тут бессилен.

Первый шаг: узнать свои лимиты

Когда увидел ошибку, первым делом проверь текущее состояние квоты. Команда quota -s покажет информацию в читаемом виде:

quota -s

Вывод будет примерно таким: filesystem, space (сколько занято), quota (мягкий лимит), limit (жесткий лимит), grace (оставшееся время льготного периода), files (количество файлов), их квоты и лимиты. Если в столбце blocks стоит звездочка, квота превышена прямо сейчас.

Для группы используй:

quota -g -s

Более подробный отчет со всеми файловыми системами, даже где квоты не установлены:

quota -v -s

Если работаешь с NFS или удаленной файловой системой, можно указать конкретную точку монтирования, но иногда NFS не отвечает на запросы квот из-за настроек сервера. Тогда придется связаться с администратором.

Администраторы пользуются командой repquota -a для просмотра квот всех пользователей в системе. Она показывает, кто превысил лимиты (помечается плюсом), и помогает найти нарушителей быстро.

Где прячутся гигабайты: поиск с du

Команда du (disk usage) анализирует, сколько места занимают директории и файлы. Начни с домашней папки и посмотри на верхний уровень:

cd ~
du -h --max-depth=1 | sort -h

Флаг -h делает вывод понятным (100M, 2.5G вместо чисел в килобайтах), --max-depth=1 ограничивает глубину одним уровнем, а sort -h сортирует по размеру. Последние строки покажут самые тяжелые директории.

Скрытые файлы и папки (начинающиеся с точки) тоже могут занимать много места. Папка .cache хранит временные данные браузеров и программ, .local/share содержит данные приложений, .thumbnails держит превью изображений. Чтобы увидеть все, включая скрытое:

du -sh * .[!.]* 2>/dev/null | sort -hr | head -10

Конструкция .[!.]* захватывает скрытые элементы, 2>/dev/null убирает сообщения об ошибках доступа, head -10 показывает только десять самых крупных.

Альтернативный вариант для поиска больших директорий и файлов одновременно:

du -ahx . | sort -rh | head -10

Флаг -a включает в вывод отдельные файлы, не только папки, -x ограничивает поиск одной файловой системой (не уходит в примонтированные разделы), -rh сортирует в обратном порядке по размеру.

Точечный поиск: команда find

Когда нужно найти конкретные большие файлы, find незаменим. Поиск всех файлов крупнее 100 МБ в домашней директории:

find ~ -type f -size +100M -print

Чтобы увидеть размеры и отсортировать по убыванию:

find ~ -type f -size +100M -print | xargs ls -lh | sort -k5,5 -h -r | head

Эта конструкция передает найденные файлы в ls -lh для детального вывода, сортирует по пятой колонке (размер) в обратном порядке, показывает топ результатов.

Еще один способ с прямым выводом размера и пути:

find ~ -printf '%s %p\n' | sort -nr | head -10

Здесь %s это размер в байтах, %p путь к файлу, сортировка числовая в обратном порядке.

Флаг -xdev ограничивает поиск одним разделом, что критично для NFS или SMB клиентов:

find . -xdev -type f -size +100M -print

Для поиска файлов определенного возраста, например старше 30 дней:

find ~/logs -type f -mtime +30 -print

Удаление файлов: аккуратно, но решительно

Нашел крупные ненужные файлы? Удаляй обычным способом:

rm ~/путь/к/файлу

Если файл защищен правами и ты администратор:

sudo rm ~/путь/к/файлу

Парадоксальная ситуация: квота настолько превышена, что даже rm не работает, выдавая "Disk quota exceeded". Система требует места для записи метаданных операции удаления. Обходной путь, сначала обнули файл:

cat /dev/null > bigfile.dat
rm bigfile.dat

Первая команда не требует дополнительного места, записывает пустоту, освобождая пространство файла. После этого удаление пройдет успешно.

Автоматическое удаление через find (ОСТОРОЖНО, необратимо!):

find ~ -type f -size +500M -delete

Всегда сначала проверяй список с -print, прежде чем использовать -delete. Безопаснее через exec:

find ~ -type f -size +500M -exec rm {} \;

Или с подтверждением для каждого файла:

find ~ -type f -size +100M -ok rm {} \;

Для массового удаления мелких старых файлов (борьба с inode-квотой):

find ~/logs -type f -mtime +30 -delete

Продвинутые техники и инструменты

Интерактивный инструмент ncdu (NCurses Disk Usage) предоставляет удобный интерфейс прямо в терминале. Установи его через пакетный менеджер:

apt install ncdu

Запусти сканирование:

ncdu ~

Навигация стрелками, удаление клавишей d, сортировка по разным параметрам. Очень наглядно для разовой большой чистки.

Проверка inode-квот отдельно:

df -i

Если столбец IUse% близок к 100%, проблема в количестве файлов, а не в их размере.

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

edquota -u username

Откроется редактор (обычно vi), где можно изменить soft и hard лимиты для blocks и inodes.

Временное отключение квот (требует root):

quotaoff -vaug

Включение обратно:

quotaon -vaug

Пересчет квот после сбоя или размонтирования:

quotacheck -vug /home

Автоматическая отправка предупреждений пользователям о превышении квот (настраивается через warnquota в cron).

Профилактика: держать ситуацию под контролем

Регулярно очищай временные папки. Браузеры складируют кэш в ~/.cache, почтовые клиенты в ~/.thunderbird или ~/.evolution, среды разработки создают артефакты сборки. Загрузки в ~/Downloads забываются месяцами.

Проверяй использование раз в неделю:

du -sh ~/Downloads ~/.cache ~/.local/share | sort -h

Архивируй старые проекты и переноси на внешние носители. Сжатие текстовых логов через gzip уменьшает размер в пять-десять раз:

gzip ~/logs/*.log

Символические ссылки позволяют хранить данные в разделах без квот, сохраняя удобный доступ из домашней директории:

ln -s /data/projects ~/projects

Мониторинг через простой скрипт в cron для ежедневной проверки и уведомления при приближении к лимиту. Запиши в ~/.bashrc алиас для быстрой проверки:

alias checkquota='quota -s && du -sh ~ ~/.cache ~/Downloads'

Понимание структуры файловой системы и инструментов управления квотами превращает панику при виде "Disk quota exceeded" в рутинную задачу на пять минут. Главное держать систему в порядке, не накапливать мусор, и тогда квоты не станут препятствием в работе.