Ответ
В Linux и Unix-системах есть несколько причин, по которым запись файла может завершиться ошибкой No space left on device, несмотря на наличие свободного места. Вот основные из них:
- Исчерпаны inodes (
df -i). Файловая система хранит метаданные каждого файла (имя, права, расположение данных) в структурах, называемых inodes. Если они закончились, создать новый файл нельзя, даже если есть свободные блоки данных. Частая проблема с каталогами, содержащими огромное количество мелких файлов. - Ограничения прав доступа. У пользователя или процесса может не быть прав на запись (
w) в целевую директорию. Проверяется командойls -ld /path/to/dir. - Дисковые квоты (disk quota). Для пользователя или группы может быть установлен и исчерпан лимит на использование дискового пространства или число inodes. Проверить можно командой
quota -vsилиrepquota. - Блокировка со стороны SELinux/AppArmor. Мандатные системы безопасности могут запрещать процессу запись в определенные локации. Проверьте журналы (
/var/log/audit/audit.logдля SELinux,journalctlдля systemd). - Файловая система смонтирована в режиме только для чтения (ro). Проверьте
mount | grep 'on /path/to/mount'. - Исчерпано пространство для LVM-метаданйных областей (для LVM).
Пример диагностики:
# 1. Проверяем свободное место и inodes
$ df -h /var/log # Проверка свободного места
$ df -i /var/log # Проверка свободных inodes
# 2. Проверяем права на директорию
$ ls -ld /var/log/myapp
# drwxr-xr-x 2 root root 4096 ... /var/log/myapp
# Если у вашего пользователя нет 'w' (записи), файл создать не получится.
# 3. Проверяем квоты (если включены)
$ quota -vs
Решение: В зависимости от причины — очистка старых файлов, увеличение квот, изменение прав или политик SELinux.