Почему возникает ошибка «нет места» при создании файла в Linux, хотя место на диске есть?

Ответ

В Linux ошибка No space left on device (ENOSPC) может возникать даже при наличии свободного места на диске. Основные причины, с которыми я сталкивался:

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

# Проверка использования inodes
df -i /path/to/filesystem
# Решение: найти и удалить множество мелких файлов (часто в /tmp, кэшах или логах).
find /path -xdev -type f | wc -l  # Оценка количества файлов

2. Дисковые квоты пользователя или группы Система может ограничивать объем дискового пространства или число inodes для конкретного пользователя.

# Проверка квот (если включены)
quota -vs <username>
repquota -a

3. Ограничения на уровне каталога

  • Атрибут immutable: Файл или каталог защищен от любых изменений.
    lsattr /path/to/directory
    # Если стоит флаг 'i', снять его можно так (требует прав root):
    chattr -i /path/to/directory
  • Недостаточные права на запись: Убедитесь, что у пользователя есть право w на целевой каталог.

4. Файловая система смонтирована в режиме "только для чтения" (read-only) Это может произойти из-за ошибок файловой системы, которые ядро автоматически обрабатывает, перемонтируя раздел в ro для предотвращения повреждения данных.

mount | grep "on /path"
# Решение: проверить журналы ядра (`dmesg | tail`) на наличие ошибок FS и, если возможно, перемонтировать в rw.
mount -o remount,rw /path

Для DevOps: Эта проблема часто возникает на серверах с высоким оборотом мелких файлов (логи приложений, кэши, временные файлы CI/CD). Решением является мониторинг не только свободного места, но и использования inodes, а также настройка log rotation и очистки кэшей.

Ответ 18+ 🔞

Э, слушай, история классическая, просто пиздец. Сидишь ты такой, места на диске — овердохуища, а система орёт, что места нет. Какого хуя, правда? Ну, держись, щас разложу по полочкам, почему эта сука так себя ведёт.

1. Кончились inodes — самая популярная подстава. Представь, что диск — это шкаф с ящиками (inodes). В каждом ящике лежит карточка на один файл. Место в шкафу (данные) есть, а вот свободных ящиков (inodes) — ноль. Новую карточку положить некуда, вот система и матерится No space left. Часто бывает, когда накопилось дохуя мелких файликов — логов, кэшей, какого-то мусора.

# Смотри, не обманывает ли тебя система
df -i /path/to/filesystem
# Если inodes 100% used — всё, пиши пропало. Надо искать, где навалили этого мелкого дерьма.
find /path -xdev -type f | wc -l  # Посчитай, сколько там всего файлов, сам офигеешь.

2. Квоты — когда тебя по рукам бьют. Админ мог наставить ограничений: мол, тебе, Вася, только 10 гигов и всё. Или не больше миллиона файлов. Ты вроде и не использовал все гиги, но лимит по количеству файлов (inodes) исчерпал — и привет.

# Глянь, не обложили ли тебя квотами
quota -vs <username>
repquota -a

3. Защита от дурака (или от тебя).

  • Файл или папка в атрибуте immutable. Это как приковать цепью. Ни удалить, ни создать ничего внутри нельзя.
    lsattr /path/to/directory
    # Увидишь букву 'i' — вот он, корень зла. Сносить надо от рута:
    chattr -i /path/to/directory
  • Простейшее — нет прав на запись. Но тут уж, чувак, сам разберёшься.

4. ФС ушла в режим read-only — привет, паника. Ядро, если чувствует, что с диском что-то не так (ошибки, кривые сектора), может перемонтировать раздел в режим «только чтение», чтобы совсем не угробить данные. Записывать, естественно, нельзя. Волнение ебать!

mount | grep "on /path"
# Смотри логи (`dmesg | tail`), ищи ошибки. Если повезёт, и диск живой, попробуй вернуть режим записи:
mount -o remount,rw /path

Для DevOps-ов, которые постоянно в этом живут: Тут, бля, доверия ебать ноль к логгерам и кэшам. Мониторь не только гигабайты, но и эти ёбаные inodes (df -i)! Автоматизируй ротацию логов, чисти кэши, не доводи до ручки, а то в один прекрасный день продакшн накроется медным тазом из-за какой-то мартышлюшки-системы, которая забила /tmp миллионами временных файлов.