Утилита rpm-ostree#

Описание#

rpm-ostree — это гибридная система по управлению образами и пакетами; она использует OSTree для работы с образами и RPM для работы с пакетами. Поддерживает сборку RPM на стороне сервера в виде коммита OSTree (образа), и клиенты могут реплицировать его побитово с быстрыми инкрементальными обновлениями. Кроме того, гибридный характер системы проявляется в возможности многослойного наложения пакетов на стороне клиента и их переопределения.

В системе, управляемой rpm-ostree, традиционные инструменты yum/dnf (если установлены) и rpm работают в режиме только для чтения; база данных RPM хранится в каталоге /usr/share/rpm, который подключен только для чтения.

Вместо попакетного обновления «на лету» (в режиме реального времени) базовый слой OSTree реплицирует полное дерево файловой системы с компонующего (compose) сервера в новое развертывание, доступное после перезагрузки. Одним из преимуществ такого подхода является доступность предыдущего развертывания для отката. Это также упрощает надежную постановку обновления в очередь (queue) без какого-либо влияния на работающую систему. Однако в настоящее время существует экспериментальная команда livefs, которая поддерживает изменение запущенной файловой системы.

В модели «чистой репликации» нет накладных расходов на управление пакетами на стороне клиента. Разрешение зависимостей, маркировка SELinux, выполнение всех скриптов и т.д. происходят на стороне сервера и фиксируются в коммите OSTree.

Синтаксис утилиты:

rpm-ostree [<option>] [<command>] [<command_options>...]

Где:

  • <option> - опции утилиты;

  • <command> - команда (подробнее о доступных командах - в разделах ниже);

  • <command_options> - опции команд.

Настройка утилиты производится с помощью конфигурационного файла /etc/rpm-ostreed.conf.

Опции#

Опции утилиты представлены в таблице ниже.

Опции rpm-ostree#

Опция

Описание

-h, --help

Показывает справку по утилите и завершает работу

--version

Выводит информацию о версии утилиты и завершает работу

-q, --quiet

Отключает вывод большинства информационных сообщений

Опция -h (--help) также актуальна для всех команд утилиты - справку по каждой команде можно получить, выполнив ее с данной опцией. Например, для получения справки по rpm-ostree install выполните:

rpm-ostree install --help

Команды на стороне клиента#

cancel#

Отменяет ожидающую транзакцию. Команда завершается успешно и не выполняет никаких действий, если нет запущенных транзакций. Отмена ожидающих транзакций, в том числе таких как обновление, полностью безопасна.

db#

Предоставляет информацию, относящуюся к данным RPM-пакетов в деревьях файловой системы в коммитах OSTree.

Подкоманды db представлены в таблице ниже.

Подкоманды db#

Подкоманда

Описание

diff

Показывает отличие пакетов между деревьями в двух ревизиях (revs). Если ревизии не указаны, то загруженный коммит сравнивается с коммитом, ожидающим фиксации. Если указана только одна ревизия, то загруженный коммит сравнивается с ней. Опция --format=diff использует символ - для удаленных пакетов, + - для добавленных пакетов, ! - для старой версии обновленного пакета с последующим = для новой версии

list

Показывает, какие пакеты находятся в коммите (работает аналогично dnf list). Необходимо указать хотя бы один коммит, также можно указать несколько или диапазон коммитов

version

Показывает rpmdb-версию пакетов в коммите (работает аналогично dnf version nogroups). Необходимо указать хотя бы один коммит, также можно указать несколько или диапазон коммитов

deploy#

Принимает в качестве аргумента версию, ветку или идентификатор коммита и создает на его основе новое развертывание, устанавливая его как значение по умолчанию для следующей загрузки. В отличие от большинства других команд, эта команда автоматически извлекает и просматривает историю источника, чтобы найти целевой объект. Предполагается, что это не окажет никакого влияния на текущее дерево файловой системы. Для вступления изменений в силу требуется перезагрузка.

Кроме того, команда ставит в очередь обновление для всех дополнительных, «наложенных» (layered) пакетов.

Опции команды представлены в таблице ниже.

Опции deploy#

Опция

Описание

--unchanged-exit-77

Завершает с кодом состояния 77, если система уже находится на указанном коммите. Это триггерная модель возврата, которая предназначена для поддержки инструментов автоматизации систем, ориентированных на идемпотентность, таких как Ansible

-r, --reboot

Выполняет перезагрузку (для применения изменений) после подготовки обновления

--preview

Загружает метаданные для просмотра различий в RPM-пакетах, но не создает при этом новое развертывание

-C, --cache-only

Выполняет операцию, не пытаясь загрузить целевое дерево с удаленного сервера или получить последние пакеты

