Почему нельзя записать файл, хотя команда df -h показывает свободное место в Linux?

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

Ответ

Свободное место для данных — не единственный лимит. Вот основные причины:

  1. Исчерпаны inodes. Каждый файл, директория или символьная ссылка занимает один inode. Если их нет, создать новый объект нельзя.

    • Проверка: df -i
    • Решение: Удалить множество мелких файлов или увеличить количество inodes при создании ФС (опция -N в mkfs).
  2. Дисковые квоты (quota) для пользователя/группы. Лимит может быть исчерпан, даже если в системе есть место.

    • Проверка: quota -vs или repquota -a
  3. Недостаточно места в конкретном слое OverlayFS. Частая проблема в Docker/контейнерах. Верхний writable-слой (обычно thin pool) может быть заполнен, хотя нижний read-only образ имеет свободное место.

    • Проверка в Docker: docker system df -v
  4. Права доступа. Отсутствие прав на запись (w) в целевой директории.

    • Проверка: ls -ld /path/to/dir и id
  5. Файловая система в режиме «только для чтения» (read-only). Может произойти из-за ошибок ФС или преднамеренной настройки.

    • Проверка: В выводе mount или cat /proc/mounts.
  6. Жёсткая ссылка на удалённый файл. Если на файл осталась жёсткая ссылка, место не освободится.

Алгоритм диагностики:

# 1. Проверить inodes
$ df -i /
# 2. Проверить квоты
$ quota -vs
# 3. Проверить права
$ ls -ld /target/path
# 4. Проверить, не заполнен ли отдельный слой (актуально для контейнеров)
$ docker ps -q | xargs docker inspect --format='{{.Id}} {{.GraphDriver.Data.WorkDir}}' | head -1
# 5. Проверить, не в read-only ли ФС
$ findmnt -n -o OPTIONS / | grep ro