Du и df в Linux: почему размер файлов и занятое место различаются

Du и df в Linux: почему размер файлов и занятое место различаются
Содержание статьи

df показывает использование файловой системы, а du обходит указанные файлы и каталоги и оценивает занимаемое ими место. Поэтому сумма каталогов и занятое место по df не обязаны совпадать. Начните с одинаковой области измерения и единиц, затем проверяйте причины расхождения.

Сравните одну файловую систему

Команды ниже относятся к GNU coreutils в Linux и только читают состояние. Запускайте их в нужном каталоге, понимая, что рекурсивный обход большого дерева может создать заметную нагрузку на диски.

df -h -- .
du -x -h --max-depth=1 -- .

Точка обозначает текущий каталог. df покажет файловую систему, которая его содержит. du посчитает доступное дерево этого каталога; -x не даст перейти в другие файловые системы, а --max-depth=1 ограничит глубину выводимых строк. Сам обход вложенных данных всё равно нужен для подсчёта итогов.

Если вы стоите в небольшой подпапке, сравнивать её итог с занятостью всего раздела неправильно. Сначала определите точку монтирования по выводу df. Не складывайте итоговую строку du с уже включёнными в неё подкаталогами: это двойной счёт.

Логический размер и выделенное место

Размер данных файла и место, выделенное файловой системой, могут отличаться. У разреженного файла логический размер может быть большим, хотя часть диапазона не занимает обычных блоков данных. Для одного дерева можно отдельно запросить два показателя в одинаковых единицах:

du -x -s -B1 -- .
du -x -s --apparent-size -B1 -- .

Первая команда оценивает выделенное место, вторая считает apparent size. Ключ -B1 выводит значения в единицах одного байта. Это не означает, что файловая система выделяет место побайтно. Округление, устройство хранения и особенности файловой системы тоже имеют значение.

Почему du может видеть меньше

  • Нет прав на часть дерева. Сообщения Permission denied означают неполный обход, а не нулевой размер этих каталогов.
  • Файл удалён, но открыт процессом. После удаления последнего имени данные сохраняются до закрытия последнего открытого дескриптора. Обычный обход имён уже не найдёт такой файл.
  • Измеряются разные области. Подкаталог, отдельное монтирование и весь раздел не взаимозаменяемы.
  • Данные меняются во время измерения. Два последовательных запуска не являются атомарным снимком работающего сервера.

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

Проверьте ещё и inode

Если создание файлов завершается ошибкой при видимом свободном объёме, проверьте df -i -- .. На файловых системах с ограниченным числом inode множество мелких файлов может исчерпать их раньше пространства данных. Сохраняйте точную ошибку, файловую систему, время измерения и выполненную команду.

Разобраться с командами и устройством системы можно на курсах Linux. На Mentoring.digital можно выбрать наставника по Linux, чтобы научиться интерпретировать вывод на учебном окружении до действий на рабочем сервере.

Похожие статьи по данной теме