Команда df у Linux: моніторинг та дебаг дискових томів
Кожен сисадмін чи DevOps-інженер починає моніторинг інфраструктури з перевірки дисків. Але що робити, якщо утиліта показує наявність вільного місця, а застосунки падають із помилкою No space left on device? Або коли диск забитий на 99%, але пошук великих файлів через du нічого не знаходить?
Ми на практиці переконалися, що базового знання прапорця df -h часто недостатньо для розрулювання інцидентів. Тому зараз розберемо команду df (disk free) на рівні експертного дебагу.
1. Що насправді рахує df і як читати її вивід
Утиліта df аналізує простір на основі метаданих файлової системи. Вона звертається напряму до суперблоку, тому відпрацьовує миттєво. Цим вона відрізняється від утиліти du, яка змушена послідовно обходити дерево директорій і зчитувати розмір кожного файлу.
Звичайний запуск команди без параметрів повертає сирі дані в 1-кілобайтних блоках. Для щоденної роботи використовують прапорець -h (human-readable), який масштабує вивід до Кб, Мб або Гб:
df -h
Анатомія виводу df -h
Утиліта повертає таблицю з шести основних колонок:
- Filesystem — назва фізичного пристрою (наприклад,
/dev/nvme0n1p2) або віртуальної ФС (tmpfs). - Size — загальний об’єм змонтованої файлової системи.
- Used — об’єм простору, який уже зайнятий даними.
- Avail — простір, доступний для запису непривілейованим користувачам.
- Use% — відсоток заповнення розділу.
- Mounted on — точка монтування в ієрархії директорій (корінь
/,/var,/bootтощо).
Майте на увазі: якщо ви додасте значення Used та Avail, підсумкова сума майже ніколи не дорівнюватиме колонці Size. З цим нюансом часто стикаються під час налаштування моніторингу.
Річ у тому, що Linux резервує 5% простору для користувача root (на ФС на кшталт ext4). Це архітектурна подушка безпеки: якщо якийсь непідконтрольний процес запісочить диск на 100%, система не впаде в Kernel Panic, а ви зможете залогінитися через SSH і задебажити проблему.
2. Інженерний тулкіт: комбінації прапорців для щоденних тасок
Замість того, щоб зазубрювати два десятки параметрів з man df, розберімо ті прапорці, які реально знадобляться вам у роботі з інфраструктурою.
Визначення типу файлової системи
Коли на серверах розгорнуто мікс із ext4, xfs, btrfs та мережевих NFS-шар, важливо знати точний тип ФС, щоб вибрати правильний інструмент для ресайзу чи відновлення:
df -Th
(Цей прапорець додає у таблицю колонку Type).
Фільтрація виводу від сміття
Сучасні дистрибутиви монтують десятки віртуальних файлових систем (tmpfs, devtmpfs, sysfs) автоматично. Вони потрібні для роботи самої ОС, але захаращують термінал і заважають оцінити реальний стан фізичних дисків. Для очищення виводу є два підходи:
- Вимкнути непотрібне (
-xабо--exclude-type)
Якщо ви хочете приховати всі віртуальні маунтиtmpfsі бачити лише реальні накопичувачі, виконайте:
df -x tmpfs -h
- Залишити тільки конкретне (
-tабо--type)
Якщо на сервері багато розділів, але вас цікавить стан лише конкретного типу файлової системи (наприклад,xfs), відфільтруйте вивід так:
df -t xfs -h
Перевірка конкретної точки монтування
Немає сенсу парсити очима весь список, якщо вас цікавить конкретний каталог чи партіція. Просто передайте шлях як аргумент:
df -h /var
# Або перевіряйте кілька точок одночасно:
df -h / /var /data
Фіксований розмір блоків для звітів
Прапорець -h динамічно адаптує одиниці виміру під розмір даних (покаже 500M або 20G). Проте якщо ви пишете скрипт автоматизації або збираєте статичний звіт, вам потрібна однакова розмірність чисел. Прапорець -BG примусово виведе всі значення в гігабайтах:
df -BG
Зважайте, що зовсім дрібні розділи округляться до 0G, тому використовуйте цей параметр з розумінням контексту.
Кастомізація колонок для автоматизації
Якщо ви розробляєте власний CLI-інструмент або парсер для моніторингу, використовуйте прапорець –output. Він дозволяє змусити df повертати лише необхідні поля у строго визначеному порядку:
df -h --output=source,size,used,pcent,target
3. Advanced Level: сортування та моніторинг у режимі реального часу
Коли проєкт розростається, скролити екран терміналу у пошуках проблемного диска стає неефективно. Для швидкого аналізу ми використовуємо зв’язки df з іншими базовими утилітами Linux.
Пошук критичних розділів
Спрямовуємо вивід через конвеєр (pipe) в утиліту sort, щоб упорядкувати файлові системи за відсотком використання від більшого до меншого:
df -h | sort -k5 -rn
Щоб не писати цю конструкцію щоразу вручну, додайте цей рядок як аліас у свій файл ~/.bashrc або ~/.zshrc:
alias dfs='df -h | sort -k5 -rn'
Після перезапуску терміналу вам достатньо буде ввести dfs, щоб отримати відсортований список.
Моніторинг динаміки заповнення диска
Під час деплою важких бекапів, міграції великих баз даних або імпорту дампів важливо бачити, як саме зменшується вільне місце і з якою швидкістю. Щоб не виконувати команду вручну кожні кілька секунд, об’єднайте її з утилітою watch:
watch -n 5 df -h
Параметр -n 5 змушує систему автоматично оновлювати вивід команди df -h у вашому терміналі кожні 5 секунд. Це дозволяє спостерігати за станом дискової підсистеми в режимі реального часу без зайвих ручних дій.
4. Реальні виклики з дисками та їх вирішення
Майте на увазі, що в проєктах часто трапляються сценарії, коли класичний підхід до моніторингу не працює. Розберімо дві найпопулярніші інженерні «граблі», на які стабільно наступають і джуни, і досвідчені фахівці.
Виклик №1: місце на диску є, але запис заблоковано
Дисковий простір у Linux ділиться на дві незалежні складові:
- блоки даних, де зберігається безпосередній вміст файлів;
- іноди (inodes) — індексні дескриптори, які зберігають метадані (права доступу, власника, мітки часу, покажчики на блоки). Кількість інодів фіксується ще на етапі створення файлової системи та не може збільшуватися динамічно.
Якщо ваш застосунок або runaway-процес починає генерувати мільйони дрібних файлів (наприклад, сесії PHP, що не чистяться, дрібний кеш або черги повідомлень поштового сервера), іноди закінчаться набагато раніше, ніж гігабайти. Як результат, df -h показує, що вільного місця ще повно (наприклад, 50%), але будь-які спроби створити файл чи записати лог падають із критичною помилкою No space left on device.
Як дебажити: перевірте стан індексних дескрипторів за допомогою прапорця -i:
df -ih
Якщо у виводі в колонці IUse% ви бачите 99-100%, файлова система більше фізично не здатна реєструвати нові об’єкти. Майте на увазі, що в такому сценарії вам доведеться шукати директорію з купою дрібного сміття за допомогою du та чистити її.
Виклик №2: утримання видалених файлів процесами (Disk Space Leak)
Типова ситуація на інцидентах: df -h сигналізує, що розділ /var заповнений на 98%. Ви запускаєте du -sh /var/*, щоб локалізувати проблему, але утиліта стверджує, що всі папки разом займають лише 15 Гб із 200 Гб наявних.
Куди поділися інші 185 Гб?
Причина: якийсь активний процес (наприклад, Nginx, лог-ротатор або Java-застосунок) писав дані у важкий лог-файл. Хтось із команди вирішив швидко звільнити місце і виконав команду rm /var/log/app.log.
Проте для Linux файл вважається остаточно видаленим лише тоді, коли на нього немає жодних активних посилань. Оскільки процес продовжує тримати цей файл відкритим, він продовжує писати дані в уже невидимий для дерева директорій файл. df бачить зайняті блоки через відкритий файловий дескриптор, а от du пройтися по ньому вже не може, бо файлу немає в каталозі.
Як дебажити: знайдіть процеси, які утримують видалені файли в пам’яті:
lsof | grep '(deleted)'
У виводі ви побачите PID процесу та ім’я файлу з поміткою (deleted).
Рішення: просто перезапустіть сервіс, який утримує дескриптор (наприклад, systemctl restart nginx). Файлова система остаточно звільнить блоки, і дисковий простір миттєво повернеться в систему.
5. Порівняння інструментів: df vs du
Найважче під час аварії — швидко вибрати правильний інструмент під конкретний сценарій, щоб не втрачати хвилини на очікування виводу. Порівняймо df та du через реальні кейси використання:
| Критерій | df | du |
| Об’єкт аналізу | Вся файлова система або конкретний розділ загалом. | Конкретні файли, папки та підпапки на диску. |
| Швидкість роботи | Миттєво (читає готові метадані суперблоку). | Повільно (рекурсивно обходить і підраховує кожну директорію). |
| Основне питання | «Чи є взагалі вільне місце на цьому розділі?» | «Яка саме папка чи файл зжерли мій простір?» |
Ось як це зазвичай працює: спочатку використовуйте df -h, щоб локалізувати проблему глобально та визначити забиту точку монтування (наприклад, /data). І тільки після цього спускайтеся всередину цієї директорії за допомогою du, щоб знайти точне джерело аномалії:
du -sh /data/* | sort -rh | head -n 10
6. Позбавляємося рутини: скрипт моніторингу для Cron
Хороший інженер завжди шукає спосіб позбутися мавпячої праці та ручних перевірок. Бути проактивним DevOps-фахівцем — це налаштувати автоматичні сповіщення до того, як критичний сервіс приляже через брак місця.
Нижче наведено прагматичний Bash-скрипт, який можна додати в Cron для регулярної перевірки. Він аналізує рівень заповнення диска через --output і тригерить alert, якщо ліміт перевищено.
#!/bin/bash
# Поріг спрацювання у відсотках
THRESHOLD=85
# Беремо відсоток використання та точку монтування, пропускаючи заголовок таблиці
df -h --output=pcent,target | tail -n +2 | while read -r OUTPUT; do
# Очищаємо знак % для коректного порівняння числових значень
USAGE=$(echo "$OUTPUT" | awk '{print $1}' | sed 's/%//')
MOUNT=$(echo "$OUTPUT" | awk '{print $2}')
# Перевіряємо перевищення ліміту
if [ "$USAGE" -ge "$THRESHOLD" ]; then
echo "ALERT: Диск $MOUNT заповнений на $USAGE%!" | mail -s "Disk Space Warning: $MOUNT" admin@yourcompany.com
fi
done
Достатньо зберегти цей код, видати права на виконання (chmod +x) та прописати запуск раз на годину в crontab. Скрипт працює тихо, автоматично і бере на себе рутину контролю заліза.
Підсумуємо
Утиліта df — це базовий, але водночас ефективний інструмент для контролю інфраструктури, якщо використовувати його з розумінням внутрішньої логіки ОС. Для ефективної роботи з дисковим простором достатньо зафіксувати кілька правил:
- Дивіться глибше за гігабайти
Оцінка стану дискового простору буде точнішою, якщо періодично перевіряти індексні дескриптори черезdf -ih. Нуль у колонці вільних інодів блокує роботу операційної системи так само критично, як і стовідсоткове фізичне заповнення накопичувача. - Враховуйте специфіку Linux
Якщо командиdfтаduпоказують кардинально різні цифри, причину зазвичай варто шукати або в архітектурному резервуванні 5% простору для користувача root, або в активних процесах, які продовжують утримувати дескриптори вже видалених файлів. - Дійте послідовно
Для економії часу під час інцидентів раціонально спочатку локалізувати проблему глобально за допомогою швидкої командиdf -h. Лише після визначення забитої точки монтування занурюватися в детальний аналіз каталогів черезdu.
Нехай прибуде з вами сила Linux!