Иногда ситуация выглядит странно:
df -h /
показывает, что занято 80 GB.
А:
du -sh /
находит только 55 GB.
Кажется, что Linux «потерял» 25 GB. На самом деле
du и df измеряют разные вещи.▪️Что считает
dfdf смотрит на файловую систему и её блоки:df -h /
Он показывает, сколько места файловая система считает занятым и свободным.
▪️Что считает
dudu обходит дерево каталогов и суммирует пространство, связанное с найденными файлами:du -xhd1 / 2>/dev/null
-x здесь важен: он не позволяет уйти на другие файловые системы.▪️Одна из главных причин расхождения
Процесс может держать открытым файл, который уже удалили.
Например:
rm /var/log/app.log
Имя файла исчезло из каталога, но процесс всё ещё держит его открытым.
Для
du такого файла уже не существует.А файловая система продолжает считать его блоки занятыми.
Проверить:
lsof +L1
Можно увидеть что-то вроде:
app 1234 ... /var/log/app.log (deleted)
Пока процесс не закроет этот дескриптор, место может не освободиться.
▪️Есть и другие причины
Например,
du без -x может пересекать mount points и давать неожиданный результат.Или часть пространства файловой системы зарезервирована и не доступна обычным пользователям.
Посмотреть файловую систему подробнее:
findmnt /
df -h /
df -i /
▪️Практический сценарий
На сервере внезапно заканчивается место:
df -h /
Показывает:
/dev/sda2 100G 95G 5G 95% /
Но:
du -xsh /
показывает только 70G.
Первое, что стоит проверить:
lsof +L1
Если там огромный
(deleted) лог, причина найдена.▪️Важный нюанс
df отвечает примерно на вопрос:«Сколько блоков файловой системы сейчас занято?»
А
du:«Сколько места занимают доступные мне файлы в этом дереве?»
Поэтому при расхождении
df и du не стоит сразу запускать rm -rf по большим каталогам.Сначала нужно понять, куда именно делось пространство.
BashTex 📱 #bash #systemd