Ubuntu. Репозитории и прикрепление

18.06.2024

Теги: aptLinuxUbuntuКлючКомандаУстановка

Репозитории пакетов

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

  • Main — свободное ПО, официально поддерживаемое компанией Canonical
  • Restricted — проприетарное ПО (в основном — драйверы устройств), официально поддерживаемое компанией Canonical
  • Universe — свободное ПО, официально не поддерживаемое компанией Canonical (но поддерживаемое сообществом пользователей)
  • Multiverse — проприетарное ПО, не поддерживаемое компанией Canonical

Существует четыре основных репозитория Ubuntu.

  • $release — это пакеты на момент выхода релиза
  • $release-security — пакеты критических обновлений безопасности
  • $release-updates — пакеты обновления системы (т.е. более поздние версии ПО, вышедшие уже после релиза)
  • $release-backports — бэкпорты более новых версий некоторого ПО, которое доступно только в нестабильных версиях Ubuntu

Здесь $releaese — название релиза Ubuntu, например jammy — Ubuntu 22.04 LTS.

Кроме официальных, существует множество репозиториев от авторов программ и от тех, кто не поленился собрать из исходников пакет и поделиться им с другими. PPA (Personal Package Archive) — обычно небольшой репозиторий, в который его хозяин складывает исходники, а пользователи на выходе получают уже готовый deb-пакет.

Все официальные репозитории записываются в файл репозиториев Ubuntu /etc/apt/sources.list. Для каждого PPA репозитория создается отдельный файл в директории /etc/apt/sources.list.d. PPA репозитории Ubuntu находятся на сайте, созданном Canonical — launchpad.net.

$ cat /etc/apt/sources.list | grep ^[^#]
deb http://ru.archive.ubuntu.com/ubuntu/ jammy main restricted
deb http://ru.archive.ubuntu.com/ubuntu/ jammy-updates main restricted
deb http://ru.archive.ubuntu.com/ubuntu/ jammy universe
deb http://ru.archive.ubuntu.com/ubuntu/ jammy-updates universe
deb http://ru.archive.ubuntu.com/ubuntu/ jammy multiverse
deb http://ru.archive.ubuntu.com/ubuntu/ jammy-updates multiverse
deb http://ru.archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu jammy-security main restricted
deb http://security.ubuntu.com/ubuntu jammy-security universe
deb http://security.ubuntu.com/ubuntu jammy-security multiverse

Каждая строка репозитория имеет вид

deb http://адрес_репозитория релиз ветка [ветка]

Для Ubuntu 24.04 файл /etc/apt/sources.list теперь пустой. Вместо него предлагается использовать файл /etc/apt/sources.list.d/ubuntu.sources, формат которого тоже изменился. Если раньше репозиторий задавался одной строкой, то теперь это несколько строк. Допускается использовать старый формат файлов .list, но предпочтение следует отдавать новому формату .sources.

$ cat /etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: http://ru.archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Открытый OpenPGP-ключ

Пакеты из репозитория передаются по открытым каналам и перед тем, как устанавливать их в систему, следует убедиться в их подлинности. Для этого все пакеты в репозитории подписаны закрытым OpenPGP ключом репозитория, а чтобы проверить их подлинность, потребуется открытый OpenPGP ключ.

Для того, чтобы система могла использовать ключ, его нужно сохранить в файле /etc/apt/trusted.gpg или директории trusted.gpg.d. Проблема в том, что в этом случае команда apt безоговорочно доверяет такому ключу, что дает возможность загрузить из стороннего репозитория пакеты, подписанные ключом другого репозитория и заменить таким образом любой пакет в системе.

Чтобы устранить брешь в безопасности была введена новая система, когда каждый репозиторий доверяет только собственному ключу, а сами ключи помещаются в специальное хранилище, к которому имеет доступ только суперпользователь. В настоящее время это директория /usr/share/keyrings, согласно документации там следует размещать ключи, дальнейшее управление которыми предполагается с помощью apt или dpkg.

Ключ может быть в двух форматах — текстовом и бинарном, то есть с ascii-armor или без. Термин ascii-armor — это привычный всем текстовый формат ключей в кодировке Base64. Такие ключи наиболее распространены, так как текстовый формат более удобен при передаче.

$ cat repo-sign.asc
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)

