Файлова система Linux; різниця у розмірі обчислення за допомогою df & du


8

Коли я запускаю, dfвін показує, що кореневий пристрій повний.

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.9G  9.4G     0 100% /

Я переглянув inodeвикористання, і для кореневого пристрою є досить багато місця

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1               640K    103K    538K   16% /

Але, коли я запускаю duкоманду, вона показує, що я використовував лише 2Gпоза 9.9G.

ip-XXX-XXX-XXX-XXX:/$ du -xh --max-depth=1
14M ./etc
4.0K ./mnt
96K ./tmp
3.5M ./bin
0   ./sys
964K ./boot
4.0K ./srv
0   ./dev
55M ./lib
25M ./root
1.1G ./usr
4.0K ./opt
846M ./var
4.3M ./sbin
23M ./home
16K ./lost+found
0   ./proc
2.0G .

Це просто зводить мене з розуму і цікаво теж. Для нас це велика проблема, оскільки кореневий диск /заповнений, а частина функцій на нашому веб-сайті виходить з ладу.

Будь ласка, допоможіть мені вирішити (також зрозуміти) цю проблему.

Дякую.



@Gilles, як ти сказав, я побіг, du -x /і я бачу, що використовується лише 2G, і я обчислив розмір inode, який є 160M. Це допомогло мені зрозуміти речі, але я просто хочу вирішити цю проблему.
Ракеш Санкар

Ви запустили duяк root? В іншому випадку він може звітувати лише про файли, до яких можна отримати доступ.
Жил 'ТАК - перестань бути злим'

@Gilles Я бігаю якroot
Ракеш Санкар

У мене немає чого додати тут, окрім чудової ncduпрограми, яка допомагає візуалізувати використання диска.
Роб

Відповіді:


4

Коли файли видаляються в * nix, вони продовжують жити на диску (і займають місце на диску) до тих пір, поки процес відкриє їх. Досить звичайно скористатися цим, щоб "захистити" тимчасові файли, створивши їх з невеликим розміром, видаливши їх, а потім використовуючи видалений файл для зберігання даних, не турбуючись про інші процеси (легко) отримання доступу до них, тому кількість видалених файлів може зрости досить великою, якщо, скажімо, тимчасовою базою даних або сеансом редагування мультимедіа обробляється таким чином. Іншою можливістю того, як у вас могло бути стільки "втраченого" простору, було б, якщо систему було оновлено (кілька разів) без перезавантаження або перезавантаження програм, в результаті чого всі ваші старі бібліотеки .so відкриті програмами, запущеними до початку оновлення та все ще працює.

dfбачить простір, який використовують ці файли, оскільки він просто дивиться, скільки місця виділено на пристрої, але duне бачить їх, оскільки немає відповідних записів каталогів.

"Прихований" використаний простір подібний до цього можна звільнити лише тоді, коли процеси, які видаляють файли, відкриваються, закривають їх. Ви можете знайти ці процеси за допомогою fuserкоманди та припинити їх (або, для багатьох демонів, надіслати сигнал, який каже їм закрити та повторно відкрити будь-які відкриті файли).


спасибі, хороша інформація, щось (більше) я сьогодні розумію. Але, щоб знайти hiddenвикористаний пробіл, я намагаюся запустити fuserкоманду, щоб побачити всі файли, які використовуються в процесі, але від’єднані - я не міг знайти жодного. Чи є у вас якась команда чи напрямок, який веде мене до її пошуку? Це команда, яку я використовуюfuser -v -a /
Ракеш Санкар

Мені довелося перезавантажити його, щоб позбутися від прихованого простору, але я не зміг знайти належне рішення для видалення цих прихованих файлів.
Ракеш Санкар

1

Були випадки, коли диск повністю заповнюється, його потім можна переплутати до перезавантаження / перезавантаження, що диск все ще заповнений, навіть коли ви видалили завантаження файлів.


Я не можу перезавантажуватись, оскільки це виробничий сайт. Але я шукаю рішення, яке може допомогти мені знайти цей прихований простір і повернути його назад.
Ракеш Санкар

Це може бути виробництво, але іноді перезавантаження є єдиною відповіддю. Ось прикрою проблемою є те, що це ваш кореневий диск і вся ваша ОС на ньому. Ось чому багато хто виступає за використання tmp, var, home тощо на інших дисках, оскільки їх потім можна переказати. Здається, більш поширеним є те, що ОС не розуміє, що на кореневому диску доступний простір.
BugFinder

1

З моєї сторони, я просто перезапустив syslogd, щоб отримати дисковий простір. У мене відсутнє 3 ГБ! Мій сервер працював 250 днів.


0

Існує спосіб очищення простору без перезавантаження програми. Ось деталі:

  1. Скажімо, у вас fooзапущений процес і створено файл 2 Гб на ім’я abc.log. Тепер скажіть, що цей abc.log хтось інший видалив.

  2. Отримайте fooпід (скажімо, 123). Так /proc/123/fdбуде показаний список дескрипторів файлів, відкритих користувачем foo. Один з abc.log відображатиметься як видалений. Скажімо, fdabs.log - це 111. Якщо ви запустите less /proc/123/fd/111, він все одно покаже вам всі 2 ГБ даних.

  3. Біжи echo " " > /proc/123/fd/111. Це перезаписує вміст порожнім рядком. Після цієї команди, якщо ви спробуєте, dfз’явиться додаткові 2 Гб, відновлені очищенням abc.log.

Це воно. Я спробував це на CentOS, і це працює.


Це корисна річ, яку потрібно знати. Але це не відповідь на питання.
Ісаак Рабінович

вибачте, мій анс був більше орієнтований на очищення місця на диску, якщо ви знаєте ідентифікатор процесу, який видалив файл. У цьому конкретному випадку вам потрібно пройти всі файли в / proc / [0-9] * / fd, обклеїти видалені файли та дотримуватися вищезгаданої логіки.
Kaustubh Sathe

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