--download-only

Загружает целевой OSTree и наложенные RPM, без фактического выполнения развертывания. Можно использовать вместе с последующим вызовом --cache-only, чтобы выполнить операцию полностью в автономном режиме

install#

Устанавливает отдельные дополнительные пакеты. В качестве аргументов принимает один или несколько пакетов. Пакеты загружаются из включенных репозиториев, указанных в каталоге /etc/yum.repos.d/, и накладываются поверх нового развертывания. Также можно указать локальный RPM-пакет, находящийся на хосте. Наложенные пакеты позже могут быть удалены с помощью команды uninstall.

Внесение локальных изменений на уровне машины переведет rpm-ostree на работу в полностью гибридном режиме. С этого момента rpm-ostree начнет извлекать данные из всех включенных репозиториев rpm-md (yum) и использовать их для обновления пакетов при каждом вызове команды rpm-ostree upgrade, а также при выполнении других операций, таких как rebase.

rpm-ostree запоминает эти запросы даже если последующее обновление хоста уже включает эти пакеты: если впоследствии пакеты снова будут удалены из базового слоя, rpm-ostree вернется к их наложению.

Обратите внимание, что по умолчанию указание в команде install пакета, который уже находится в базовом слое, приводит к ошибке, если не указана опция --allow-inactive. Это может быть полезно, если ожидается удаление базового пакета.

Опции команды представлены в таблице ниже.

Опции install#

Опция

Описание

--idempotent

Игнорирует ошибку и не выводит ее, если запрос на установку пакета уже существует

-r, --reboot

Выполняет перезагрузку после подготовки развертывания

-n, --dry-run

Завершает работу после вывода транзакции, не скачивая пакеты и не создавая новое развертывание

--allow-inactive

Разрешает запросы на установку пакетов, которые уже находятся в базовом слое

-C, --cache-only

Выполняет операцию, не пытаясь загрузить последние пакеты

--download-only

Загружает целевые наложенные RPM-пакеты, не выполняя развертывание. Можно использовать вместе с последующим вызовом --cache-only, чтобы выполнить операцию полностью автономно

-A, --apply-live

Выполняет последующую операцию apply-live, чтобы применить изменения к текущему загруженному развертыванию

--force-replacefiles

Позволяет одному пакету перезаписывать файлы другого без необходимости пересборки всего пакета ядра

uninstall#

В качестве аргументов принимает один или несколько пакетов. Пакеты удаляются из набора пакетов, которые в данный момент наложены. Оставшиеся пакеты в наборе (если таковые имеются) загружаются из включенных репозиториев в /etc/yum.repos.d/ и накладываются поверх нового развертывания.

Опции команды представлены в таблице ниже.

Опции uninstall#

Опция

Описание

-r, --reboot

Выполняет перезагрузку после подготовки развертывания

-n, --dry-run

Завершает работу после вывода информации о транзакции, не скачивая пакеты и не создавая новое развертывание

В качестве аргументов принимает один или несколько условий запроса. Выполняет поиск пакетов во включенных репозиториях, указанных в каталоге /etc/yum.repos.d/. Пакеты могут быть наложены и удалены с помощью команд install и uninstall.

rebase#

Переключает на другой базовый образ, сохраняя при этом все состояния, которые обычно сохраняются при обновлении (upgrade), такие как изменения в /etc, любые наложенные RPM-пакеты и т.д.

Для перехода на образы контейнеров в синтаксисе используются ссылки на образы контейнеров OSTree, которые объединяют передачу образов с обязательной схемой проверки целостности. Модель OSTree поощряет подписание контейнерных образов, поскольку они должны быть полностью доверенными. Примеры ссылок для указания источников образов контейнеров:

  • ostree-image-signed:docker://quay.io/exampleos/custom:latest - загрузит образ из удаленного реестра и выдаст ошибку, если бэкенд контейнера не требует подписей.

  • ostree-unverified-registry:quay.io/exampleos/custom:latest - загрузит образ из удаленного реестра, и подпись не будет обязательной. На практике это просто сокращение для ostree-unverified-image:docker://quay.io/exampleos/custom:latest.

  • ostree-unverified-image:oci:/path/to/dir.oci - загрузит из локального неподписанного OCI-каталога (целостность этого каталога может быть проверена вне зависимости от текущего процесса).

Для переключения между ветками OSTree используется синтаксис rebase <remotename>:<branchname>. В качестве альтернативы можно использовать опции, указанные ниже. Если в аргументах указан только <branchname>, то будет использоваться тот же удаленный сервер, что и ранее. Также можно опустить один из значений <remotename> или <branchname>, сохранив двоеточие. В первом случае будет идти речь о локальной ветке; во втором случае будет использована та же ветка, но на другом удаленном сервере.

