web-dev-qa-db-ja.com

RPMアップグレードはRPMをアンインストールします

プロジェクトRPMをアップグレードしています。問題は、projectname-1.0-0からprojectname-1.0-1にアップグレードすると、最初に新しいプロジェクトがインストールされ、古いプロジェクトがアンインストールされ、全体的に見るとプロジェクトが完全に削除されます。アップグレード中に「vv」オプションを使用したところ、インストール後にアンインストールが行われたことが出力に示されました。

誰かがこの問題を手伝ってください。 RPM仕様またはrpmbuildオプションで特に変更する必要があるものはありますか?

28
Vidya

はい、RPMアップグレードが発生すると、RPMは最初にパッケージの新しいバージョンをインストールし、次に古いバージョンのパッケージをアンインストールします。古いパッケージのファイルのみが削除されます。ただし、スクリプト(つまり、%pre、%post、%preun、%postun)は、それらがアップグレードを処理しているか、単なるインストールまたはアンインストールを処理しているかを知る必要があります。

Rpmコマンドは、スクリプトに1つの引数、つまり、インストールされているパッケージのバージョン数のカウントである$ 1を渡します。以下の表(Eric Foster-JohnstonによるRedHat RPMガイドから)は、可能な値のサンプルを提供します。

Install the first time:          1
Upgrade:                         2 or higher 
                                 (depending on the number of versions installed)
Remove last version of package:  0

したがって、%preunで、サービスを削除する前に "$ 1 = 0"かどうかを確認する必要があります。

詳細(およびより良い表)については、以下を参照してください。 http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch09s04s05.html

63
Christian

RPMパッケージをアップグレードすると、スクリプトは次の順序で実行されます。

 1. %Pre of new package
     copy in files for new package
 2. %Post of new package
 3. %Preun of old package
     remove files of old package
 4. %Postun of old package

インストールが新規かアップグレードかに関係なく、異なるバージョンの同じパッケージにインストールされているRPMの数を表す1つの引数が各スクリプトに渡されます。事前および事後スクリプトの場合、最初のインストールの場合は1になります。 preunおよびpostunスクリプトの場合、最後のアンインストールでは0になります。

あなたのケースで何が起こっているのでしょうか?preunまたはpostunスクリプトが新しいパッケージに役立つファイルを削除している可能性があります。 postunスクリプトでファイルを手動で削除する必要はありません。RPM自体でインテリジェントに処理されます。

ref: アップグレードとアンインストール

7
avg598

はい。 rpmのインストール中に、%installおよび%postスクリプトが呼び出されます。インストールが正常に完了すると、%preunおよび%postunスクリプトが呼び出され、以前のバージョンのrpmがアンインストールされます。これらの%preunおよび%postunスクリプトは、適切に処理されない場合、%installおよび%postスクリプトによってもたらされる変更を操作する可能性があります。

Rpmは、$ 1引数に適切な値を設定して、インストールされているrpmバージョンの数を識別します。 projectname-1.0-0の新規インストール中に、%installおよび%postスクリプトが呼び出され、$ 1が1に設定され、これが唯一のアクティブなバージョンであることを示します。 projectname-1.0-1にアップグレードすると、%installおよび%postスクリプトは$ 1を2に設定して呼び出されます。その後、%preunおよび%postunスクリプトは$ 1を1に設定して呼び出され、projectnameの内容をクリーンアップします。 -1.0-0。したがって、$ 1の値に基づいてスペックファイルを書き込むことで、アップグレードを効果的に処理できます。

5
Ashok Vairavan

アップグレード時にアンインストールセクションがどのように機能するかを理解することが重要です

Pre、post、unpre、unpostでチェックできる変数$ 1があります(その値はインストール、アップグレード、アンインストールに基づいて異なります)その値に応じて、rpm内からインストールまたはアップグレードのどちらであるかを判断できます

例えば:

In Pre/post
if $1 == 1 initial installation
if $1 == 2 upgrade

In preun/postun
if $1 == 0 uninstall
if $1 == 1 upgrade

abc-1をバージョン1からバージョン2(abc-2)にアップグレードすることを検討してください

Run %pre from "abc-2".
Run %post from "abc-2".
Run %preun from "abc-1".
Run %postun from "abc-1".
0
Kiril