Несоответствие между «du» и «df»

Несоответствие между «du» и «df»

У меня странное несоответствие. С помощью "df" я вижу, что мой корневой диск использует почти 229G.

# df -h
Filesystem                  Size  Used Avail Use% Mounted on
/dev/dm-2                   241G  229G   13G  96% /

но «du» говорит мне, что у меня занято всего около 12 ГБ (округленно).

# du -sh /* | grep G
3.2G    /run
2.1G    /usr
6.0G    /var

Обе команды были запущены как root. Я могу себе представить, что в каталоге, куда сейчас смонтирован ресурс NFS, есть «скрытые» данные. Если это так. Как мне узнать, какие файлы там «скрыты». Или у вас есть другие идеи, почему эти числа так сильно различаются?

решение1

Вероятно, у вас есть приложение/процесс, который держит этот файл открытым. Когда вы удаляете файл, который удерживается открытым приложением, ОС все еще видит размер файла в df, поскольку файл все еще открыт в памяти.

Вот документация, которую я написал для коллеги, и которая должна помочь вам.

Обрезать большие открытые файлы

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

Используйте LSOF для получения удаленных, но удерживаемых файлов

lsof |grep deleted

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

java       2943  gateway  410w      REG              253,3  50482102     139274 /opt/span/app/node/default/var/attachments/att180368_0.part (deleted)
java       2943  gateway  411w      REG              253,3  46217973     139284 /opt/span/app/node/default/var/attachments/att182230_0.part (deleted)
java       2943  gateway  412w      REG              253,3  50483894     139280 /opt/span/app/node/default/var/attachments/att181920_0.part (deleted)

Вы можете перезапустить приложение, чтобы разблокировать файлы, или обрезать файлы.

Чтобы обрезать файлы, вам придется посмотреть на вывод выше, чтобы получить PID и fd (номер дескриптора файла).

обрезать файл с помощью

echo > /proc/PID/fd/fd_number

Пример: чтобы обнулить размер трех файлов, перечисленных выше, вам нужно ввести следующее

echo > /proc/2943/fd/410 
echo > /proc/2943/fd/411
echo > /proc/2943/fd/412

если у вас много подлежащих обрезанию файлов, bash придет на помощь.

for n in {410..412}; do 'echo  > /proc/2943/fd/$n'; done;

df -lah теперь должен показывать свободное место, НО файлы будут отображаться в lsof |grep удалены, но будут иметь размер 1

java       2943  gateway  410w      REG              253,3         1     139274 /opt/span/app/node/default/var/attachments/att180368_0.part (deleted)
java       2943  gateway  411w      REG              253,3         1     139284 /opt/span/app/node/default/var/attachments/att182230_0.part (deleted)
java       2943  gateway  412w      REG              253,3         1     139280 /opt/span/app/node/default/var/attachments/att181920_0.part (deleted)

Дескрипторы файлов будут освобождены при следующей перезагрузке или перезапуске/перезагрузке приложения, открывшего файлы.

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

решение2

В моем случае (и вы помогли мне в ЛС, рассказав мне то же самое) это была проблема с over-mount. У меня были некоторые данные в каталоге на разделе, которые я duне мог видеть, потому что монтирование скрыло их.

Так что постарайтесьразмонтировать все монтированияи ищите данные в оставшихся каталогах.

Желаю вам приятного времяпрепровождения и спасибо!

Связанный контент