На сервере в Linux свободное место есть, а записать ничего нельзя
На VPS при создании бэкапов в консоли появилась ошибка errno: 28 «No space left on device» — закончилось свободное место корневого раздела сервера.
При тестовом копировании новых файлов на сервер вручную через sftp, выводятся похожие ошибки о недостаточности места на диске.
Почему так происходит?
Проблема заключается в том, что на файловой системе раздела сервера закончились файловые дескрипторы (inode). Любая файловая система vfat, ext3, ext4 и т.д. имеет ограниченное количество файлов на определенный размер. У файловой системы XFS нет статического количества inode. В ней количество inode динамическое. При выборе файловой системы для проекта нужно тщательно взвешивать все плюсы и минусы.
Inode – это часть раздела ФС, хранящая данные о файле или директории: имя, дата создания, дата доступа, дата модификации, права доступа и т.д. Количество inode на 1Гб практически у всех файловый систем – это постоянная величина.
Чтобы посмотреть сколько inode есть у определенного раздела:
sudo tune2fs -l /dev/sda2 | grep "Inode count"
Inode count: 1294896
В примере это чуть меньше 1.3M.
Как увидеть проблему?
Чтобы увидеть общую картину:
df -hi
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 244K 319 244K 1% /dev
tmpfs 248K 398 248K 1% /run
/dev/sda2 1.3M 1.3M 0 0% /
tmpfs 248K 1 248K 1% /dev/shm
tmpfs 248K 2 248K 1% /run/lock
tmpfs 248K 17 248K 1% /sys/fs/cgroup
/dev/sda1 0 0 0 - /boot/efi
tmpfs 248K 10 248K 1% /run/user/1000
Отсюда видно, что всего у раздела 1.3M inode. Из них все заняты.
Как освободить inode в Linux?
inode — это не кэш. Его нельзя просто взять и очистить. Можно только удалить файлы, которые не нужны и больше не используются. Можно вывести список директорий, использующих максимальное количество inode раздела. Для этого в корневой директории раздела выполняем команду:
find / -type d -size +4096 -exec sh -c " ls -d {} && ls {} | wc -l" \;
/var/www/site.ru/sessions
600000
/var/www/site2.ru/sessions
500000
Получается, что 1.1М inode — это файлы php-сессий, которые просто так «захламляют» наш диск. Почему-то сборщик мусора php-сессий их не убрал.
Чтобы очистить директории вручную, выполняем последовательно команды:
find /var/www/site.ru/sessions -type f -delete
find /var/www/site2.ru/sessions -type f -delete
Многие хостеры специально уменьшают количество inode на диске, чтобы заставить клиента перейти на более дорогой тариф. Хорошие хостеры так не делают. Для файловой системы ext4 считается нормой на каждый 1Гб емкости раздела использовать >60K inode. Если у Вашего хостинга меньше, то делайте выводы.
Теги: bash