С чего начать Первые шаги трек · 15 ступеней
Linux Labs

Место на диске: df, du, inode

3 мин Linux

Куда делось место и inode: df по разделам, du по каталогам, поиск крупных файлов и ловушки.

Шпаргалка

7 команд Версия для печати
  • df -h свободное место по разделам
  • df -i свободные inode по разделам
  • du -xh --max-depth=1 / | sort -h топ каталогов (в пределах ФС)
  • ncdu / интерактивный обзор
  • sudo lsof +L1 удалённые-но-открытые файлы
  • sudo journalctl --vacuum-time=7d урезать системный журнал
  • sudo apt clean очистить кэш пакетов

Обзор

Две независимые причины «диск полон»:

  • кончилось место (байты) — смотрит df -h;
  • кончились inode (числовые «слоты» файлов) — смотрит df -i. Бывает при миллионах мелких файлов; место есть, а создать файл нельзя.

Алгоритм: df -h и df -i → найти раздел → du/ncdu сверху вниз до виновника.

Рецепты

2

df / du / ncdu

bash
df -h                             # свободное место по разделам (человекочитаемо)
df -i                             # свободные inode по разделам
df -h /var                        # конкретный путь (в каком он разделе)
df -hT                            # + тип ФС

du -sh /var/*                     # размер каждого подкаталога /var
du -h --max-depth=1 / | sort -h   # топ «тяжёлых» каталогов первого уровня
du -xh --max-depth=1 /            # -x: не выходить за пределы ФС (без /proc, монтирований)
du -sh /var/log                   # сколько занимают логи
ncdu /                            # интерактивный обзор (удобнее всего; apt install ncdu)

ls -lhS | head                    # крупнейшие файлы в каталоге
find / -xdev -type f -size +500M -exec ls -lh {} + 2>/dev/null   # файлы >500 МБ

-x/-xdev — ключ к чистому результату: считать только текущую ФС, не уходя в смонтированные и виртуальные (/proc, /sys).

Что чистить

bash
sudo journalctl --vacuum-time=7d  # урезать системный журнал до 7 дней
sudo journalctl --disk-usage      # сколько занимает журнал
sudo apt clean                    # кэш скачанных пакетов
sudo apt autoremove --purge       # старые ядра и зависимости
docker system df ; docker system prune -af   # образы/слои docker (часто гиганты)
du -sh ~/.cache/*                 # пользовательские кэши

Неполадки

4

df говорит «полно», а du не находит столько

Файл удалён, но открыт процессом — место не освобождается до закрытия:

bash
sudo lsof +L1                     # файлы с 0 ссылок, но открытые (см. lsof)

Перезапусти держащий процесс (часто это лог, «ротированный» неправильно).

No space left on device, хотя df -h показывает свободное

Кончились inode: df -i. Найди каталог с тьмой мелких файлов и чисти:

bash
for d in /*; do printf '%8s %s\n' "$(find "$d" -xdev 2>/dev/null | wc -l)" "$d"; done | sort -rn

Диск забили логи

du -sh /var/log/*; настрой ротацию (logrotate) и журнал (journalctl --vacuum-time=, см. journalctl).

Удалил файлы, а место не вернулось

Либо удалённый-но-открытый файл (см. выше lsof +L1), либо это другой раздел — проверь df -h путь.

Термины

3
inode
Структура ФС с метаданными файла (права, владелец, размер, ссылки на блоки) — но не имя. Ещё встречается в: Символические и жёсткие ссылки, ln, mkfs, /proc: процессы и ядро в виде файлов и ещё 14
логический размер apparent size
Размер файла в байтах, включая пропуски разреженного файла; может отличаться от выделенного места. Ещё встречается в: stat
разреженный файл sparse file
Файл с логическими областями без выделенных блоков данных; чтение таких пропусков возвращает нули. Ещё встречается в: stat

См. также

  • lvm — PV → VG → LV; гибкое управление дисками, расширение и снапшоты.
  • find — Поиск файлов по имени, размеру, времени, правам; действия над найденным.
  • mount — Подключение файловых систем, постоянное монтирование через /etc/fstab, UUID.
Загрузка…