Диск заповнений після видалення файлів: причини та діагностика в Windows, Linux і контейнерах
Видалення великого файлу не завжди означає миттєве повернення вільного місця на диску. Багато користувачів стикаються з ситуацією, коли після видалення ISO-образу, резервної копії, логів або архіву на 50 ГБ система продовжує показувати той самий рівень заповнення накопичувача. Особливо часто це трапляється у Windows, Linux-серверах, віртуальних машинах та контейнеризованих середовищах.
На практиці проблема зазвичай не пов’язана з несправністю диска. Найчастіше причина полягає у механізмі роботи файлової системи, кошику, відкритих дескрипторах файлів, снапшотах або затримці оновлення метаданих. Для системного адміністратора чи DevOps-інженера важливо розуміти, де саме шукати джерело проблеми.
У цій статті розглянемо, чому після видалення файлу місце не повертається, як перевірити це у Windows та Linux, а також які інструменти реально допомагають звільнити простір без перезавантаження сервера чи втрати даних.
Чому після видалення файлу диск залишається заповненим
Причин може бути кілька:
- Файл переміщено до кошика, а не видалено остаточно.
- Файл досі використовується процесом.
- Файлова система ще не оновила статистику.
- Є снапшоти, shadow copies або резервні копії.
- Простір зайнятий тимчасовими файлами.
- Видалення відбулося всередині контейнера чи віртуального диска.
- Є проблема з inode або файловою системою.
Розглянемо кожен випадок детально.
Windows: файл видалено, але місце не повернулося
Кошик займає місце
У Windows натискання Delete зазвичай переміщує файл у Recycle Bin. Файл фізично залишається на диску.
Що зробити:
- Очистити кошик вручну.
- Використати Shift + Delete для безповоротного видалення.
- Перевірити системні диски окремо.
Через PowerShell:
Clear-RecycleBin -Force
Shadow Copies та точки відновлення
Windows може зберігати попередні версії файлів або резервні знімки.
Перевірка:
vssadmin list shadowstorage
Видалення старих копій:
vssadmin delete shadows /for=C: /oldest
Використовуйте обережно, оскільки це впливає на відновлення системи.
Файл утримується процесом
Програма могла відкрити файл і не закрити дескриптор. Навіть після видалення Windows може не звільняти простір одразу.
Інструменти:
- Process Explorer
- Resource Monitor
- Handle.exe від Sysinternals
Приклад:
handle.exe filename.log
Linux: файл видалено, але диск усе ще заповнений
Це один із найчастіших кейсів на серверах.
Видалений файл використовується процесом
У Linux файл можна видалити, але якщо процес тримає його відкритим - дані залишаються на диску до завершення процесу.
Класичний приклад:
- nginx log file
- java application log
- backup archive in progress
Перевірка:
lsof | grep deleted
Або:
lsof +L1
Це покаже файли зі статусом deleted, які ще відкриті процесами.
Приклад виводу:
java 1422 appuser 5w REG 8,1 53687091200 /var/log/app.log (deleted)
Тут Java-процес утримує файл на 50 ГБ.
Рішення:
Перезапустити сервіс:
systemctl restart myapp
Або завершити процес:
kill -TERM 1422
Після закриття дескриптора місце звільниться.
Перевірка різниці між df і du
Якщо df показує заповнений диск, а du - ні, майже завжди причина у відкритих видалених файлах.
Команди:
df -h
du -sh /var
Пояснення:
dfпоказує реальне використання файлової системи.duрахує наявні файли в каталогах.
Якщо файл видалено, du його вже не бачить, а df ще враховує.
Docker та контейнери
У контейнерних середовищах видалення файлу всередині контейнера не завжди повертає місце хосту.
Перевірка Docker:
docker system df
Очищення:
docker system prune -a
Видалення невикористаних томів:
docker volume prune
Важливо:
Перед очищенням перевіряйте, чи томи не містять production-даних.
Kubernetes: проблема з ephemeral storage
У Kubernetes видалення логів або кешу в контейнері може не дати ефекту через:
- container runtime cache
- overlayfs layers
- image cache
- node pressure
Перевірка вузла:
df -h
crictl images
crictl ps -a
Очищення:
crictl rmi --prune
Віртуальні машини: VMDK, VHDX, QCOW2
У віртуалізації гостьова ОС може звільнити місце, але файл віртуального диска на хості не зменшиться автоматично.
Приклад:
Ви видалили 50 ГБ у VM, але файл server.vhdx залишився тим самим.
Рішення:
Hyper-V:
Optimize-VHD -Path "D:\VM\server.vhdx" -Mode Full
VMware:
Виконати guest zeroing + compact.
QCOW2:
qemu-img convert -O qcow2 old.qcow2 new.qcow2
macOS: локальні snapshots Time Machine
На macOS місце може утримуватися локальними снапшотами.
Перевірка:
tmutil listlocalsnapshots /
Видалення:
sudo tmutil deletelocalsnapshots <date>
Файлова система пошкоджена або кеш не оновився
Іноді статистика диска оновлюється із затримкою.
Linux:
sync
Потім повторити:
df -h
Перевірка файлової системи:
fsck /dev/sda1
Лише на відмонтованому розділі або в maintenance mode.
Windows:
chkdsk C: /f
Як швидко знайти, що займає диск
Linux
Топ великих директорій:
du -xh / | sort -rh | head -20
ncdu - найзручніший інструмент:
apt install ncdu
ncdu /
Windows
PowerShell:
Get-ChildItem C:\ -Recurse | Sort-Object Length -Descending | Select-Object FullName,Length -First 20
GUI інструменти:
- WinDirStat
- TreeSize
- WizTree
Практичний кейс: лог-файл 50 ГБ на Linux
Ситуація:
- Сервер Ubuntu
/var/log/app.logвиріс до 50 ГБ- Адміністратор виконав:
rm /var/log/app.log
Місце не звільнилось.
Діагностика:
lsof | grep deleted
Результат:
python3 PID 1234 /var/log/app.log (deleted)
Вирішення:
systemctl restart app.service
Після цього:
df -h
Вільне місце повернулося.
Як зробити правильно:
Не видаляти лог, а очищати:
truncate -s 0 /var/log/app.log
Або налаштувати logrotate.
Як уникнути проблеми надалі
Для Linux-серверів
- Використовуйте logrotate.
- Моніторте disk usage через Prometheus/Zabbix.
- Перевіряйте
lsof +L1. - Не видаляйте активні лог-файли вручну.
Для Windows
- Контролюйте Recycle Bin.
- Чистіть temp-каталоги.
- Керуйте restore points.
- Використовуйте Storage Sense.
Для Docker/Kubernetes
- Регулярно чистіть images.
- Обмежуйте log size.
- Використовуйте retention policy.
- Моніторте node storage pressure.
Алгоритм діагностики, якщо місце не звільнилось
- Перевірити кошик.
- Оновити статистику диска.
- Знайти великі каталоги.
- Перевірити відкриті deleted файли.
- Перевірити снапшоти.
- Перевірити Docker/VM storage.
- Перезавантажити сервіс або систему за потреби.
Висновки
Якщо після видалення файлу на 50 ГБ місце не звільнилось - це не аномалія, а типовий сценарій роботи сучасних ОС та файлових систем. Найчастіше проблема полягає не у самому видаленні, а в тому, що файл усе ще використовується процесом, переміщений у кошик або утримується снапшотами.
Для Windows основний фокус - кошик, shadow copies та відкриті файли. Для Linux - lsof, df, du, logrotate та процеси, що тримають дескриптори. У контейнерних середовищах варто окремо перевіряти image cache і storage driver.
Грамотна діагностика дозволяє звільнити десятки або сотні гігабайтів без ризику для production-середовища та без зайвого простою сервісів.