mQENBE5OMmIBCAD+FPYKGriGGf7NqwKfWC83cBV01gabgVWQmZbMcFzeW+hMsgxH
W6iimD0RsfZ9oEbfJCPG0CRSZ7ppq5pKamYs2+EJ8Q2ysOFHHwpGrA2C8zyNAs4I
QxnZZIbETgcSwFtDun0XiqPwPZgyuXVm9PAbLZRbfBzm8wR/3SWygqZBBLdQk5TE
fDR+Eny/M1RVR4xClECONF9UBB2ejFdI1LD45APbP2hsN/piFByU1t7yK2gpFyRt
97WzGHn9MV5/TL7AmRPM4pcr3JacmtCnxXeCZ8nLqedoSuHFuhwyDnlAbu8I16O5
XRrfzhrHRJFM1JnIiGmzZi6zBvH0ItfyX6ttABEBAAG0KW5naW54IHNpZ25pbmcg
a2V5IDxzaWduaW5nLWtleUBuZ2lueC5jb20+iQE+BBMBAgAoAhsDBgsJCAcDAgYV
CAIJCgsEFgIDAQIeAQIXgAUCV2K1+AUJGB4fQQAKCRCr9b2Ce9m/YloaB/9XGrol
kocm7l/tsVjaBQCteXKuwsm4XhCuAQ6YAwA1L1UheGOG/aa2xJvrXE8X32tgcTjr
KoYoXWcdxaFjlXGTt6jV85qRguUzvMOxxSEM2Dn115etN9piPl0Zz+4rkx8+2vJG
F+eMlruPXg/zd88NvyLq5gGHEsFRBMVufYmHtNfcp4okC1klWiRIRSdp4QY1wdrN
1O+/oCTl8Bzy6hcHjLIq3aoumcLxMjtBoclc/5OTioLDwSDfVx7rWyfRhcBzVbwD
oe/PD08AoAA6fxXvWjSxy+dGhEaXoTHjkCbz/l6NxrK3JFyauDgU4K4MytsZ1HDi
MgMW8hZXxszoICTTiQEcBBABAgAGBQJOTkelAAoJEKZP1bF62zmo79oH/1XDb29S
YtWp+MTJTPFEwlWRiyRuDXy3wBd/BpwBRIWfWzMs1gnCjNjk0EVBVGa2grvy9Jtx
JKMd6l/PWXVucSt+U/+GO8rBkw14SdhqxaS2l14v6gyMeUrSbY3XfToGfwHC4sa/
Thn8X4jFaQ2XN5dAIzJGU1s5JA0tjEzUwCnmrKmyMlXZaoQVrmORGjCuH0I0aAFk
RS0UtnB9HPpxhGVbs24xXZQnZDNbUQeulFxS4uP3OLDBAeCHl+v4t/uotIad8v6J
SO93vc1evIje6lguE81HHmJn9noxPItvOvSMb2yPsE8mH4cJHRTFNSEhPW6ghmlf
Wa9ZwiVX5igxcvaIRgQQEQIABgUCTk5b0gAKCRDs8OkLLBcgg1G+AKCnacLb/+W6
cflirUIExgZdUJqoogCeNPVwXiHEIVqithAM1pdY/gcaQZmIRgQQEQIABgUCTk5f
YQAKCRCpN2E5pSTFPnNWAJ9gUozyiS+9jf2rJvqmJSeWuCgVRwCcCUFhXRCpQO2Y
Va3l3WuB+rgKjsQ=
=EWWI
-----END PGP PUBLIC KEY BLOCK-----

