Практичне введення в grep для Linux: як працює команда, які прапори дійсно потрібні, типові помилки та реальні сценарії використання grep в адмініструванні, роз...
Блог компанії 3v-Hosting
7 хв.
Навіть якщо сервер спочатку налаштований належним чином, з часом на ньому все одно накопичується багато зайвого. Логи постійно зростають, резервні копії залишаються після тестів, старі архіви роками лежать без діла. Docker взагалі здатний місяцями зберігати невикористовувані образи, контейнери та томи, поступово поглинаючи вільне місце на диску вашого сервера.
І в якийсь момент диск виявляється майже заповненим, внаслідок чого сервіси починають працювати з перебоями, оновлення завершуються помилками, а запис нових даних стає проблемою.
Звісно, для будь-якого адміністратора причина відразу стає більш ніж очевидною. Залишається лише з’ясувати, які файли або каталоги займають найбільше місця на диску, а потім вирішити, що з ними робити: видалити, перенести в інше сховище або увімкнути автоматичне очищення.
У цій короткій статті ми наведемо кілька способів, які допомагають знайти головних «пожирачів» дискового простору на Linux-сервері та з’ясувати, які файли займають найбільше місця. Поїхали!
Шукати великі файли навмання - не найкраща ідея, і спочатку варто в загальних рисах зрозуміти, наскільки заповнені файлові системи та який розділ відчуває брак вільного місця.
Для цього виконайте команду:
df -h
Вона покаже розмір кожного розділу, обсяг зайнятого та вільного простору, а також відсоток використання диска у зручному для читання вигляді завдяки аргументу -h (від human). Нерідко виявляється, що проблема криється зовсім не в кореневому розділі /, а, наприклад, у /var, де накопичуються логи та дані додатків, або у /home, якщо на сервері працюють кілька користувачів і зберігають у своїх домашніх папках завантажені з мережі файли.
Якщо якийсь розділ заповнений майже повністю, то подальший пошук краще зосередити саме на ньому, причому не відкладаючи цю роботу на потім і не чекаючи, поки вільне місце закінчиться остаточно. Вже при заповненні диска на 90–95 % деякі служби, наприклад поштові сервери, бази даних або системи журналювання, можуть почати працювати з помилками або помітно сповільнити свою роботу.
Коли стає зрозуміло, який розділ переповнений, можна з’ясувати, що саме займає весь вільний простір. Найпростіше почати з каталогів верхнього рівня, а потім заглиблюватися в той каталог, який виявиться найбільшим.
Для цього виконайте команду:
du -h --max-depth=1 /
Вона підрахує розмір кожного каталогу першого рівня. Найчастіше найбільше місця займають /var, /home, /opt, /srv або /tmp, хоча на конкретному сервері ситуація може виявитися зовсім іншою.
Коли ви знайшли підозрілий каталог, продовжуйте й заглиблюйтеся ще на один рівень. Наприклад, якщо найбільше місця займає /var, тоді виконайте команду:
du -h --max-depth=1 /var
Так поступово можна дістатися до каталогу, який і став причиною нестачі вільного місця, і зазвичай на це йде всього кілька хвилин.
Якщо каталогів занадто багато, то найзручніше буде відразу відсортувати їх за розміром:
du -h --max-depth=1 /var | sort -hr
Найоб’ємніші каталоги опиняться на початку списку, і вам не доведеться переглядати результати вручну, прокручуючи вивід.
Такий підхід особливо зручний під час роботи з VPS або віддаленим виділеним сервером через SSH, коли під рукою немає зручних графічних утиліт для аналізу використання диска.
Коли проблемний каталог виявлено, можна переходити до пошуку найбільших файлів у ньому, про які давно забули, але які інколи можуть займати десятки гігабайтів.
Для цього підійде команда:
find / -type f -size +500M
Вона знайде всі файли розміром понад 500 МБ. За потреби поріг легко змінити, вказавши, наприклад, +1G або +100M.
Якщо відомо, у якому каталозі чи розділі закінчується місце, а це ми з’ясували вище, то краще обмежити область пошуку саме цим каталогом:
find /var -type f -size +500M
Так команда виконається значно швидше, оскільки не буде обходити всю файлову систему.
Буває, що потрібен не просто список файлів, розмір яких перевищує певний, а рейтинг найважчих об’єктів. У цьому випадку допоможе комбінація find, du та sort:
find / -type f -exec du -h {} + | sort -hr | head -20
Ця команда виведе двадцять найбільших файлів на сервері. Зазвичай у цьому списку виявляються старі резервні копії баз даних, ISO-образи, архіви, дампи пам’яті, журнали додатків або інші файли, які давно перестали бути потрібними, але продовжують займати дисковий простір.
Дуже часто винуватцями виявляються звичайні журнали. Вони зростають непомітно й повільно, але постійно, якщо на вашому сервері не налаштована ротація журналів. У результаті, через кілька тижнів або місяців активної роботи сервера, якийсь один файл журналу легко може займати десятки гігабайтів.
Отже, спочатку варто перевірити, скільки місця займають усі журнали в каталозі /var/log:
du -sh /var/log/*
Якщо сервер використовує systemd, то корисно буде перевірити розмір системного журналу:
journalctl --disk-usage
Буває, що саме journald займає кілька гігабайтів, особливо на серверах із великою кількістю подій або увімкненим детальним логуванням.
Старі записи можна видалити, залишивши лише журнали за останні сім днів:
journalctl --vacuum-time=7d
Таке очищення звільняє місце без ризику втратити свіжі журнали, які ще можуть знадобитися для діагностики. Якщо ж ваш сервер працює вже давно, то варто одразу перевірити або налаштувати logrotate, інакше навіть після очищення проблема через деякий час неодмінно повториться.
Якщо на сервері використовується Docker, то перевіряти варто не тільки звичайні файли, оскільки контейнери часто залишають після себе дані, які продовжують займати місце навіть після видалення проєкту. Зазвичай це старі образи, зупинені контейнери, невикористовувані томи та кеш збірки. Поступово вони накопичуються, особливо на серверах, де регулярно тестуються нові версії додатків, і з часом забивають місце на диску.
Перевірити, скільки місця займає кожен тип даних, допоможе команда:
docker system df
Вона покаже загальний обсяг, зайнятий образами, контейнерами, томами та кешем збірки.
Якщо непотрібні дані дійсно накопичилися, їх можна видалити:
docker system prune -a
!!!АЛЕ, з цією командою краще не поспішати. Перед очищенням перевірте, які об’єкти будуть видалені, особливо якщо ваш сервер використовується в робочому середовищі, адже часто старий образ виявляється єдиною можливістю швидко відкотити додаток після невдалого оновлення.
Стандартних утиліт Linux зазвичай цілком вистачає, щоб знайти причину нестачі місця. Але є програми, з якими ця робота стає помітно швидшою. І одна з найпопулярніших - це ncdu.
Після встановлення достатньо виконати:
ncdu /
Через кілька секунд відкриється інтерактивний інтерфейс. У ньому можна переміщатися по каталогах за допомогою клавіш, одразу бачити їхній розмір і швидко знаходити найоб’ємніші каталоги. Якщо потрібно, то непотрібні файли та каталоги можна видалити прямо з ncdu (хоча на виробничих серверах краще не поспішати й спочатку переконатися, що вони дійсно більше не потрібні).
Багато системних адміністраторів використовують ncdu майже щодня, оскільки коли потрібно швидко з’ясувати, куди зник вільний простір, такий інтерфейс виявляється зручнішим, ніж послідовний запуск du, find та sort.
Одноразове очищення звільняє місце, але очевидно, що через деякий час проблема повториться, і причиною цього є постійне накопичення даних.
Тому має сенс один раз налаштувати регулярне обслуговування сервера. Ротація логів за допомогою logrotate, видалення тимчасових файлів, контроль резервних копій, періодичне очищення Docker та інших систем, що створюють кеш, позбавляють від більшості подібних ситуацій у майбутньому.
Не менш корисним є моніторинг вільного місця, щоб сервер заздалегідь надсилав повідомлення про те, що розділ заповнений, наприклад, на 80-85% - тоді часу на реагування буде достатньо, і вам не доведеться розбиратися з проблемою вже після того, як перестануть запускатися служби або база даних перейде в режим помилок. Для серверів, на яких працюють сайти, CRM, бази даних та інші важливі сервіси, такий підхід зазвичай виявляється набагато дешевшим за будь-яке аварійне очищення.
На робочих серверах краще використовувати систему моніторингу, яка заздалегідь попередить про нестачу місця. Якщо її немає, то періодично перевіряйте стан дисків за допомогою df -h, особливо після оновлень та створення резервних копій. А періодичність залежить від інтенсивності використання сервера.
/var/log?Не варто. Деякі служби продовжують використовувати відкриті лог-файли. Найбезпечніше буде застосовувати logrotate або очищати журнали через journalctl.
Для ручного аналізу чудово підходить ncdu. Але якщо потрібен пошук у скриптах або автоматизація, то зручніше використовувати find, du та sort.
Швидше за все, файл досі відкритий якимось процесом. Перевірити це можна командою lsof +L1. Зазвичай достатньо перезапустити відповідну службу.
docker system prune -a?Не завжди. Ця команда видаляє всі невикористовувані образи та інші дані Docker. Перед запуском переконайтеся, що вони не знадобляться для відкату або повторного розгортання.
Налаштуйте ротацію логів, стежте за резервними копіями, періодично очищайте непотрібні дані Docker та використовуйте моніторинг вільного місця. Це набагато ефективніше, ніж регулярне ручне очищення.
Пошук файлів, які займають найбільше місця - це одне з тих завдань, з якими в першу чергу стикається будь-який адміністратор Linux-сервера. У більшості випадків достатньо кількох стандартних утиліт, щоб швидко знайти джерело проблеми та звільнити місце на диску.
Але ще краще не чекати, поки місце закінчиться, а виконати кілька налаштувань, які запобігатимуть цій проблемі. Регулярний моніторинг, налаштування ротації логів та періодичне очищення непотрібних даних дозволяють заздалегідь уникнути більшості подібних ситуацій.
Якщо обсяг даних постійно зростає, то при виборі VPS або виділеного сервера варто заздалегідь враховувати можливість розширення дискового простору. Це спростить масштабування інфраструктури та позбавить від термінового перенесення сервісів у найневідповідніший момент.
Налаштування аліасів bash у Linux для швидкого адміністрування серверів. Практичні приклади, корисні команди, рекомендації щодо роботи з ~/.bash_aliases та підв...
Детальний посібник з використання tmux для Linux та VPS: встановлення, створення сесій, робота з вікнами та панелями, гарячі клавіші та захист тривалих процесів...
Як визначити, хто видалив файл на сервері під управлінням Linux. Перевірка історії команд Bash, системних журналів, auditd, Docker, Git та інших джерел, які доп...