Как бесплатно использовать Inode?

276

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

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

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

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

neversaint
источник
4
Хочу дать вам 50 баллов за этот вопрос. Как я могу сделать! :)
Софи
@ Софи Не делай этого. вы будете автоматически забанены
Стивен Лу
1
@StevenLu Спасибо за вашу информацию! Я хочу отдать ему должное, потому что я потратил несколько дней, чтобы решить мою проблему. Но эта проблема может помочь мне. Еще раз спасибо,
Софи
1
@ Софи: зачем награждать что-то не по теме для SO? :) Это определенно не вопрос программирования, независимо от того, сколько голосов он получает.
Дзынь
Пустые каталоги также потребляют inode. Удаление их может освободить некоторые inode. Число может быть значительным в некоторых случаях использования. Вы можете удалить пустые каталоги с помощью: найти. -типа d -empty -delete
Ручит Патель

Ответы:

171

Для диска довольно легко использовать большое количество 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_$$
paxdiablo
источник
12
Конечно, это >/tmp/count_em_$$будет работать, только если у вас есть место для этого ... если это так, см. Ответ @ simon.
alxndr
1
@alxndr, поэтому часто неплохо хранить отдельные файловые системы - таким образом, заполнение чего-то подобного /tmpне повлияет на другие ваши файловые системы.
paxdiablo
Ваш ответ идеально подходит для "система не будет использовать файл после перезагрузки, если он был удален". Но был задан вопрос: «Как восстановить или повторно использовать inode после удаления указателя inode?». По сути, ядро ​​Linux создает новый индекс в файле при его создании, а также автоматически не восстанавливает индекс при удалении файла.
Моханрай
1
@AshishKarpe, я полагаю, вы говорите о своей собственной ситуации, поскольку ОП не упомянул о производственных серверах. Если вы не можете перезагрузиться немедленно, есть две возможности. Во-первых, надеемся, что процессы в полете в конце концов закроют текущие файлы, чтобы освободить ресурсы диска. Во-вторых, даже рабочие серверы должны иметь возможность перезагрузки в какой-то момент - просто запланируйте некоторое запланированное время простоя или дождитесь появления следующего окна простоя.
paxdiablo
2
Я полагаю, вы хотите ls -Aвместо ls -a. Почему вы хотите считать. и ..?
Ярно
205

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

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

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

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

Саймон
источник
8
это делает трюк. моя проблема заключалась в том, чтобы иметь невероятное количество сессий в каталоге / lib / php / session. может у кого-то такая же проблема
SteMa
2
Кто-то должен переписать эту команду find, cut, uniq в одну команду awk!
mogsie
5
@alxndr awkможет хранить хэш каталога и количество файлов, не разбирая и не сортируя строки из миллиарда строк. Тем не менее, возможно, вот улучшение: find . -maxdepth 1 -type d | grep -v '^\.$' | xargs -n 1 -i{} find {} -xdev -type f | cut -d "/" -f 2 | uniq -c | sort -n- это только сортирует последний список.
mogsie
12
Если вы не можете создать какие-либо файлы, даже это может дать сбой, потому что sortможет не сохранить все в памяти и попытаться автоматически вернуться к записи временного файла. Процесс, который, очевидно, потерпит неудачу ...
Микко Ранталайнен
10
sortне удалось для меня, но я смог дать, --buffer-size=10Gкоторый работал.
Фредерик Норд
69

Моя ситуация состояла в том, что у меня не было 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 вручную, чтобы освободить около 10 000 inode

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

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

$ 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% /
LNamba
источник
3
Это было ближе всего к моему собственному подходу в аналогичной ситуации. Стоит отметить, что более осторожный подход хорошо задокументирован на help.ubuntu.com/community/Lubuntu/Documentation/…
beldaz
Мой случай точно! Но для прогресса пришлось использовать «sudo apt-get autoremove -f»
Тони Сепия
Безопасно ли это делать: sudo rm -rf /usr/src/linux-headers-3.2.0-2*если я уверен, что не использую это ядро?
Марс Ли
@MarsLee Вы можете проверить, какое ядро ​​работает в данный момент, с помощью «uname -a»
Доминик Иав
Позвонив $ sudo apt-get autoremoveодному, сделал свое дело для меня.
Мортен Грум
49

Мое решение:

Попробуйте найти, если это проблема с 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

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