Эта команда также поставит в очередь обновление для всех наложенных пакетов.

Опции команды представлены в таблице ниже.

Опции rebase#

Опция

Описание

-b, --branch

Задает имя ветки

-m, --remote

Определяет имя удаленного источника

-C, --cache-only

Выполняет переключение, не пытаясь загрузить целевое дерево с удаленного источника или получить последние пакеты

--download-only

Загружает целевой OSTree и наложенные RPM, не выполняя фактическое развертывание. Можно использовать вместе с последующим вызовом --cache-only, чтобы выполнить операцию полностью автономно

rollback#

OSTree управляет упорядоченным списком записей загрузчика, называемых развертываниями (deployments). Запись с индексом 0 является записью загрузчика по умолчанию. Каждая запись имеет отдельный /etc, но все они имеют общий /var. Можно использовать загрузчик для выбора между записями, нажав клавишу Tab для прерывания запуска.

Эта команда изменяет запись загрузчика по умолчанию. Если загружена текущая запись, то установит в качестве значение по умолчанию предыдущую. В противном случае сделает значением по умолчанию текущее загруженное дерево.

Опция команды - -r, --reboot - выполняет перезагрузку после подготовки отката.

status#

Предоставляет информацию о текущем используемом развертывании. Выводит имена и спецификации всех возможных развертываний таким образом, что первое развертывание в списке является значением по умолчанию при загрузке системы. Развертывание, помеченное символом , является текущим загруженным развертыванием, а r указывает на самое последнее обновление (самую новую версию развертывания).

Опции команды представлены в таблице ниже.

Опции status#

Опция

Описание

-v, --verbose

Выводит более подробную информацию, такую как различия между пакетами, рекомендации, идентификаторы пользователей GPG-подписей и имена пользователей StateRoot

-a, --advisories

Расширяет список рекомендаций, если они есть

-b, --booted

Выводит информацию только о загруженном развертывании

--pending-exit-77

Завершает работу с кодом состояния 77, если доступно ожидающее развертывание. Это может быть полезно при написании скриптов

--json

Выводит информацию о состоянии в формате JSON для удобства использования в скриптах

-J, --jsonpath=<expression>

Фильтрует вывод JSON с помощью выражения JSONPath

upgrade#

Загружает последнюю версию текущего дерева и развертывает его, установив как значение по умолчанию для следующей загрузки. Это никак не повлияет на текущее дерево файловой системы. Чтобы изменения вступили в силу, необходимо перезагрузить систему.

Опции команды представлены в таблице ниже.

Опции upgrade#

Опция

Описание

--unchanged-exit-77

Завершает с кодом состояния 77, если система уже обновлена. Это триггерная модель возврата, которая предназначена для поддержки инструментов автоматизации систем, ориентированных на идемпотентность, таких как Ansible

-r, --reboot

Выполняет перезагрузку после подготовки обновления

--allow-downgrade

Разрешает развертывание более старых (в хронологическом порядке) деревьев

--preview

Загружает только /usr/share/rpm, чтобы выполнить сравнение пакетов между двумя версиями

--check

Проверяет, доступно ли обновление, без его загрузки или выполнения сравнения на уровне пакетов. Использование этой опции принудительно обновит метаданные RPM из включенных репозиториев в /etc/yum.repos.d/, если есть наложенные пакеты

-C, --cache-only

Выполняет обновление, не пытаясь загрузить последнюю версию дерева с удаленного источника или получить последние пакеты

--download-only

Загружает целевой OSTree и наложенные RPM, не выполняя фактическое развертывание. Можно использовать вместе с последующим вызовом --cache-only, чтобы выполнить операцию полностью автономно

override#

Предоставляет подкоманды для переопределения (модификации) базового слоя OSTree. Такие модификации следует выполнять с осторожностью, и обычно они не предназначены для длительного использования. Например, можно заменить базовый пакет его старой версией, чтобы избежать регрессии. Переопределения автоматически переносятся при создании новых развертываний.

Подкоманды override представлены в таблице ниже.

Подкоманды override#

Подкоманда

Описание

remove

Удаляет базовые пакеты

replace

Заменяет базовые пакеты. Требуется явно указать набор RPM для установки через HTTP или локальные пути к файлам

reset

Сбрасывает предыдущие переопределения. Необходимо указать полный NEVRA целевых пакетов

refresh-md#

Загружает последние метаданные RPM-репозиториев (если это необходимо) и генерирует кеш.

kargs#