Выяснить тип ключа можно с помощью команды file.

$ file repo-sign.asc # текстовой
PGP public key block Public-Key (old)
$ file repo-sign.gpg # бинарный
OpenPGP Public Key Version 4, Created…

Ключи в хранилище должны быть в бинарном формате, а для этого нужно понимать, в каком виде был получен исходный ключ. В большинстве случаев это будет текстовый ключ с ascii-armor — и нужно преобразовать его в бинарный перед сохранением. Адрес ключа репозитория обычно можно узнать в документации продукта, затем потребуется его скачать и установить в новое хранилище.

$ wget https://example.com/key/repo-sign.asc
$ sudo gpg --dearmor < repo-sign.asc > /usr/share/keyrings/repo-archive-keyring.gpg

Скачать ключ, преобразовать в бинарный формат и записать в хранилище — все одной командой.

$ curl -s https://example.com/key/repo-sign.asc | gpg --dearmor | \
>    sudo tee /usr/share/keyrings/repo-archive-keyring.gpg > /dev/null

После добавления ключа нужно создать файл .list или .sources в директории /etc/apt/sources.list.d и выполнить команду apt update.

Примеры добавления репозитория

Репозиторий веб-сервера Nginx — сохраняем ключ в /usr/share/keyrings/nginx-archive-keyring.gpg и создаем файл /etc/apt/sources.list.d/nginx.list.

$ curl -s https://nginx.org/keys/nginx_signing.key | gpg --dearmor | \
>    sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
>    http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | \
>    sudo tee /etc/apt/sources.list.d/nginx.list > /dev/null

Для использования пакетов из репозитория Nginx вместо распространяемых в дистрибутиве — нужно настроить закрепление

$ sudo nano /etc/apt/preferences.d/99nginx
Package: *
Pin: origin nginx.org
Pin: release o=nginx
Pin-Priority: 900
$ sudo apt update

Репозиторий базы данных MariaDB — сохраняем ключ в /usr/share/keyrings/mariadb-archive-keyring.gpg и создаем файл /etc/apt/sources.list.d/mariadb.list.

$ curl -s https://supplychain.mariadb.com/mariadb-keyring-2019.gpg | \
>    sudo tee /usr/share/keyrings/mariadb-archive-keyring.gpg > /dev/null

Версия MariaDB 11.4 для Ubuntu 22.04 jammy

$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/mariadb-archive-keyring.gpg] \
>    https://dlm.mariadb.com/repo/mariadb-server/11.4/repo/ubuntu jammy main" | \
>    sudo tee /etc/apt/sources.list.d/mariadb.list > /dev/null

Для использования пакетов из репозитория MariaDB вместо распространяемых в дистрибутиве — нужно настроить закрепление

$ sudo nano /etc/apt/preferences.d/99mariadb
Package: *
Pin: origin dlm.mariadb.com
Pin-Priority: 900
$ sudo apt update

Приоритет репозитория

Допустим, мы прописали дополнительный репозиторий для Nginx, но как системе понять из какого репозитория брать пакет для установки? Ведь пакеты для Nginx есть и в системном репозитории и в репозитории от самого Nginx. Чтобы ответить на этот вопрос придумали приоритеты репозиториев.

По умолчанию, команда apt назначает пакетам с более высокой версией более высокий приоритет — если в новом репозитории есть более новая версия, то именно она будет первым кандидатом на установку.

Чтобы задать приоритет репозитория нужно создать файл /etc/apt/preferences.d/XXrepo_name, где XX это номер файла, чем он выше, тем обработается позднее, то есть будет иметь приоритет над другими файлами.

$ sudo nano /etc/apt/preferences.d/99nginx
Package: *
Pin: origin nginx.org
Pin: release o=nginx
Pin-Priority: 900

