df сообщает о наличии 20 Гб занятого пространства, подсчёт занятого файлами места при помощи du даёт результат в 20 Мб. При каких обстоятельствах может возникнуть описанная ситуация?deleted filesdevops-75

Ситуация, когда df показывает 20 ГБ занятого пространства, а du только 20 МБ, возникает из-за особенностей работы Linux с файлами и файловыми системами. Рассмотрим основные причины такого поведения.

1. Удалённые, но ещё открытые файлы

Самая распространённая причина - файлы были удалены, но остаются открытыми процессами.

Диагностика:

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>

2. Файловая система с snapshots

Снапшоты могут удерживать изменённые блоки, даже если оригинальные файлы удалены.

Диагностика для LVM:

lvdisplay  # Проверить наличие снапшотов

Решение:

  • Удалить ненужные снапшоты
lvremove /dev/vg0/snapshot1

3. Журналирование файловой системы

Некоторые ФС (особенно ext3/ext4) могут резервировать пространство для журнала.

Диагностика:

dumpe2fs -h /dev/sdX | grep Journal

4. Файлы в состоянии "reserved blocks"

Файловые системы резервируют ```5% пространства для root.

Проверка:

tune2fs -l /dev/sdX | grep "Reserved block count"

Решение (если нужно):

tune2fs -m 1 /dev/sdX  # Уменьшить резерв до 1%

5. Повреждение файловой системы

Диагностика:

fsck -n /dev/sdX  # Проверка без изменений

6. Использование sparse-файлов

Файлы с "дырами" могут показывать разный размер в разных утилитах.

Проверка:

ls -lhs  # Первая колонка - реальные блоки, вторая - виртуальный размер

7. Файловая система в состоянии монтирования

Проверка:

mount | grep bind

Полный алгоритм диагностики:

  1. Проверить открытые удалённые файлы: lsof | grep deleted
  2. Проверить снапшоты LVM/Btrfs/ZFS
  3. Проверить журнал ФС: dumpe2fs
  4. Проверить зарезервированные блоки: tune2fs
  5. Проверить целостность ФС: fsck
  6. Проверить sparse-файлы: ls -lhs

Полезные команды для анализа:

# Альтернативный подсчёт занятого места (игнорируя mount points)
du -x --max-depth=1 -h /

# Проверка inodes (может быть связано)
df -i

Резюмируем: расхождение между df и du почти всегда связано либо с удалёнными, но открытыми файлами, либо с особенностями работы файловой системы (снапшоты, резервирование, журналирование). Первым шагом всегда следует проверять lsof на наличие удалённых файлов, удерживаемых процессами.