Як звільнити використання Inode?


275

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

Який правильний спосіб це зробити тоді?

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

Чи можливо, якщо я zip багато файлів, що зменшить кількість використаних inode?


4
Хочете дати 50 балів за це питання. Як я можу зробити! :)
Sophy

@Sophy Не роби цього. ви отримаєте автоматичну заборону
Стівен Лу

1
@StevenLu Дякую за інформацію! Я хочу дати йому кредит, тому що я витратив кілька днів, щоб вирішити своє питання. Але це питання може мені допомогти. Ще раз дякую,
Софі

1
@Sophy: навіщо нагороджувати щось поза темою? :) Це, безумовно, не питання програмування, незалежно від того, скільки обробок він отримує.
тинк

Порожні каталоги також споживають індекси. Видалення їх може звільнити деякі вставки. Кількість може бути значним у деяких випадках використання. Ви можете видалити порожні каталоги за допомогою: find. -тип d -порожній -delete
Ruchit Patel

Відповіді:


170

На диску досить легко використовувати велику кількість входів, навіть якщо диск не дуже заповнений.

У файлі виділяється inode, тому якщо у вас є газильйони файлів, усі по 1 байті кожен, у вас буде не вистачати вкладень задовго до того, як у вас закінчиться диск.

Можливо також, що видалення файлів не зменшить кількість входів, якщо файли мають декілька жорстких посилань. Як я вже казав, вставки належать до файлу, а не до каталогу. Якщо у файлі є дві пов'язані з ним записи каталогів, видалення одного не вивільнить 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_$$

12
Звичайно, >/tmp/count_em_$$заповіт спрацює лише в тому випадку, якщо у вас є місце для цього ... якщо це так, див. Відповідь @ simon.
alxndr

1
@alxndr, тому часто рекомендується тримати файлові системи окремо - таким чином заповнення чогось подібного /tmpне вплине на ваші інші файлові системи.
paxdiablo

Ваша відповідь ідеально підходить для того, що "система не залишиться використовувати файл після перезавантаження, якщо такий був видалений". Але було задано питання: "як повернути або повторно використовувати вставки після видалення покажчика inode?". В основному ядро ​​Linux створює новий inode у файлі, коли створюється, а також автоматично не відновлює вкладення кожного разу, коли ви видаляєте файл.
Мохандрай

1
@AshishKarpe, я припускаю, що ви говорите про власну ситуацію, оскільки ОП не згадувало виробничих серверів. Якщо ви не можете негайно перезавантажити, то є дві можливості. По-перше, сподівайтеся, що процеси в польоті врешті-решт закриють поточні файли, щоб дискові ресурси могли бути звільнені. По-друге, навіть виробничі сервери повинні мати можливість перезавантажити в якийсь момент - просто заплануйте запланований час простою або дочекайтеся появи наступного вікна простою.
paxdiablo

2
Я думаю, ви хочете ls -Aзамість цього ls -a. Чому ви хочете порахувати. і ..?
jarno

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
Хтось повинен переписати цю знахідку, вирізати, uniq сортувати в одну команду awk!
mogsie

5
@alxndr awkміг би зберігати хеш каталогу та кількості файлів без з’єднання та сортування ліній у gazillion. Це, мабуть, вдосконалення: 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

Моя ситуація полягала в тому, що я не мав місця та я вже видалив усе, що міг.

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

Я перебуваю на ubuntu 12.04LTS і не міг видалити старі ядра Linux, які займали близько 400 000 inode, тому що apt був зламаний через відсутній пакет. І я не зміг встановити новий пакет, тому що мені було не в місцях, тому я застряг.

Я закінчив видаленням декількох старих ядер 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% /

3
Це було найближчим до мого власного підходу у подібній ситуації. Варто відзначити, що більш обережний підхід добре зафіксований на help.ubuntu.com/community/Lubuntu/Documentation/…
beldaz

Моя справа саме! Але довелося використовувати "sudo apt-get autoremove -f", щоб прогресувати
Tony Sepia

Чи безпечно це робити: sudo rm -rf /usr/src/linux-headers-3.2.0-2*якщо я впевнений, що я не використовую це ядро?
Марс Лі

@MarsLee Ви можете перевірити, яке ядро ​​зараз працює з "uname -a"
Домінік Ів

Подзвонивши $ sudo apt-get autoremoveнаодинці, зробив для мене трюк.
Morten Grum

49

Моє рішення:

Спробуйте дізнатися, чи це проблема з inodes із:

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

Це вирішило мою проблему.


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)


1
Будь-яка ідея, чому це відбувається?
Сибіджаран

1
@Sibidharan в моєму випадку це було через те, що завдання PHP-Cron для очищення старих сеансів PHP не працювало.
похмурий

3
rm -rf /var/lib/php/sessions/*це, мабуть, буде кращою командою - він не видалить каталог сеансів, а лише його вміст ... Тоді вам не доведеться турбуватися про його відтворення
Shadow

У мене не було сеансу php, а проблеми сеансу magento, подібний до цього. Дякую за напрям.
Мохіто

php сеанси не повинні очищатись

2

Ми пережили це в обліковому записі HostGator (який розміщує обмеження у всіх своїх хостингах) після спам-атаки. Він залишив величезну кількість записів черг в /root/.cpanel/comet. Якщо це сталося, і ви виявите, що у вас немає вільних вводів, ви можете запустити цю утиліту cpanel через оболонку:

/usr/local/cpanel/bin/purge_dead_comet_files

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 на сайті з великим навантаженням. Звільніть Inodes, видаливши кеш-пам'ять eaccelerator в / var / cache / eaccelerator, якщо проблеми й надалі не виникають.

rm -rf /var/cache/eaccelerator/*

(або будь-який ваш кеш-директор)


1

Нещодавно ми стикалися з подібною проблемою. Якщо процес посилається на видалений файл, Inode не буде випущений, тому вам потрібно перевірити lsof /, і вбити / перезапустити процес вивільнить узори.

Виправте мене, якщо тут помиляюся.


1

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


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як ви йдете далі, але в залежності від ОС, ви можете отримати деякі помилки вкладки на вас. Тому реалізація власної statфункціональності дзвінків за допомогою 64bitуникнення будь-яких проблем із переповненням виглядає досить сумісною.


ми любимо приклади тут так;)
Боне,

-3

Якщо ви використовуєте докер, видаліть усі зображення. Вони використовували багато місця…

Зупиніть усі контейнери

docker stop $(docker ps -a -q)

Видаліть усі контейнери

docker rm $(docker ps -a -q)

Видалити всі зображення

docker rmi $(docker images -q)

Мені працює


Це не допомагає виявити, чи проблема "занадто багато введення".
Марк Стосберг

Це не має нічого спільного з Докером.
Урда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.