Linux: место на диске и подготовка файловой копии
Нехватка места может остановить запись журнала, загрузку изображения или сохранение временного файла. Приложение при этом иногда продолжает отвечать на простые запросы, поэтому признак не всегда выглядит как полный отказ. Для диагностики нужно понять, на какой файловой системе выполняется запись и что именно занимает пространство. Общий размер диска машины не отвечает на оба вопроса сразу.
В этой главе продолжаем работу внутри ops-lab. Учебный выпуск releases/release-01 мал и не содержит базы PostgreSQL. Мы рассмотрим доступное место, размеры каталогов, список выбранных файлов и упаковку этого выпуска. Никакие данные автоматически не удаляются. Решение о сроках хранения появится только после понимания источника и задачи восстановления.
Свободное место относится к файловой системе
Команда df показывает сведения о файловой системе, содержащей выбранный путь. Передайте точку, чтобы рассмотреть текущую лабораторию. Если приложение пишет в другую смонтированную папку, для него потребуется другой путь, даже на той же машине.
df -h .
df -i .
Первый вывод удобен для оценки объёма блоков, второй — количества inode. Множество маленьких файлов может исчерпать доступные inode, хотя байтов ещё достаточно. Поэтому ошибка создания файла не всегда объясняется одной колонкой свободного пространства. Запишите оба наблюдения и путь. Для каталога загрузок службы выберите именно его файловую систему, а не домашнюю папку оператора.
Доступное обычному пользователю место может отличаться от общего свободного пространства из-за устройства файловой системы и резервов. Не обещайте приложению весь показанный размер. Также учитывайте лимиты контейнера и квоты, если они используются. Команда даёт важный слой наблюдения, но политика хранилища может добавить другие ограничения, которые придётся рассмотреть отдельно.
Размер каталога отвечает на другой вопрос
du оценивает использование места выбранными файлами и каталогами. Для нашей лаборатории ограничим глубину и покажем первые уровни. Это помогает выбрать область, которую стоит исследовать подробнее, вместо обхода всего сервера без ясной задачи.
du -h --max-depth=1 .
du -h --max-depth=1 evidence backups releases
Размер, который хранится в метаданных самого каталога, не равен сумме его содержимого. Это уже обсуждали во втором уроке. Теперь видим отдельный инструмент для задачи накопленного использования. Сравнивайте результаты с пониманием жёстких ссылок, разреженных файлов, разрешений и смонтированных объектов: они могут влиять на то, что было подсчитано и что осталось вне наблюдения.
Если df показывает мало места, а просмотренные каталоги малы, возможны другие источники на той же файловой системе. Ещё один случай — удалённый файл остаётся открытым процессом. Его имя уже не видно обычному обходу каталога, но место может оставаться занятым до закрытия дескриптора. Здесь пригодится наблюдение открытых файлов, а не повторное удаление случайных каталогов.
Список кандидатов сохраняем до действия
Команда find умеет выбрать файлы по типу, глубине, размеру и времени. В лаборатории ограничим область evidence, обычные файлы и размер больше одного мегабайта. На маленьком исходном наборе отсутствие результата является ожидаемым состоянием. Оно не означает, что поиск выполнился неправильно.
find evidence -maxdepth 2 -type f -size +1M -print
В справке find для Ubuntu описаны условия и порядок обработки выражения. Здесь используем только печать. Не добавляйте удаление к незнакомой выборке, пока не прочитали полученный список и не определили назначение данных. Крупный файл может оказаться единственной полезной копией, а маленький — содержать ключевую конфигурацию.
Время изменения тоже не является политикой хранения само по себе. Старый файл выпуска может понадобиться для отката, а новый временный файл — уже потерять смысл. Условие «старше семи дней» описывает возраст, но не необходимость. Сначала классифицируйте объект: выпуск, наблюдение, вложение, база или временный результат. Затем для каждого класса можно задать отдельный договор.
Имена файлов могут содержать пробелы и другие специальные символы. Поэтому передача списка через обычное разбиение текста опасна для автоматизации. В дальнейших сценариях будем использовать известные пути и массивы, а для произвольного набора нужен надёжный разделитель вроде нулевого байта. Красивый построчный список подходит человеку, но не всегда является готовым форматом аргументов следующей команды.
Упаковка известного выпуска
Создадим архив только из release-01, поместив результат вне дерева источника. Параметр -C задаёт место, откуда читаются имена, поэтому внутри архива будет относительный каталог выпуска. Это упрощает просмотр состава и последующее извлечение в отдельную папку.
tar -czf backups/release-01.tar.gz -C releases release-01
tar -tzf backups/release-01.tar.gz
Первая команда записывает новую копию; выберите свободное имя, если сохраняете несколько состояний. Вторая читает список содержимого. В нём ожидаются README, release.json и скрытая заметка. Не исключайте автоматически имена с точкой: они могут входить в важную конфигурацию. При этом сам факт включения файла не говорит, что его содержание пригодно для восстановления.
В справке tar различаются создание, просмотр и извлечение. Сейчас ограничиваемся первыми двумя. Для незнакомого архива сначала нужен состав, затем отдельное место извлечения. Замена действующего приложения является другой операцией и требует согласованной процедуры; учебная упаковка не даёт такого результата автоматически.
Архиватор не блокирует исходные файлы на всё время чтения. Если кто-то меняет выпуск во время упаковки, разные файлы могут попасть в архив из разных состояний. Поэтому здесь выбран именно неизменный release-01. Сохраните его идентификатор рядом с названием архива и временем операции. Для работающего каталога сначала определяют способ остановить изменения или получить согласованный снимок, а затем выбирают средство упаковки. Одна замена tar другим инструментом эту задачу не решает.
Копия файла и копия состояния
Наш архив сохраняет маленький неизменный выпуск. Он не содержит работающую базу и пользовательские загрузки. У приложения эти части живут отдельно и могут изменяться во время копирования. Поэтому готовый .tar.gz не является резервной копией всего сервиса только из-за удачного расширения. Требуется перечень компонентов, граница согласованности и порядок восстановления каждого из них.
В evidence/storage.md запишите файловую систему, доступные блоки и inode, интересующие каталоги и состав созданной копии. Для каждого утверждения укажите путь и время наблюдения. Если объём растёт, сравнивайте один и тот же объект и метод, иначе разница источников будет выглядеть как рост данных. Результат урока — понятное наблюдение хранения и ограниченная файловая копия. Затем объединим повторяющиеся действия в Bash-сценарии с явными параметрами и обработкой ошибок.