Файловая система 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 .

Это просто сводит меня с ума и интересно тоже. Это большая проблема для нас, так как корневой диск /заполнен и некоторые функции на нашем сайте не работают.

Пожалуйста, помогите мне решить (также понять) эту проблему.

Спасибо.

Ракеш Санкар
источник
2
См. Путаницу свободного места+df +du на Linux и другие вопросы в Unix & Linux .
Жиль "ТАК - перестань быть злым"
@ Жиль, как ты сказал, я побежал, du -x /и я вижу, что используется только 2G, и я рассчитал размер инода, который есть 160M. Это помогло мне понять вещи, но я просто хочу решить эту проблему.
Ракеш Санкар
Вы запускались duс правами root? В противном случае он может сообщать только о тех файлах, к которым у вас есть доступ.
Жиль "ТАК - перестань быть злым"
@ Жиль, я бегу какroot
Ракеш Санкар,
Мне нечего добавить, кроме отличной ncduпрограммы, которая помогает визуализировать использование диска.
Роб

Ответы:

4

Когда файлы удаляются в * nix, они продолжают жить на диске (и занимают место на диске) до тех пор, пока процесс открывает их. Довольно часто это можно использовать для «защиты» временных файлов, создавая их с небольшим размером, удаляя их, а затем используя удаленный файл для хранения данных, не беспокоясь о том, что другие процессы (легко) могут получить к ним доступ, поэтому объем пространства в удаленных файлах может вырасти довольно большим, если, скажем, таким образом обрабатывается временная база данных или сеанс редактирования мультимедиа. Другая возможность того, как вы могли бы получить так много «потерянного» пространства, была бы, если бы система была обновлена ​​(несколько раз) без перезагрузки или перезапуска программ, в результате чего все ваши старые библиотеки .so были открыты программами, которые были запущены до обновить и все еще работает.

dfвидит пространство, используемое этими файлами, потому что просто смотрит, сколько места выделено на устройстве, но duне видит их, потому что нет соответствующих записей каталога.

«Скрытое» используемое пространство, подобное этому, может быть освобождено только тогда, когда процессы, которые удалили файлы, открывают их. Вы можете найти эти процессы с помощью fuserкоманды и завершить их (или, для многих демонов, отправить сигнал, говорящий им о том, чтобы закрыть и заново открыть все открытые файлы).

Дейв Шерохман
источник
спасибо, хорошая информация, кое-что (больше) я понимаю сегодня. Но, чтобы найти hiddenиспользуемое пространство, я пытаюсь запустить fuserкоманду, чтобы увидеть все файлы, которые используются процессом, но не связаны - я не смог найти ни одного. У вас есть какая-либо команда или направление, которое побуждает меня найти его? Это команда, которую я используюfuser -v -a /
Ракеш Санкар
Мне пришлось перезагрузить его, чтобы избавиться от скрытого пространства, но я не мог найти правильное решение для удаления этих скрытых файлов.
Ракеш Санкар
1

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

BugFinder
источник
Я не могу перезагрузиться, так как это производственный сайт. Но я ищу решение, которое поможет мне найти это скрытое пространство и вернуть его обратно.
Ракеш Санкар
Это может быть производство, но иногда перезагрузка - единственный ответ. Вот к сожалению, проблема заключается в том, что он является корневым диском и на нем установлена ​​вся ваша ОС. Вот почему многие выступают за использование tmp, var, home и т. Д., Находящихся на других дисках, так как они могут быть перемонтированы. Кажется, более распространенным является то, что ОС не понимает, доступно ли место корневому диску.
BugFinder
1

Со своей стороны, я просто перезапустил syslogd, чтобы вернуть дисковое пространство. Мне не хватило 3ГБ! Мой сервер был запущен в течение 250 дней.

Винсент Мартино
источник
0

Существует способ очистки пространства без перезапуска приложения. Вот подробности:

  1. Допустим, у вас fooзапущен процесс и создается файл размером 2 ГБ с именем abc.log. Теперь скажите, что этот abc.log удален кем-то другим.

  2. Получить fooPID (скажем, 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, и это работает.

Kaustubh Sathe
источник
Это полезно знать. Но это не ответ на вопрос.
Исаак Рабинович
извините, мой ответ был более нацелен на очистку дискового пространства, если вы знаете идентификатор процесса, который удалил файл. В этом конкретном случае вы должны просмотреть все файлы в / proc / [0-9] * / fd, grep удаленных и следовать логике, упомянутой выше.
Kaustubh Sathe
Если вам действительно интересно, какой файл вызывал утечку дискового пространства, очищайте удаленный файл за раз, каждый раз проверяйте вывод df и записывайте эту информацию.
Kaustubh Sathe