Ситуация, когда df
показывает 20 ГБ занятого пространства, а du
только 20 МБ, возникает из-за особенностей работы Linux с файлами и файловыми системами. Рассмотрим основные причины такого поведения.
Самая распространённая причина - файлы были удалены, но остаются открытыми процессами.
Диагностика:
lsof +L1 # Показать файлы с link count = 0 (удалённые)
lsof | grep deleted # Альтернативный вариант
Пример сценария:
# Создаём большой файл
dd if=/dev/zero of=bigfile bs=1M count=10240
# Открываем файл в одном терминале
tail -f bigfile
# Удаляем файл в другом терминале
rm bigfile
Решение:
# Найти PID процесса
lsof | grep deleted
# Очистить дескриптор
gcore -o /dev/null <PID>
Снапшоты могут удерживать изменённые блоки, даже если оригинальные файлы удалены.
Диагностика для LVM:
lvdisplay # Проверить наличие снапшотов
Решение:
lvremove /dev/vg0/snapshot1
Некоторые ФС (особенно ext3/ext4) могут резервировать пространство для журнала.
Диагностика:
dumpe2fs -h /dev/sdX | grep Journal
Файловые системы резервируют ```5% пространства для root.
Проверка:
tune2fs -l /dev/sdX | grep "Reserved block count"
Решение (если нужно):
tune2fs -m 1 /dev/sdX # Уменьшить резерв до 1%
Диагностика:
fsck -n /dev/sdX # Проверка без изменений
Файлы с "дырами" могут показывать разный размер в разных утилитах.
Проверка:
ls -lhs # Первая колонка - реальные блоки, вторая - виртуальный размер
Проверка:
mount | grep bind
lsof | grep deleted
dumpe2fs
tune2fs
fsck
ls -lhs
# Альтернативный подсчёт занятого места (игнорируя mount points)
du -x --max-depth=1 -h /
# Проверка inodes (может быть связано)
df -i
Резюмируем: расхождение между df
и du
почти всегда связано либо с удалёнными, но открытыми файлами, либо с особенностями работы файловой системы (снапшоты, резервирование, журналирование). Первым шагом всегда следует проверять lsof
на наличие удалённых файлов, удерживаемых процессами.