RPM-repair: различия между версиями
Klark (обсуждение | вклад) |
Klark (обсуждение | вклад) мНет описания правки |
||
Строка 25: | Строка 25: | ||
<pre> | <pre> | ||
$ rpmrepair --help | $ rpmrepair --help | ||
Usage: rpmrepair [<options>...] [--] [<rpm>...] | Usage: rpmrepair [<options>...] [--] [<package.rpm>...] | ||
Options: | Options: | ||
-N, --noarch Use noarch | -N, --noarch Use noarch packaging method. | ||
-s, --scripts Add scriptlets from source RPM's. | -s, --scripts Add scriptlets from source RPM's. | ||
-n, --nodeps Drop all dependencies in created RPM's. | -n, --nodeps Drop all dependencies in created RPM's. | ||
Строка 57: | Строка 57: | ||
В сторонних и проприетарных RPM'ках могут находиться скрипты, зачастую вредные или с ошибками. Никто не проверял их на совместимость с ОС Альт, поэтому такие скрипты по умолчанию не переносятся в перепакованные RPM'ки. Нужно самостоятельно извлечь их, посмотреть, что они делают, и, если требуется, создать на их основе правильные скрипты для пред/пост-установки/удаления. Находясь в каталоге с исходным RPM сделать это можно командой: | В сторонних и проприетарных RPM'ках могут находиться скрипты, зачастую вредные или с ошибками. Никто не проверял их на совместимость с ОС Альт, поэтому такие скрипты по умолчанию не переносятся в перепакованные RPM'ки. Нужно самостоятельно извлечь их, посмотреть, что они делают, и, если требуется, создать на их основе правильные скрипты для пред/пост-установки/удаления. Находясь в каталоге с исходным RPM сделать это можно командой: | ||
<pre>$ rpm -qp --scripts <rpm | <pre>$ rpm -qp --scripts <package.rpm> ИМЯ-ПАКЕТА.sripts</pre> | ||
Отредактированный файл '''ИМЯ-ПАКЕТА.sripts''' сам затянется в перепакованный RPM при запуске '''rpmrepair'''. Удалять и изменять строки типа "postinstall scriplet (through ...):" не следует. Конечно, ключом '''--scripts''' можно включить перекладывание скриплетов из исходных RPM, при этом отредактированным вариантам всё равно отдаётся предпочтение. Здесь и далее "ИМЯ-ПАКЕТА" можно получить командой: | Отредактированный файл '''ИМЯ-ПАКЕТА.sripts''' сам затянется в перепакованный RPM при запуске '''rpmrepair'''. Удалять и изменять строки типа "postinstall scriplet (through ...):" не следует. Конечно, ключом '''--scripts''' можно включить перекладывание скриплетов из исходных RPM, при этом отредактированным вариантам всё равно отдаётся предпочтение. Здесь и далее "ИМЯ-ПАКЕТА" можно получить командой: | ||
<pre>$ rpm -qp --qf "%{NAME}\n" <rpm></pre> | <pre>$ rpm -qp --qf "%{NAME}\n" <package.rpm></pre> | ||
== Другие особенности == | == Другие особенности == | ||
Строка 71: | Строка 71: | ||
<pre> | <pre> | ||
$ rpm -qp --requires <rpm> |sed -E ',^,Requires: ,g' > ИМЯ-ПАКЕТА.deps | $ rpm -qp --requires <package.rpm> |sed -E ',^,Requires: ,g' > ИМЯ-ПАКЕТА.deps | ||
$ rpm -qp --provides <rpm> |sed -E ',^,Provides: ,g' >> ИМЯ-ПАКЕТА.deps | $ rpm -qp --provides <package.rpm> |sed -E ',^,Provides: ,g' >> ИМЯ-ПАКЕТА.deps | ||
</pre> | </pre> | ||
Строка 78: | Строка 78: | ||
Для отправки в Bugzilla сообщения об ошибке следует запустить на одиночном RPM-пакете, перепаковка которого выполняется с ошибками, команду: | Для отправки в Bugzilla сообщения об ошибке следует запустить на одиночном RPM-пакете, перепаковка которого выполняется с ошибками, команду: | ||
<pre>$ /bin/bash -x /usr/bin/rpmrepair <rpm> 2>&1 |tee ИМЯ-ПАКЕТА.log</pre>и приложить получившийся отчёт к сообщению об ошибке. | <pre>$ /bin/bash -x /usr/bin/rpmrepair <package.rpm> 2>&1 |tee ИМЯ-ПАКЕТА.log</pre>и приложить получившийся отчёт к сообщению об ошибке. | ||
'''Enjoy! -;)''' | '''Enjoy! -;)''' |
Версия от 16:01, 1 августа 2020
rpmrepair: починка сторонних RPM путём перепаковки
При установке сторонних пакетов, собранных не для соответствующего репозитория Альт, могут возникать проблемы несовместимости со штатным менеджером пакетов rpm, могут быть допущены ошибки в скриплетах пакета, могут быть неверно расставлены зависимости. Самый простой способ перепаковки предлагает утилита rpmrepair. Для её использования не требуются привилегии суперпользователя. В данном случае мы рассматриваем получение нового RPM не как процесс сборки из исходников. Бинарный результат у нас уже есть, с ним уже нельзя ничего сделать. Мы просто исправляем ошибки упаковки и рассматриваем RPM как архивный файл с метаданными, что позволит в дальнейшем при установке пакета отказаться от использования таких опций RPM, как --nodeps, --noscripts, --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 Usage: rpmrepair [<options>...] [--] [<package.rpm>...] Options: -N, --noarch Use noarch packaging method. -s, --scripts Add scriptlets from source RPM's. -n, --nodeps Drop all dependencies in created RPM's. -p, --packager Set default PACKAGER name and e-mail. -v, --version Show this program version and exit. -h, --help Show this help message and exit. Example: rpmrepair -p "John Doe <agent007@example.org>" Will be repacked all RPM's in the current directory, results will be saved to the 'repacked' subdir. All pre/post scripts will be dropped. Please, report bugs to https://bugzilla.altlinux.org/
Принцип действия
Программа распаковывает исходный RPM через rpm2cpio и cpio, упаковывает в архив .tar, извлекает метаданные пакета и создаёт SPEC, на его основе через rpm -bb собирается новый RPM-пакет. При этом отрываются зависимости на rpmlib(...), а если дополнительно указать параметр --nodeps, то из исходных пакетов вообще никакие зависимости не будут перенесены в перепакованные визави. В качестве аргумента можно указать один или несколько RPM, каждый перепаковывается независимо. Если не указать ни одного пакета, будет предпринята попытка перепаковать все RPM-пакеты в текущем каталоге. Только при успешном завершении в текущем каталоге создаётся подкаталог repacked, в который помещается результат работы. Временные файлы всегда удаляются, независимо от результата.
Предупреждения
До начала работы из текущего каталога будет удалён подкаталог repacked. Также будет удалён каталог ~/RPM со всем содержимым. Сохраняйте свои RPM'ки заблаговременно! Следует иметь ввиду: вендор исходного RPM-пакета не отвечает за получившийся перепакованный результат, поэтому ему следует адресовать рекламации только по исходному пакету. За перепакованный результат вообще никто не может отвечать, вы перепаковываете только на свой страх и риск.
Скрипты
В сторонних и проприетарных RPM'ках могут находиться скрипты, зачастую вредные или с ошибками. Никто не проверял их на совместимость с ОС Альт, поэтому такие скрипты по умолчанию не переносятся в перепакованные RPM'ки. Нужно самостоятельно извлечь их, посмотреть, что они делают, и, если требуется, создать на их основе правильные скрипты для пред/пост-установки/удаления. Находясь в каталоге с исходным RPM сделать это можно командой:
$ rpm -qp --scripts <package.rpm> ИМЯ-ПАКЕТА.sripts
Отредактированный файл ИМЯ-ПАКЕТА.sripts сам затянется в перепакованный RPM при запуске rpmrepair. Удалять и изменять строки типа "postinstall scriplet (through ...):" не следует. Конечно, ключом --scripts можно включить перекладывание скриплетов из исходных RPM, при этом отредактированным вариантам всё равно отдаётся предпочтение. Здесь и далее "ИМЯ-ПАКЕТА" можно получить командой:
$ rpm -qp --qf "%{NAME}\n" <package.rpm>
Другие особенности
Данный способ перепаковки не предусматривает "чистого" удаления, т.к. по умолчанию каталоги не принадлежат к какому-либо пакету. Следовательно, при удалении таких пакетов придётся "хвосты" (пустые каталоги) удалять вручную. Избавить от такой необходимости пользователей перепакованного RPM можно лишь добавив информацию о принадлежности каталогов конкретному пакету. Установить принадлежность для единственного пакета достаточно легко, для целой пачки пакетов -- задача непростая, но тоже решаемая. Просто перечислите все каталоги, относящиеся к пакету, в файле с именем ИМЯ-ПАКЕТА.dirs и сложите его рядом. rpmrepair сам затянет это в создаваемый RPM. При этом надо иметь ввиду, что конкретный каталог не может принадлежать двум пакетам одновременно.
Исправление зависимостей
Независимо от наличия или отсутствия ключа --nodeps, можно добавить свой "кусок спека" при перепаковке. Для этого достаточно сложить рядом с RPM-пакетом файл ИМЯ-ПАКЕТА.deps. В нём можно указывать такие поля, как Requires:, Obsoletes:, Conflicts: и Provides:. Провайдсы из исходных RPM не переносятся никогда, так что по умолчанию пакет будет провайдить только сам себя. Чтобы выяснить, что требует и что провайдит исходный пакет, выполните пару команд:
$ rpm -qp --requires <package.rpm> |sed -E ',^,Requires: ,g' > ИМЯ-ПАКЕТА.deps $ rpm -qp --provides <package.rpm> |sed -E ',^,Provides: ,g' >> ИМЯ-ПАКЕТА.deps
Отладка
Для отправки в Bugzilla сообщения об ошибке следует запустить на одиночном RPM-пакете, перепаковка которого выполняется с ошибками, команду:
$ /bin/bash -x /usr/bin/rpmrepair <package.rpm> 2>&1 |tee ИМЯ-ПАКЕТА.log
и приложить получившийся отчёт к сообщению об ошибке.
Enjoy! -;)