← Весь справочник

df и du

Сколько места свободно на файловых системах (df) и сколько занимают каталоги и файлы (du)

df (disk free) отвечает на вопрос «сколько места осталось на разделе» — он спрашивает у файловой системы сводку. du (disk usage) обходит каталоги и суммирует размеры файлов — отвечает на вопрос «кто занял место». Цифры у них не обязаны совпадать, и это нормально.

Синтаксис

df [опции] [файл…]      # без аргументов — все смонтированные ФС
du [опции] [путь…]      # без аргументов — текущий каталог

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

Вывод df

df -h /
# Filesystem      Size  Used Avail Use% Mounted on
# overlay          95G   90G  922M  99% /
КолонкаЗначение
Filesystemустройство или тип (/dev/sda1, overlay, tmpfs)
Sizeобщий размер
Usedзанято
Availдоступно обычному пользователю
Use%Used / (Used + Avail), округлено вверх
Mounted onточка монтирования
Typeтип ФС (с -T)
Inodes, IUsed, IFree, IUse%индексные дескрипторы (с -i)

Used + Avail обычно меньше Size: на ext4 около 5% зарезервировано для root.

Опции df

ОпцияЧто делает
-hразмеры в K, M, G (степени 1024)
-Hто же в степенях 1000 (как на коробке диска)
-k / -B1M / -BGразмер в КиБ / МиБ / ГиБ
-Tдобавить колонку с типом ФС
-iпоказать inodes вместо блоков
-t ext4только ФС этого типа
-x tmpfsисключить тип (можно повторять: -x tmpfs -x devtmpfs)
-lтолько локальные ФС, без сетевых
-aвключая псевдо-ФС (proc, sysfs…)
--output=source,fstype,size,used,avail,pcent,targetвыбрать колонки; ещё itotal, iused, iavail, ipcent, file
--totalдобавить итоговую строку
-PPOSIX-формат: одна ФС — всегда одна строка (удобно для awk)

Опции du

ОпцияЧто делает
-sтолько итог по каждому аргументу, без подкаталогов
-hразмеры в K, M, G; --si — в степенях 1000
-aпоказывать и файлы, а не только каталоги
-d N / --max-depth=Nне глубже N уровней (-d 1 — непосредственные подкаталоги)
-cдобавить строку total
-xне переходить на другие ФС (важно для du /)
-k / -m / -B1Gединицы: КиБ / МиБ (с округлением вверх) / ГиБ
-bточный размер в байтах (--apparent-size + -B1)
--apparent-size«видимый» размер файла, а не занятые на диске блоки
-Sне включать подкаталоги в размер каталога
-t 100Mпоказывать только записи больше порога (-t -1M — меньше)
--exclude='*.log'пропустить файлы по шаблону; -X файл — шаблоны из файла
--timeдобавить время последнего изменения внутри
--inodesсчитать число файлов вместо размера
-Lидти по символическим ссылкам (по умолчанию не идёт)
-lсчитать жёсткие ссылки каждый раз (по умолчанию файл учитывается один раз)
-0разделять строки нулевым байтом

Вывод du — две колонки через табуляцию: размер и путь.

Примеры

# свободное место на всех ФС, без служебных
df -h -x tmpfs -x devtmpfs

# на каком разделе лежит каталог и сколько там места
df -h /var/log

# процент занятости корня — числом, для скрипта
df --output=pcent / | tail -n 1 | tr -dc '0-9'

# кончились inodes? (много мелких файлов)
df -i /

# сколько занимает каталог
du -sh /var/log

# подкаталоги первого уровня, самые большие сверху
du -h -d 1 /var | sort -rh | head

# самые большие файлы и каталоги внутри, без перехода на другие ФС
du -ahx /var | sort -rh | head -n 20

# несколько путей и итог
du -csh /var/log /var/cache

# реальный размер файла против занятого места (разреженные файлы)
du -h --apparent-size big.img
du -h big.img

# только то, что больше 100 МиБ
du -h -t 100M /var

Подводные камни

  • df показывает «занято», а du столько не находит. Чаще всего — удалённый, но всё ещё открытый файл: место освободится, когда процесс закроет его. Ищи через /proc/*/fd (см. proc). Другие причины — файлы под точкой монтирования или в каталоге, куда нет доступа.
  • du по умолчанию считает блоки, а не байты. Файл в 1 байт занимает 4.0K, а разреженный образ на 1 ГиБ может занимать 0. Для «длины файла» — --apparent-size или -b.
  • Жёсткие ссылки считаются один раз за запуск. du -sh a b и du -sh b могут дать разное для b, если файлы в нём — ссылки на файлы из a.
  • sort -h, а не sort -n. Только -h понимает, что 2G больше 900M.
  • du -sh * пропускает скрытые файлы и каталоги (.cache, .git): шаблон * их не раскрывает. Используй du -sh .[!.]* * или du -d 1 ..
  • Место может кончиться при свободных гигабайтах — если закончились inodes. Ошибка та же: No space left on device. Проверяй df -i.
  • du / без -x пойдёт в /proc, /sys и примонтированные тома — долго и с кучей ошибок. Добавляй -x и 2>/dev/null.
  • В контейнере df / показывает overlay-ФС, общую с хостом, — это место на диске хоста, а не «размер контейнера».

См. также

find · proc · sort · logrotate