Почему в Linux может не создаваться файл, хотя место на диске есть?

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

Ответ

В Linux и Unix-подобных системах свободное дисковое пространство — не единственное условие для создания файла. С точки зрения DevOps и администрирования, основные причины следующие:

  1. Исчерпание inodes (df -i): Файловая система хранит метаданные каждого файла (имя, права, расположение данных) в структуре inode. Их количество фиксировано при создании ФС. Если inodes закончились, новые файлы создавать нельзя, даже при свободном месте. Частая проблема с файловыми системами, содержащими огромное количество мелких файлов (кэши, лог-файлы, Docker-образы).

  2. Дисковые квоты пользователя/группы: Администратор мог установить лимиты на дисковое пространство (quota) или количество файлов (inode quota) для конкретного пользователя. Проверить можно командой quota -vs.

  3. Отсутствие прав на запись: У процесса, пытающегося создать файл, нет прав w на целевую директорию.

  4. Read-only файловая система: ФС могла быть примонтирована в режиме ro из-за ошибок ядра или преднамеренно (например, для безопасности). Проверяется через mount | grep <точка_монтирования>.

  5. Файл открыт удаляющим процессом: Если файл был удален (rm), но какой-то процесс продолжает держать его дескриптор открытым, место на диске не освободится для системы, пока процесс не закроет файл. df покажет, что место занято. Найти такие файлы можно через lsof +L1.

Диагностика для DevOps-инженера:

# 1. Проверяем свободное место И inodes
$ df -h /var; df -i /var

# 2. Проверяем квоты для текущего пользователя
$ quota -vs

# 3. Ищем "зависшие" удаленные файлы
$ lsof +L1 | grep -i deleted

# 4. Проверяем права на директорию
$ ls -ld /path/to/directory