dardarlt
источник
1
В моем случае проблема была SpamAssasin-Temp. find /var/spool/MailScanner/incoming/SpamAssassin-Temp -mtime +1 -print | xargs rm -fсделал работу :) Спасибо!
джойстик
4
Для меня это заняло несколько часов. Однако есть простое решение: когда вторая команда зависает в определенном каталоге, убейте текущую команду и перезапустите замену / * на любой каталог, в котором она висела. Я был в состоянии сверлить до виновника <минуту.
Майкл Терри
Я использовал этот вариант вашей команды для того, чтобы напечатать числа в одной строке: for i in /usr/src/*; do echo -en "$i\t"; find $i 2>/dev/null |wc -l; done
cscracker
for i in /src/*; do echo "$i, `find $i |wc -l`"; done|sort -nrk 2|head -10показать топ-10 крупнейших каталога
Марк Саймон
12

У меня была такая же проблема, исправили, удалив каталог сессий 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)

Anyone_ph
источник
1
Есть идеи, почему это происходит?
Сибидхаран
1
@Sibidharan в моем случае это было потому, что работа cron по PHP для очистки старых сессий PHP не работала.
мрачное
3
rm -rf /var/lib/php/sessions/*вероятно, будет лучшей командой - она ​​не удалит каталог сеанса, только его содержимое ... Тогда вам не нужно беспокоиться о его воссоздании
Shadow
У меня была не сессия php, а проблема с magento, похожая на эту. Спасибо за направление.
Мохит
PHP сессии не следует очистить с помощью хрон рабочих мест, установленного session.gc_maxlifetime в php.ini php.net/manual/en/...
2

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

/usr/local/cpanel/bin/purge_dead_comet_files
designgroop
источник
2

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

rsync -a --delete blanktest/ test/

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

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

Вигнеш
источник
Из того, что я могу сказать из статьи / комментариев, это быстрее, чем rm *для большого количества файлов, из-за расширения подстановочного знака и передачи / обработки каждого аргумента, но rm test/хорошо для удаления test/папки, содержащей много файлов.
mwfearnley
Хедз-ап, это работает хорошо, но убедитесь, что вы правильно установили разрешения для пустой директории! Я этого не делал и случайно изменил права доступа в моем каталоге сессий PHP. Потребовалось два часа, чтобы понять, что я облажался.
конец
1

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

rm -rf /var/cache/eaccelerator/*

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

supershwa
источник
1

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

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

Razal
источник
1

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

Ярно
источник
0

Поздний ответ: в моем случае это были мои файлы сессий под

/var/lib/php/sessions

которые использовали Inodes.
Я даже не смог открыть свой crontab или создать новый каталог, не говоря уже о запуске операции удаления. Поскольку я использую PHP, у нас есть это руководство, где я скопировал код из примера 1 и настроил cronjob для выполнения этой части кода.

<?php
// Note: This script should be executed by the same user of web server 
process.

// Need active session to initialize session data storage access.
session_start();

// Executes GC immediately
session_gc();

// Clean up session ID created by session_gc()
session_destroy();
?>

Если вам интересно, как мне удалось открыть мой crontab, тогда я удалил некоторые сессии вручную через CLI.

Надеюсь это поможет!

Хан
источник
0

Вы могли видеть эту информацию

for i in /var/run/*;do echo -n "$i "; find $i| wc -l;done | column -t
张馆长
источник
-2

Многие ответы на этот вопрос до сих пор, и все вышеперечисленное кажется конкретным. Я думаю, что вы будете в безопасности, используя по statмере продвижения, но в зависимости от ОС, вы можете получить некоторые ошибки inode. Таким образом, реализация ваших собственных statфункций вызова с использованием, 64bitчтобы избежать любых проблем переполнения, кажется довольно совместимой.

kinokaf
источник
мы любим примеры здесь в так;)
Бон
-3

Если вы используете докер, удалите все изображения. Они использовали много места ....

Остановить все контейнеры

docker stop $(docker ps -a -q)

Удалить все контейнеры

docker rm $(docker ps -a -q)

Удалить все изображения

docker rmi $(docker images -q)

Работает для меня

Панкадж Шинде
источник
Это не помогает определить, является ли проблема «слишком большим количеством инодов».
Марк Стосберг
Это не имеет ничего общего с Docker.
Урда