Файлы, метаданные и символические ссылки
На первом шаге мы научились устанавливать рабочее окружение. Теперь рассмотрим то, с чем команды работают чаще всего: файлы и каталоги. Для веб-приложения это исходники, конфигурация, изображения, журналы и результаты сборки. Все они имеют путь, но одинаковый способ адресации не означает одинакового назначения. Если спутать конфигурацию с временным выводом, можно сохранить ненужный файл и потерять важный.
Откройте ops-lab из архива. Для урока используем fixtures/access.tsv, папку releases/release-01 и относительную символическую ссылку current, указывающую на неё. Если архиватор превратил ссылку в обычный файл, восстановление описано в stages/02/README.md. Сначала изучим различие, затем при необходимости создадим ссылку только внутри лаборатории. Настройки настоящего приложения этот шаг не затрагивает.
Путь задаёт место, а не смысл
Абсолютный путь начинается от корня файловой системы. Относительный считается от рабочего каталога. Для нашей лаборатории fixtures/access.tsv и ./fixtures/access.tsv обычно обозначают один объект. После перехода в fixtures тот же файл доступен как access.tsv, а старый относительный путь может больше не работать. Поэтому перед сопоставлением результатов полезно знать, где выполнялась команда.
pwd
ls -ld fixtures releases current
ls -l fixtures/access.tsv
ls -la releases/release-01
Параметр -d позволяет рассмотреть сам каталог, а не автоматически перечислить его содержимое. В длинной форме вывода видны тип, разрешения, владелец, группа, размер и время. Количество и порядок дополнительных полей могут зависеть от параметров. Читайте их как описание выбранного объекта, а не как универсальную таблицу состояния всего приложения.
Имя с точкой в начале обычно скрывается обычным ls. Это соглашение показа, а не отдельная защита. В выпуске лаборатории находится .release-note: параметр -a позволяет его увидеть. Скрытое имя не делает конфигурацию секретной, а отсутствие файла в коротком списке не означает его удаления. При копировании полного выпуска нужно отдельно понимать, какие имена входят в операцию.
Тип не определяется расширением
Файл access.tsv содержит табличный текст, а README.md — Markdown. Расширение помогает человеку и некоторым приложениям выбрать обработчик. Но оно не гарантирует содержимое. Двоичный файл может получить окончание .txt; переименование не преобразует его в текст. Перед чтением незнакомого большого файла полезно определить его тип, чтобы не отправить в терминал неудобные управляющие последовательности.
file fixtures/access.tsv
stat fixtures/access.tsv
file описывает обнаруженный формат, опираясь на содержимое и признаки. stat показывает метаданные, включая размер и временные поля. В справке stat для Ubuntu есть параметры форматирования, полезные для последующей автоматизации. Сейчас прочитайте обычный вывод и сравните размер с тем, сколько текста ожидаете увидеть в учебной таблице.
Временные поля отвечают на разные вопросы. Время изменения содержимого отличается от времени изменения метаданных. Последнее не является надёжной датой создания файла. Копирование, изменение разрешений и настройка файловой системы тоже влияют на наблюдаемые значения. Если задача заключается в определении версии выпуска, храните явный идентификатор в release.json, а не угадывайте его по одному времени.
Каталог организует имена
Каталог связывает имена с объектами файловой системы. Его собственный размер не равен сумме размеров всех файлов внутри. Поэтому длинный вывод ls для папки не отвечает на вопрос, сколько места занимает весь выпуск. Позже используем du и df, которые описывают разные стороны хранения. Пока важно не переносить смысл размера обычного файла на размер каталога.
Папки нашей лаборатории выражают договор: fixtures хранит неизменные учебные входные данные, evidence — собранные наблюдения, config — подготовленные настройки. Это решение проекта, а не требование ядра Linux. Система позволит сохранить журнал рядом с конфигурацией, но человеку станет сложнее понять, что можно заменить. Ясная структура снижает число таких решений во время диагностики.
Не используйте каталог backups как корзину для случайных старых файлов. Копия имеет источник, момент создания и задачу восстановления. Если эти сведения отсутствуют, имя old-final-2 помогает мало. Уже сейчас в README папки записана граница: позднее будем копировать только учебный выпуск, а база PostgreSQL потребует отдельного согласованного способа сохранения данных.
Ссылка на текущий выпуск
Символическая ссылка содержит путь к другому объекту. В длинном выводе ls обычно видно направление current -> releases/release-01. Приложение может использовать постоянный путь current, тогда как название конкретного выпуска меняется. Такая конструкция удобна для выбора версии, но сама по себе не обеспечивает безопасный деплой и не переключает уже открытые файлы работающего процесса.
readlink current
readlink -f current
ls -la current/
Первый запрос показывает сохранённое направление. Второй пытается получить канонический путь. Третий обращается к содержимому целевого каталога. Если целевой объект удалён, ссылка может остаться и стать неразрешимой. Поэтому наличие имени current недостаточно: важно проверить направление и существование того, на что оно указывает. Причина ошибки может находиться в цели, а не в самой ссылке.
Относительное направление считается от каталога, где расположена ссылка. Это отличается от привычного относительного аргумента команды, который считается от рабочего каталога оболочки. В нашем примере current находится рядом с releases, поэтому строка releases/release-01 сохраняет смысл после переноса всего ops-lab. Абсолютная ссылка на каталог конкретного пользователя переносится значительно хуже.
Если ссылки нет, создайте её внутри лаборатории командой ln -s releases/release-01 current. Сначала убедитесь, что имя current свободно; команда не должна заменять неизвестный файл. Для урока не нужен принудительный режим. Ручной выбор яснее автоматического перезаписывания, пока мы только изучаем устройство объекта и не построили процедуру управления выпуском.
Что записать в наблюдение
В evidence/files.md отметьте расположение выпуска, тип журнала, направление ссылки и идентификатор из release.json. Сравните явную версию с именем папки. Если они различаются, это отдельный повод проверить подготовку выпуска: имя каталога не изменяет данные внутри JSON. Такая запись позволяет позже отличить ошибку упаковки от ошибки запуска службы.
Представим, что после переноса архива приложение сообщает «конфигурация отсутствует». Возможные причины различны: неправильный рабочий каталог, скрытое имя, сломанная ссылка или действительно пропущенный файл. Наши команды дают сведения для разделения этих случаев. Вы уже можете составить последовательность вопросов, вместо того чтобы сразу создавать пустую конфигурацию и скрывать исходную проблему.
Результат урока — понятная структура объектов и исправная учебная ссылка на выпуск. Мы различаем имя, содержимое и метаданные, знаем ограничения временных полей и понимаем переносимость относительного направления. Следующий шаг посвящён потокам: увидим, как программа получает данные и куда направляет обычный результат и сообщение об ошибке.