Обновление RPM не может заменить каталог с файлом? - PullRequest
2 голосов
/ 19 июня 2019

У меня есть предыдущая версия пакета, который я поддерживаю, который содержал подкаталог с файлами в нем. Обновление происходит в RHEL / CentOS 7. Например, моя версия 1.0 RPM содержала:

/opt/foo/etc/bar/x/y
/opt/foo/etc/bar/z

и т.д.. В более новой версии этого пакета я должен заменить весь каталог /opt/foo/etc/bar файлом с тем же именем (к сожалению, это требуется для инструмента, я ничего не могу с этим поделать). Так что в новой версии пакета он будет содержать

/opt/foo/etc/bar

, который является файлом.

Если я запускаю в обычном режиме rpm --upgrade pkg-2.0.rpm, я получаю сообщение об ошибке еще до того, как любой из моих скриптов спецификаций будет вызван:

file /opt/foo/etc/bar from install of pkg-2.0-1.x86_64 conflicts with file from package pkg-1.0-1.x86_64

Чтобы избежать этого, я должен добавить опцию --replacefiles в мою командную строку rpm, что является брутто.

Даже если я это сделаю, все равно не удастся, на этот раз после запуска моего preinst скриптлета, с такой ошибкой:

error: unpacking of archive failed on file /opt/foo/etc/bar: cpio: rename failed - Is a directory
error: pkg-2.0-1.x86_64: install failed
error: pkg-1.0-1.x86_64: erase skipped

Насколько я могу судить, единственный способ сделать это - изменить мой preinst для удаления каталога и добавить параметр --replacefiles в rpm. Даже после того, как я все это сделаю, пока обновление завершается успешно, оно выдает предупреждение для каждого файла, который «отсутствует» (потому что я удалил каталог):

warning: file /opt/foo/etc/bar/x/y: remove failed: Not a directory
warning: file /opt/foo/etc/bar/z: remove failed: Not a directory

Я не знаю, почему он показывает эту ошибку, поскольку эти вещи не каталогов и никогда не были, но в любом случае.

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

Похоже, что в RPM нет возможности сделать это чисто; это просто недостаток инструмента RPM или я что-то упустил?

1 Ответ

0 голосов
/ 16 июля 2019

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

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

  1. Вы начинаете с A-1.0.rpm, который включает /opt/foo/etc/bar/z в качестве каталога.Затем вы создаете A-transition-1.1.rpm, в котором не будет каталога /opt/foo/etc/bar/z (фактически - это может быть пустой пакет), и вы получите Obsolete: A <= 0:1.0.Ведущий ноль - эпоха.Я полагаю, вы не использовали его в прошлом.Затем вы создадите новый A-1.0.rpm с Epoch: 1, и вы получите Obsolete: A-transition < 0:2.0, и на этот раз он может содержать /opt/foo/etc/bar/z в виде файла.RPM выполнит обновление 0: A-1.0 -> A-transition -> 1: A-1.0

  2. Поскольку это проблема CPIO, вы можете:

    %pre if [-d / opt / foo / etc / bar / z];тогда rm -rf / opt / foo / etc / bar / z fi

об / мин выкрикивает об отсутствии /opt/foo/etc/bar/z при удалении старого пакета, но оно должно пройти (не проверялось).

...