LINUX.ORG.RU

Репозитарий (deb): куда засунуть версию ОС Linux?

 , , , ,


2

4

Имеется два самодельных репозитария: один для Astra 1.3, второй для Astra 1.6

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

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

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

Мне было бы проще всего добавить информацию в версию пакета (поле Version). Сделать, например, в ней префикс, типа:

a13:2023.02.09-5
a16:2023.02.09-5

Но сдается мне, что если в Astra 1.3 прописать репозитарий от Astra 1.6, то, например, при обновлении версий пакет a13:2023.02.09-5 будет молча заменен на a16:2023.02.09-8 и ничего пакетная система не заметит и не предупредит. Да, и еще придется перелопатить все зависимости во всех пакетах, чтобы они тоже этот префикс содержали.

Менее удобно (в моем случае) было бы добавить версию дистрибутива просто в поле Description или в Origin, чтобы хотя бы видеть что пакет собран для определенного дистрибутива. Но это тоже всего лишь информационное поле, и проблему оно не решает.

Вопрос: куда впихнуть версию дистрибутива, для которого сделан пакет? Чтобы были решены проблемы, описанные выше? Или таковая задача полностью в принципе не решается?

★★★★★

Так как Debian различает пакеты исключительно по номеру версии, то не делайте так. Версии для разных дистрибутивов должны различаться. Суффикс добавляйте, что ли (+astra1.3 и +astra1.6, например).

А если ещё и хочется, чтобы пакет не устанавливался на другой дистрибутив, то сделайте ему версионную зависимость от чего-нибудь, что есть в нужном дистрибутиве (скажем, от base-files).

TeopeTuK ★★★★
()
Последнее исправление: TeopeTuK (всего исправлений: 1)
Ответ на: комментарий от TeopeTuK

Я не могу найти информацию о том, как парсится версия пакета и как пакетная система принимает решение о том, старше пакет или нет.

Другими словами, какой пакет будет считаться старше:

2023.02.09-8+astra1.3
2023.02.09-5+astra1.6

?

Xintrea ★★★★★
() автор топика

