No space left on device (ENOSPC) намертво останавливает запись: перестают писаться логи, падают базы данных и установка пакетов, а сайт нередко отдаёт 500 Internal Server Error (англ.) раньше, чем кто-нибудь увидит само сообщение. Обычно диск действительно заполнен, но есть ещё две коварные причины, которые дают ту же ошибку, когда свободными числятся гигабайты: закончились иноды или большой файл удалён, но всё ещё открыт процессом. Проверьте все три.
На сервере с русской локалью утилиты пишут то же самое по-русски, например cp: ошибка записи 'backup.tar': На устройстве не осталось свободного места. На большинстве серверов локаль английская, поэтому чаще встречается исходный текст. Причины и решения от языка не зависят.
1. Диск действительно заполнен?
df -h # ищите точку монтирования с 100% в колонке Use%
df -i # заполнение инодов — 100% здесь тоже даёт ENOSPCВ русской локали колонка Use% называется Использовано%, а у df -i — IИспользовано%. Если df -h показывает 100%, найдите самых крупных потребителей:
sudo du -xh / 2>/dev/null | sort -rh | head -20
# быстрее и нагляднее, если установлен:
sudo ncdu /Не удивляйтесь, если Use% показывает 100%, хотя разница между Size и Used — ещё несколько процентов раздела. На ext4 по умолчанию 5% блоков зарезервировано для root: процессы обычных пользователей уже получают ENOSPC, а root ещё может писать. Этот запас нужен, чтобы службы, работающие от root, например демон системного журнала, не останавливались, а вы могли войти и почистить диск. Посмотреть резерв можно так:
sudo tune2fs -l "$(findmnt -no SOURCE /)" | grep -iE '^(reserved block count|block count)'На корневом разделе резерв лучше не трогать. На отдельном разделе с данными его можно уменьшить, например до 1%: sudo tune2fs -m 1 /dev/sdb1 (подставьте свой раздел из вывода df -h). Это разовый выигрыш места, а не замена уборке.
2. Обычные пожиратели места
# кеш apt
sudo apt clean
# старые логи journald — ограничьте их 200 МБ
sudo journalctl --vacuum-size=200M
# ротированные логи
sudo find /var/log -type f -name "*.gz" -delete
# неиспользуемые слои Docker (бывают огромными)
docker system prune -afПеред чисткой Docker посмотрите, что именно занимает место: docker system df показывает объём образов, контейнеров, томов и кеша сборки. Учтите, что docker system prune -af удаляет все остановленные контейнеры, все образы, которые не использует ни один контейнер, неиспользуемые сети и кеш сборки — образы потом придётся скачивать или собирать заново. Тома без флага --volumes он не трогает.
3. Место есть, а ENOSPC всё равно: иноды
Миллионы мелких файлов (кеш сессий, почтовые очереди) исчерпывают иноды, хотя байты ещё остаются. Если df -i показывает 100%, найдите каталог с наибольшим числом файлов и очистите его:
for d in /var/*; do echo "$(sudo find "$d" 2>/dev/null | wc -l) $d"; done | sort -rn | head4. Место есть, а диск полон: удалённый, но открытый файл
Служба, которая пишет в лог, уже удалённый через rm, удерживает его место, пока не закроет файл. В этом случае df и du расходятся. Найдите такой файл:
sudo lsof +L1 | sort -k7 -rn | head
# перезапустите службу-владельца или обнулите файл на лету:
sudo truncate -s 0 /proc/<PID>/fd/<FD>Полный /boot — единственный случай, последствия которого могут пережить уборку: обновление ядра, которому там не хватило места, оставляет недописанный initramfs, и следующая загрузка не проходит. Если после заполнения диска сервер начал перезагружаться или останавливаться при загрузке, читайте VPS постоянно перезагружается (англ.).
В перспективе: больше диска
Если уборка выигрывает лишь несколько дней, диск мал для вашей нагрузки. Серверы VMHeaven работают на NVMe корпоративного класса с репликацией, а тариф можно повысить в личном кабинете — объём с запасом под логи и данные смотрите в линейке Standard KVM. Если не хватает только диска, а CPU и RAM в порядке, блоки хранилища добавляют по 15 ГБ за 1,00 € в месяц прямо из панели, пока сервер продолжает работать; после этого расширьте раздел и файловую систему, чтобы ОС увидела новое место.
Частые вопросы
Что значит «На устройстве не осталось свободного места»?
Это русский текст системной ошибки No space left on device (ENOSPC): файловая система не может выделить место под запись. Причин три: диск действительно заполнен (проверьте df -h), закончились иноды (df -i) или место держит удалённый, но ещё открытый файл (sudo lsof +L1).
df показывает свободное место, а ошибка остаётся — почему?
Чаще всего закончились иноды: их показывает df -i. Вторая причина — процесс держит открытым удалённый файл, и место освободится, только когда его перезапустят или обнулят файл через /proc/<PID>/fd/<FD>. Если ошибку получает не root, а у root запись проходит, упёрлись в резерв ext4: по умолчанию 5% раздела доступны только root.
Как найти, что занимает место, и что можно удалить в первую очередь?
Самые большие каталоги покажет sudo du -xh / | sort -rh | head -20 или ncdu. Безопасно удалять кеши и логи: sudo apt clean, sudo journalctl --vacuum-size=200M, старые *.gz в /var/log и неиспользуемые данные Docker через docker system prune -af (он удалит и остановленные контейнеры). Не трогайте /var/lib с базами данных и /boot.