Без параметров отображает текущие аргументы ядра по умолчанию. Для изменения аргументов используются опции (описаны ниже), которые создадут новое развертывание с измененными аргументами ядра. Предыдущие развертывания не меняются.

Опции команды представлены в таблице ниже.

Опции kargs#

Опция

Описание

--editor

Использует редактор для изменения аргументов ядра

--append

Добавляет аргумент ядра. Например, --append=panic=1

--append-if-missing

Добавляет аргумент ядра, если он отсутствует

--delete

Удаляет аргумент ядра. Например, --delete=panic=1

--delete-if-present

Удаляет аргумент ядра, если он присутствует. Например, --delete-if-present=panic=1

--replace

Заменяет существующий аргумент ядра. Позволяет передавать значения в формате key=value. Также поддерживается формат key=value=newvalue, чтобы заменить значение аргумента только в случае, если для этого аргумента существует одно значение. Например, --replace=panic=1 или --replace=panic=1=0.

--unchanged-exit-77

Завершает работу с кодом состояния 77, если аргументы ядра не изменились

Для получения итоговых аргументов изменения применяются к аргументам ядра развертывания по умолчанию. Используйте опции --deploy-index или --import-proc-cmdline, чтобы основывать изменения на конкретном развертывании или текущей загрузке.

cleanup#

Команды, такие как upgrade, создают новые развертывания, которые влияют на следующую загрузку и занимают дополнительное место в хранилище. В некоторых случаях может потребоваться отменить и очистить эти операции. Эта команда поддерживает удаление дополнительных развертываний, таких как «ожидающее» развертывание (следующая загрузка), а также развертывание по умолчанию для отката.

Опции команды представлены в таблице ниже.

Опции cleanup#

Опция

Описание

-p, --pending

Удаляет ожидающее развертывание

-r, --rollback

Удаляет развертывание отката

-b, --base

Очищает любое временное выделенное пространство, которое могло остаться в результате прерванных операций. Не затрагивает завершенные развертывания. Используйте эту опцию в первую очередь, если необходимо безопасно освободить место на диске

-m, --repomd

Очищает кешированные метаданные RPM-репозиториев, а также частично загруженные (но не импортированные) пакеты

Примечание

Очистка не затронет развертывания, которые были «закреплены» с помощью операции ostree admin pin.

reload#

Некоторые изменения в конфигурации и состоянии данных, такие как изменения в /etc/ostree/remotes.d, могут не примениться до тех пор, пока не будет выполнен перезапуск демона. Используйте эту команду для инициации перезагрузки.

usroverlay#

Монтирует на /usr доступную для записи наложенную (overlay) файловую систему, которая будет активна только до завершения текущей загрузки системы. Это предназначено для разработки, тестирования и отладки. Изменения не сохраняются после обновлений или перезагрузок.

Одной из важных целей этой команды является поддержка традиционного способа применения изменений через rpm -Uvh /<path_to_rpms> или аналогичные методы, когда изменения применяются «на лету» (без перезагрузки или создания нового развертывания).

Эта команда эквивалентна ostree admin unlock.

initramfs#

По умолчанию основной режим использования rpm-ostree заключается в репликации initramfs как части базового слоя. Однако некоторые сценарии использования требуют его локальной регенерации для добавления конфигурации или драйверов. Используйте команду rpm-ostree initramfs, чтобы проверить текущее состояние.

Опции команды представлены в таблице ниже.

Опции initramfs#

Опция

Описание

--enable

Включает регенерацию initramfs на стороне клиента, запускает dracut для создания нового initramfs. Будет создано новое развертывание с этим новым initramfs, и после перезагрузки дальнейшие обновления продолжат регенерацию. Перезагрузите систему, чтобы новый initramfs вступил в силу

--arg

Позволяет добавить пользовательские аргументы в программу initramfs (в настоящее время это dracut). Например, --arg=-I --arg=/etc/someconfigfile

--disable

Отключает регенерацию initramfs. Перезагрузите систему, чтобы изменения вступили в силу

Для более простого случая добавления нескольких файлов в initramfs можно использовать команду rpm-ostree initramfs-etc. Этот метод менее ресурсоемкий и не требует запуска dracut.

initramfs-etc#

Добавляет конфигурационные файлы (/etc) в initramfs без регенерации всего initramfs. Это полезно для настройки служб, поддерживающих корневое блочное устройство, а также служб ранней загрузки, таких как systemd и journald.

Опции команды представлены в таблице ниже.

Опции initramfs-etc#

Опция

Описание

--track

Начинает отслеживание конкретного файла. Может быть указано несколько раз. Будет создано новое развертывание

--untrack

Прекращает отслеживание указанных файлов

