Как бесплатно использовать Inode? - PullRequest
228 голосов
/ 17 марта 2009

У меня есть дисковод, на котором использование inode составляет 100% (с помощью команды df -i). Однако после существенного удаления файлов использование остается на 100%.

Какой правильный способ сделать это тогда?

Как это возможно, что диск с меньшим использованием дискового пространства может иметь более высокий уровень использования Inode, чем у дисковода с более высоким использованием дискового пространства?

Возможно ли, если я заархивирую много файлов, это уменьшит количество используемых инодов?

Ответы [ 12 ]

181 голосов
/ 22 февраля 2012

Если вам очень не повезло, вы использовали около 100% всех инодов и не можете создать скипет. Вы можете проверить это с помощью df -ih.

Тогда эта команда bash может вам помочь:

sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n

И да, это займет время, но вы можете найти каталог с наибольшим количеством файлов.

150 голосов
/ 17 марта 2009

Для диска довольно просто использовать большое количество inode, даже если диск не очень заполнен.

Inode выделяется для файла, поэтому, если у вас есть несколько миллиардов файлов, каждый по 1 байту, у вас закончатся inode задолго до того, как закончится диск.

Также возможно, что удаление файлов не уменьшит количество инодов, если файлы имеют несколько жестких ссылок. Как я уже сказал, inode принадлежат файлу, , а не записи каталога. Если с файлом связаны две записи каталога, удаление одной из них не освобождает индекс.

Кроме того, вы можете удалить запись каталога, но если запущенный процесс все еще имеет открытый файл, индекс не будет освобожден.

Моим первоначальным советом было бы удалить все файлы, которые вы можете, затем перезагрузить окно, чтобы убедиться, что не осталось процессов, удерживающих файлы открытыми.

Если вы это делаете, но у вас все еще есть проблема, сообщите нам.

Кстати, если вы ищете каталоги, которые содержат много файлов, этот скрипт может помочь:

#!/bin/bash
# count_em - count files in all subdirectories under current directory.
echo 'echo $(ls -a "$1" | wc -l) $1' >/tmp/count_em_$$
chmod 700 /tmp/count_em_$$
find . -mount -type d -print0 | xargs -0 -n1 /tmp/count_em_$$ | sort -n
rm -f /tmp/count_em_$$
63 голосов
/ 06 ноября 2015

У меня была ситуация, когда у меня не было inode, и я уже удалил все, что мог.

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361     11  100% /

Я нахожусь на Ubuntu 12.04LTS и не могу удалить старые ядра Linux, которые занимали около 400 000 inode, потому что apt был сломан из-за отсутствующего пакета. И я не смог установить новый пакет, потому что у меня не было inode, поэтому я застрял.

Я закончил тем, что удалил несколько старых ядер linux вручную, чтобы освободить около 10000 inode

$ sudo rm -rf /usr/src/linux-headers-3.2.0-2*

Этого было достаточно, чтобы затем позволить мне установить отсутствующий пакет и исправить мою apt

$ sudo apt-get install linux-headers-3.2.0-76-generic-pae

и затем удалите оставшиеся старые ядра Linux с помощью apt

$ sudo apt-get autoremove

сейчас все намного лучше

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361 434719   54% /
42 голосов
/ 12 декабря 2014

Мое решение:

Попробуйте найти, если это проблема с inode:

df -ih

Попробуйте найти корневые папки с большим количеством инодов:

for i in /*; do echo $i; find $i |wc -l; done

Попробуйте найти определенные папки:

for i in /src/*; do echo $i; find $i |wc -l; done

Если это заголовочные файлы linux, попробуйте удалить самый старый с помощью:

sudo apt-get autoremove linux-headers-3.13.0-24

Лично я переместил их в смонтированную папку (потому что для меня последняя команда завершилась неудачно) и установил последнюю с:

sudo apt-get autoremove -f

Это решило мою проблему.

9 голосов
/ 29 февраля 2016

У меня была такая же проблема, исправили, удалив каталоги сеансов php

rm -rf /var/lib/php/sessions/

Может быть меньше /var/lib/php5, если вы используете более старую версию php.

Воссоздайте его со следующим разрешением

mkdir /var/lib/php/sessions/ && chmod 1733 /var/lib/php/sessions/

Разрешение по умолчанию для каталога в Debian показывало drwx-wx-wt (1733)

1 голос
/ 17 августа 2016

Как уже говорилось ранее, файловая система может заканчиваться inode, если есть много маленьких файлов. Я предоставил некоторые средства для поиска каталогов, которые содержат большинство файлов здесь .

1 голос
/ 03 июня 2016

Вы можете использовать RSYNC, чтобы УДАЛИТЬ большое количество файлов

rsync -a --delete blanktest/ test/

Создайте пустую папку с 0 файлами в ней, и команда синхронизирует ваши тестовые папки с большим количеством файлов (я удалил почти 5 миллионов файлов, используя этот метод).

Благодаря http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux

1 голос
/ 01 апреля 2016

Недавно мы столкнулись с подобной проблемой. В случае, если процесс ссылается на удаленный файл, Inode не должен освобождаться, поэтому вам нужно проверить lsof /, и kill / restart процесса освободит inode.

Поправь меня, если я здесь не прав.

1 голос
/ 12 ноября 2014

Мы столкнулись с этим в учетной записи HostGator (которая устанавливает ограничения inode для всех своих хостингов) после спам-атаки. Он оставил огромное количество записей очереди в /root/.cpanel/comet. Если это произойдет, и вы обнаружите, что у вас нет свободных инодов, вы можете запустить эту утилиту cpanel через shell:

/usr/local/cpanel/bin/purge_dead_comet_files
1 голос
/ 02 апреля 2013

eaccelerator может быть причиной проблемы, поскольку он компилирует PHP в блоки ... У меня была эта проблема с сервером Amazon AWS на сайте с большой нагрузкой. Освободите Inode, удалив кэш eaccelerator в / var / cache / eaccelerator, если у вас по-прежнему возникают проблемы.

rm -rf /var/cache/eaccelerator/*

(или любой другой каталог кеша)

...