RPM-repair: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Строка 1: Строка 1:
'''rpmrepair: перепаковка сторонних RPM'''
'''rpmrepair: починка сторонних RPM путём перепаковки'''


При установке сторонних пакетов, собранных не для соответствующего репозитория Альт, могут возникать проблемы несовместимости со штатным менеджером пакетов rpm. Простой способ переупаковки предлагает утилита '''rpmrepair'''.
При установке сторонних пакетов, собранных не для соответствующего репозитория Альт, могут возникать проблемы несовместимости со штатным менеджером пакетов rpm, могут быть допущены ошибки в скриплетах пакета, могут быть неверно расставлены зависимости. Самый простой способ перепаковки предлагает утилита '''rpmrepair'''. Для её использования не требуются привилегии суперпользователя. В данном случае мы рассматриваем получение нового RPM не как процесс сборки из исходников. Бинарный результат у нас уже есть, с ним уже нельзя ничего сделать. Мы просто исправляем ошибки упаковки и рассматриваем RPM как архивный файл с метаданными, что позволит в дальнейшем при установке пакета отказаться от использования таких опций RPM, как '''--noscripts''', '''--nodeps''', '''--ignorearch'''.


== Симптом ==
== Симптом ==
Строка 16: Строка 16:
# apt-get install rpmrepair
# apt-get install rpmrepair
</pre>
</pre>
Зависимости у '''rpmrepair''' минимальны -- '''rpm-build''' и '''rsync'''. Перечисленные пакеты нужны только на момент перепаковки, для работы перепакованных пакетов они не требуются.
Зависимости у '''rpmrepair''' минимальны -- '''rpm-build''', '''rsync''' и '''fakeroot'''. Перечисленные пакеты нужны только на момент перепаковки, для работы перепакованных пакетов они не требуются.


== Ответственный упаковщик ==
== Ответственный упаковщик ==
Строка 35: Строка 35:
== Скрипты ==
== Скрипты ==


В сторонних и проприетарных RPM'ах могут находиться скрипты, зачастую вредные или с ошибками. Никто не проверял их на совместимость с ОС Альт, поэтому такие скрипты никогда не переносятся в перепакованные RPM'ки. Нужно самостоятельно извлечь их, посмотреть, что они делают, и если нужно, создать на их основе правильные скрипты для пред/пост-установки/удаления. Сделать это можно командой:
В сторонних и проприетарных RPM'ках могут находиться скрипты, зачастую вредные или с ошибками. Никто не проверял их на совместимость с ОС Альт, поэтому такие скрипты по умолчанию не переносятся в перепакованные RPM'ки. Нужно самостоятельно извлечь их, посмотреть, что они делают, и, если нужно, создать на их основе правильные скрипты для пред/пост-установки/удаления. Сделать это можно командой:


<pre>$ rpm -qp --scripts <rpm> > куда-сохраняем.sh</pre>
<pre>$ rpm -qp --scripts <rpm> > имя-пакета.sripts</pre>


== Другие особенности ==
== Другие особенности ==

Версия от 03:46, 1 августа 2020

rpmrepair: починка сторонних RPM путём перепаковки

При установке сторонних пакетов, собранных не для соответствующего репозитория Альт, могут возникать проблемы несовместимости со штатным менеджером пакетов rpm, могут быть допущены ошибки в скриплетах пакета, могут быть неверно расставлены зависимости. Самый простой способ перепаковки предлагает утилита rpmrepair. Для её использования не требуются привилегии суперпользователя. В данном случае мы рассматриваем получение нового RPM не как процесс сборки из исходников. Бинарный результат у нас уже есть, с ним уже нельзя ничего сделать. Мы просто исправляем ошибки упаковки и рассматриваем RPM как архивный файл с метаданными, что позволит в дальнейшем при установке пакета отказаться от использования таких опций RPM, как --noscripts, --nodeps, --ignorearch.

Симптом

# rpm -ivh 1C_Enterprise83-ws-nls-8.3.17-1549.x86_64.rpm
...
rpmlib(FileDigests) <= 4.6.0-1 нужен для 1C_Enterprise83-ws-nls-8.3.17-1549

Установка

$ su-
# apt-get update
# apt-get install rpmrepair

Зависимости у rpmrepair минимальны -- rpm-build, rsync и fakeroot. Перечисленные пакеты нужны только на момент перепаковки, для работы перепакованных пакетов они не требуются.

Ответственный упаковщик

Упаковщиком созданных пакетов (PACKAGER) по умолчанию будет тот, кто упаковал исходный пакет. Если данное поле не указано, им будет системный упаковщик по умолчанию -- берётся из файла ~/.rpmmacros или из командной строки (--packager). Если и это не будет указано, ответственным за перепакованный пакет по умолчанию ставится автор rpmrepair.

Получение справки

rpmrepair --help

Принцип действия

Программа распаковывает исходный RPM через rpm2cpio и cpio, упаковывает в архив .tar, извлекает метаданные пакета и создаёт SPEC, на его основе через rpm -bb собирается новый RPM-пакет. При этом отрываются зависимости на rpmlib(...), а если дополнительно указать параметр --nodeps, то из исходных пакетов вообще никакие зависимости не будут перенесены в перепакованные визави. В качестве аргумента можно указать один или несколько RPM, каждый перепаковывается независимо. Если не указать ни одного пакета, будет предпринята попытка перепаковать все RPM-пакеты в текущем каталоге. Только при успешном завершении в текущем каталоге создаётся подкаталог repacked, в который помещается результат работы. Временные файлы всегда удаляются, независимо от результата.

Предупреждения

До начала работы из текущего каталога будет удалён подкаталог repacked. Также будет удалён каталог ~/RPM со всем содержимым. Сохраняйте свои RPM'ки заблаговременно! Следует иметь ввиду: вендор исходного RPM-пакета не отвечает за получившийся перепакованный результат, поэтому ему следует адресовать рекламации только по исходному пакету. За перепакованный результат вообще никто не может отвечать, вы перепаковываете только на свой страх и риск.

Скрипты

В сторонних и проприетарных RPM'ках могут находиться скрипты, зачастую вредные или с ошибками. Никто не проверял их на совместимость с ОС Альт, поэтому такие скрипты по умолчанию не переносятся в перепакованные RPM'ки. Нужно самостоятельно извлечь их, посмотреть, что они делают, и, если нужно, создать на их основе правильные скрипты для пред/пост-установки/удаления. Сделать это можно командой:

$ rpm -qp --scripts <rpm> > имя-пакета.sripts

Другие особенности

Данный способ перепаковки не предусматривает "чистого" удаления, т.к. каталоги не принадлежат к какому-либо пакету. Следовательно, при удалении таких пакетов придётся "хвосты" (пустые каталоги) удалять вручную.

Отладка

Для отправки в Bugzilla сообщения об ошибке следует запустить на одиночном RPM-пакете, перепаковка которого выполняется с ошибками, команду:

$ /bin/bash -x /usr/bin/rpmrepair <rpm> 2>&1 |tee <rpm.log>

и приложить получившийся отчёт к сообщению об ошибке.

Enjoy! -;)