--untrack-all

Прекращает отслеживание всех файлов

--force-sync

Создает новое развертывание с последними версиями отслеживаемых файлов без выполнения обновления

При наличии отслеживаемых файлов при любом последующем развертывании (например, при выполнении обновления) будет обеспечена их синхронизация. Можно использовать --force-sync, чтобы просто создать новое развертывание с последними версиями отслеживаемых файлов без обновления.

apply-live#

Создает временную наложенную файловую систему (overlayfs) для загруженного /usr с учетом целевого коммита OSTree (по умолчанию используется ожидающее развертывание). Изменения синхронизируются из источника в загруженное дерево файловой системы. По умолчанию, чтобы обеспечить безопасность, разрешается только добавление пакетов.

Опции команды представлены в таблице ниже.

Опции apply-live#

Опция

Описание

--reset

Сбрасывает дерево файловой системы до загруженного коммита

--target

Позволяет указать произвольный коммит OSTree. Используется в основном для тестирования

--allow-replacement

Включает «живые» (live) обновления и удаление существующих пакетов

В качестве примера может быть приведена установка postgresql в live-режиме:

  1. Подготовьте установку пакета:

    rpm-ostree install postgresql-server
    
  2. Примените изменения - в данном случае установку пакета «на лету» (без необходимости перезагрузки системы):

    rpm-ostree apply-live
    
  3. Запустите службу PostgreSQL:

    systemctl start postgresql
    

    И дальнейшая настройка.

Эти шаги эквивалентны команде:

rpm-ostree install -A postgresql-server

Это синхронизирует файловую систему; например, никакие юниты systemd не перезапускаются.

Одним из важных преимуществ подхода overlayfs является то, что если что-то пойдет не так в середине операции apply-live, то перезагрузка системы удалит оверлей, восстанавливая систему в исходное состояние развертывания.

ex#

Предоставляет доступ к экспериментальным функциям; стабильность интерфейса командной строки не гарантируется. Доступные подкоманды будут перечислены при вызове rpm-ostree ex.

Команды на стороне сервера#

compose#

Точка входа для создания деревьев OSTree; чаще всего используется на серверах для подготовки деревьев к репликации клиентскими системами.

Подкоманды compose представлены в таблице ниже.

Подкоманды compose#

Подкоманда

Описание

commit

Фиксирует целевой путь в репозитории OSTree

container-encapsulate

Генерирует воспроизводимый «фрагментированный» образ контейнера (используя данные RPM) из коммита OSTree

extensions

Загружает RPM-пакеты, гарантированно совместимые с базовым OSTree

image

Генерирует воспроизводимый «фрагментированный» образ контейнера (используя данные RPM) из файла конфигурации дерева (treefile)

install

Устанавливает пакеты по целевому пути

postprocess

Выполняет финальную постобработку корневого каталога установки

tree

Обрабатывает файл конфигурации дерева (treefile); устанавливает пакеты и фиксирует результат в репозитории OSTree

Настройка репозиториев и GPG-ключи#

rpm-ostree использует общую библиотеку libdnf, которая учитывает настройки из каталога /etc/yum.repos.d. При этом репозитории формата rpm-md (yum/dnf) проверяются только в случае, если включено клиентское наложение пакетов.

Однако поведение GPG-ключей немного отличается от традиционной системы RPM. Все GPG-ключи, находящиеся в /etc/pki/rpm-gpg, автоматически загружаются и являются доверенными. Файл .repo должен ссылаться на путь к файлам этого каталога.

Команда rpm --import /<path_to_key>.gpg не будет работать на активной/загруженной системе, так как RPM пытается записать данные непосредственно в базу данных RPM, которая доступна только для чтения.

Тем не менее во время процесса сборки контейнера база данных RPM становится доступной для записи, и такие изменения будут сохранены.

Примеры использования#

  • Выведите развертывания rpm-ostree в порядке их отображения в загрузчике:

    rpm-ostree status
    
  • Выведите пакеты, которые устарели и могут быть обновлены:

    rpm-ostree upgrade --preview
    
  • Подготовьте новое развертывание OSTree с обновленными пакетами и перезагрузите систему в него:

    rpm-ostree upgrade --reboot
    
  • Перезагрузите систему в предыдущее развертывание OSTree:

    rpm-ostree rollback --reboot
    
  • Установите пакет в новое развертывание OSTree и перезагрузите систему в него:

    rpm-ostree install <package> --reboot
    

    Вместо <package> укажите имя необходимого пакета.

Дополнительная информация#

Дополнительную информацию можно получить, выполнив:

man rpm-ostree

Или:

rpm-ostree --help