Утром открываешь терминал, пытаешься сохранить файл, и вдруг система выдает: "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" в рутинную задачу на пять минут. Главное держать систему в порядке, не накапливать мусор, и тогда квоты не станут препятствием в работе.