Package — имя пакета. Можно использовать *, чтобы применить приоритет для всех пакетов из этого репозитория. Также можно указать несколько имён через пробел.

Pin — опции прикрепления. Существует много опций, мы рассмотрим лишь некоторые.

  • origin — имя автора или поставщика
  • release o=nginx — означает, что в файле Release репозитория есть поставщик с именем nginx

Pin-Priority — задает приоритет установки пакета.

То есть, Package и Pin — это условия для назначения приоритета, а Pin-Priority — это действие (назначение приоритета). В нашем примере получается следующее — если имя пакета любое, но владелец репозитория nginx.org и в файле Release прописано Origin:nginx, то для таких пакетов установить приоритет 900.

Приоритет может быть в следующих диапазонах:

  • P >= 1000 — пакет будет установлен из этого репозитория, даже если это приведет к понижению версии уже установленного пакета
  • 990 <= P < 1000 — пакет будет установлен из этого репозитория, если не установлена более новая версия
  • 500 <= P < 990 — пакет будет установлен, если нет пакета принадлежащего к целевому выпуску или не установлена более новая версия
  • 100 <= P < 500 — пакет будет установлен, если нет кандидатов из других репозиториев или установленного пакета более новой версии
  • 0 < P < 100 — пакет будет установлен, только если он ещё не установлен (любой версии) и если нет кандидатов из других репозиториев
  • P < 0 — пакет не будет установлен ни при каких условиях
  • P = 0 — не используется

Приоритеты с 500 по 990 и с 990 по 1000 очень похожи. Чтобы их отличить — нужно понять, что такое целевой выпуск. Для Ubuntu это название версии дистрибутива. Например для Ubuntu 24.04 — noble, для Ubuntu 22.04 — jammy, для Ubuntu 20.04 — fossa.

Чтобы понять, из какого репозитория будет установлен пакет, нужно выполнить команду

$ apt-cache policy nginx
nginx:
  Установлен: (отсутствует)
  Кандидат:   1.26.1-2~jammy
  Таблица версий:
     1.26.1-2~jammy 900
        900 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
     1.26.1-1~jammy 900
        900 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
     1.26.0-1~jammy 900
        900 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
     1.24.0-1~jammy 900
        900 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
     1.22.1-1~jammy 900
        900 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
     1.22.0-1~jammy 900
        900 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
     1.20.2-1~jammy 900
        900 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
     1.18.0-6ubuntu14.4 500
        500 http://ru.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
     1.18.0-6ubuntu14.3 500
        500 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages
     1.18.0-6ubuntu14 500
        500 http://ru.archive.ubuntu.com/ubuntu jammy/main amd64 Packages

Обратите внимание, что приоритет установки из репозитория Nginx равен 900, а приоритет репозитория Ubuntu равен 500.

$ apt-cache policy mariadb-server
mariadb-server:
  Установлен: (отсутствует)
  Кандидат:   1:11.4.2+maria~ubu2204
  Таблица версий:
     1:11.4.2+maria~ubu2204 900
        900 https://dlm.mariadb.com/repo/mariadb-server/11.4/repo/ubuntu jammy/main amd64 Packages
     1:11.3.2+maria~ubu2204 900
        900 https://dlm.mariadb.com/repo/mariadb-server/11.4/repo/ubuntu jammy/main amd64 Packages
     1:10.6.18-0ubuntu0.22.04.1 500
        500 http://ru.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages
        500 http://ru.archive.ubuntu.com/ubuntu jammy-updates/universe i386 Packages
        500 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages
        500 http://security.ubuntu.com/ubuntu jammy-security/universe i386 Packages
     1:10.6.7-2ubuntu1 500
        500 http://ru.archive.ubuntu.com/ubuntu jammy/universe amd64 Packages
        500 http://ru.archive.ubuntu.com/ubuntu jammy/universe i386 Packages

Поиск: Linux • Ubuntu • Команда • Установка • Ключ • apt • Пакет

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.