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 | добавить итоговую строку |
-P | POSIX-формат: одна ФС — всегда одна строка (удобно для 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-ФС, общую с хостом, — это место на диске хоста, а не «размер контейнера».