А вот, кстати. Нельзя в каждый пакет добавить зависимость на содержимое /etc/*release? Но пакет «basesystem», содержащий этот файл, в дополнительный репозиторий не включать. Тогда версии пакетов в дополнительных репозиториях для astra 1.{3,6} могут совпадать.

x22
()
Ответ на: комментарий от TeopeTuK

А если ещё и хочется, чтобы пакет не устанавливался на другой дистрибутив, то сделайте ему версионную зависимость от чего-нибудь, что есть в нужном дистрибутиве (скажем, от base-files).

Версия дистрибутива ведь тоже может меняться. Точнее, в дистрибутиве имеются обновления, например, Astra 1.3 update 2, Astra 1.6 update 10.

Поэтому нельзя прописать точную версию пакета (=). А прописывание через > или < недопустимо, потому что непонятно как ограничить верхнюю границу. Например уже есть версия Astra 1.7, а как в ней будут обозначаться пакеты обновлений (и до какой версии они дойдут) - неизвестно.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от TeopeTuK

Команда командой, но каков алгоритм сравнения? В документации ничего внятного не написано:

Compare version numbers, where op is a binary operator. dpkg returns true (0) if the specified condition is satisfied, and false (1) otherwise. There are two groups of operators, which differ in how they treat an empty ver1 or ver2. These treat an empty version as earlier than any version: lt le eq ne ge gt. These treat an empty version as later than any version: lt-nl le-nl ge-nl gt-nl. These are provided only for compatibility with control file syntax: < << <= = >= >> >. The < and > operators are obsolete and should not be used, due to confusing semantics. To illustrate: 0.1 < 0.1 evaluates to true.

Сравнение номеров версий, где op - двоичный оператор. dpkg возвращает true (0), если указанное условие выполнено, и false (1) в противном случае. Существует две группы операторов, которые отличаются тем, как они обрабатывают пустой ver1 или ver2. Они рассматривают пустую версию как более раннюю, чем любая другая версия: lt le eq ne ge gt. Они рассматривают пустую версию как более позднюю, чем любая версия: lt-nl le-nl ge-nl gt-nl. Они предоставляются только для совместимости с синтаксисом управляющего файла: < << <= = >= >> >. Операторы < и > устарели и не должны использоваться из-за запутанной семантики. Для иллюстрации: 0.1 < 0.1 принимает значение true.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от skyman

Не разбираюсь в теме, но нельзя ли в пре-инсталл скрипте пакета прописать проверку /etc/release?

perinstall скрипт не может заблокировать установку. Он всего лишь выполняет какие-то действия перед установкой пакета.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от TeopeTuK

2023.02.09-8+astra1.3
2023.02.09-5+astra1.6

Первый будет старше.

Пока что я так понял, что проверка идет в лексикографическом порядке, но только справа-налево. Хотя я могу ошибаться.

В любом случае получается, что версиями проблему принадлежности дистрибутиву не разрулишь.

Xintrea ★★★★★
() автор топика

Типа если перепутают репозитарии, то инсталляция накроется и путанница возникнет если, например, в Astra 1.3 пропишут репозитарий от Astra 1.6 и установят пакеты

Если в данных пакетах зависимости прописаны корректно, то могут быть лишь 2 варианта:

  1. Зависимости в текущей версии ОС не удовлетворены — в таком случае пакеты установить APT не даст.

  2. Зависимости в текущей версии ОС удовлетворены — тогда эти пакеты будут работать нормально, и ничего не сломается и не накроется.

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

Rootlexx ★★★★★
()

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

apt разруливает пакеты по версиям. Разные пакеты с одной версией создавать не стоит. В дебиане пакеты, пересобранные для свежих релизов, будут отличаться версиями. В вашем случае может быть так: для 1.3 - package_1.1-1, для 1.6 может быть package_1.1-1+b1 (если просто пересобрали для свежего релиза ОС) или package_1.1-2 (если были изменения в исходниках или файлах debian/*).

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

Прописать правильно зависимости. Можно привязаться к версии libc (`Depends: libc6 (>= 2.20-1), libc (< 2.21~)

каков алгоритм сравнения?

такой

undef ★★
()

… пакеты в этих репозитариях имеют одинаковые имена файлов, одинаковые названия пакетов и одинаковые версии (просто бинарники собраны соответственно для Astra 1.3 и Astra 1.6).

Есть среди пакетов такие, что будут работать на обоих дистрибутивах?

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

x22
()

Засунь в Dependencies пакетов такие пакеты таких версий, что стоят только на нужных дистрибутивах.

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

Vsevolod-linuxoid ★★★★★
()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 1)
Ответ на: комментарий от Infra_HDC

куда засунуть версию ОС Linux?

В путь к каталогу репозитория, разве нет? Вообще, так делает большинство нормальных людей.

В конфигурации apt путь к каталогу может быть определен неправильно.

x22
()

сделай псевдопакет, пропиши в зависимости - вроде традиционный костыль. ну и чтобы они не пересакались между репо, каждый в своем.
а нету в б - невозможно поставить.
обратное верно тоже.

etwrq ★★★★★
()
Ответ на: комментарий от Infra_HDC

«UNIX не был разработан так, чтобы отгораживать своих пользователей от глупостей, поскольку это отгородило бы их от делания умных вещей.»

Unix is not only dead, it starts to smell badly (почти (с))

x22
()

Мегакостыль: привязать каждый собираем пакет к версии glibc используемой в дистрибутиве.

Сработает, только если версия glibc при минорных обновлениях дистрибутива(1.6.0->1.6.1) не меняется. Так ли оно в Astra Linux - хз.

Как вариант - найти пакет, обозначающий версию дистрибутива(если таковые вообще есть, в ubuntu это ubuntu-* например)...

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 2)
Ответ на: комментарий от Pinkbyte

Мегакостыль: привязать каждый собираем пакет к версии glibc используемой в дистрибутиве.

Привязать пакет к версиям его зависимостей - в принципе, не такой уж и костыль. А если все зависимости одинаковы, то и пакеты будут 100% взаимозаменяемы.

annulen ★★★★★
()
Ответ на: комментарий от Pinkbyte

Привязаться к версии glibc лишь пример. ТС не сообщил в чем отличия пакетов на разных релизах астры. Надо смотреть реальные зависимости от библиотек, явы, питонов или что там еще у него.

undef ★★
()

Вопрос: куда впихнуть версию дистрибутива, для которого сделан пакет?

В имя файла же - ${ver}.${dist}.${arch}.deb

Зависимость по либам? Совместимость снизу вверх должна соблюдаться.

anonymous2 ★★★★★
()

Вот есть файл /usr/lib/os-release в нем всякая инфа про дистрибутив. Этой файл в Ubuntu относится к пакету base-files. На Ubuntu 20.04 его версия 11ubuntu5.6. На Ubuntu 22.04 его версия 12ubuntu4.2. Т.е. в разных релизах версия данного пакета точно должна отличаться. Можешь посмотреть на своих дистрах, есть ли такой файл (должен быть по идее в любом дистре) и к какому пакету он относится.

https://www.freedesktop.org/software/systemd/man/os-release.html

/etc/os-release

/usr/lib/os-release

/etc/initrd-release

/usr/lib/extension-release.d/extension-release.IMAGE

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 4)
Ответ на: комментарий от sambo

Но это всё-таки ограничение (огораживание), хоть и не в той степени, как в моей теме. Поэтому я и написал «когда я спросил нечто подобное», а не «когда я спросил то же самое».

Mischutka ★★★★★
()
Ответ на: комментарий от Mischutka

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

sambo ★★
()
Ответ на: комментарий от sambo

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

Это лишь причина, по которой хотят реализовать «огораживание»:

Он хочет каким-то образом сделать так, чтобы пакеты от одного дистра невозможно было поставить в другой дистр...

Mischutka ★★★★★
()