Почему при доступном месте на диске файлы не создаются?

«Почему при доступном месте на диске файлы не создаются?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Linux и Unix-системах есть несколько причин, по которым запись файла может завершиться ошибкой No space left on device, несмотря на наличие свободного места. Вот основные из них:

  1. Исчерпаны inodes (df -i). Файловая система хранит метаданные каждого файла (имя, права, расположение данных) в структурах, называемых inodes. Если они закончились, создать новый файл нельзя, даже если есть свободные блоки данных. Частая проблема с каталогами, содержащими огромное количество мелких файлов.
  2. Ограничения прав доступа. У пользователя или процесса может не быть прав на запись (w) в целевую директорию. Проверяется командой ls -ld /path/to/dir.
  3. Дисковые квоты (disk quota). Для пользователя или группы может быть установлен и исчерпан лимит на использование дискового пространства или число inodes. Проверить можно командой quota -vs или repquota.
  4. Блокировка со стороны SELinux/AppArmor. Мандатные системы безопасности могут запрещать процессу запись в определенные локации. Проверьте журналы (/var/log/audit/audit.log для SELinux, journalctl для systemd).
  5. Файловая система смонтирована в режиме только для чтения (ro). Проверьте mount | grep 'on /path/to/mount'.
  6. Исчерпано пространство для 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.