Hatena::Grouptech

id:rx7(@namikawa)の技術メモ このページをアンテナに追加 RSSフィード

過去記事一覧 | Main Blog (元RX-7乗りの適当な日々) | SBM (id:rx7のBookmark)

2011/08/31

rpmのアップデートは、"rpm -i"の後に"rpm -e"の順にはたらく

| rpmのアップデートは、"rpm -i"の後に"rpm -e"の順にはたらく - id:rx7(@namikawa)の技術メモ を含むブックマーク はてなブックマーク - rpmのアップデートは、"rpm -i"の後に"rpm -e"の順にはたらく - id:rx7(@namikawa)の技術メモ rpmのアップデートは、"rpm -i"の後に"rpm -e"の順にはたらく - id:rx7(@namikawa)の技術メモ のブックマークコメント

シンボリック・リンクを含む全てのファイルを%installまででインストールして、 %filesに加えるべきである。

これは特に重要です。よく、%post で、シンボリック・リンクをはって、 %preun でそのリンクを削除するようなSPECファイルがあります。 これを行うと、アップデート時に問題が生じることがあります。以前、 libcのパッケージでこういう記述が入ってるものがあって、 深刻な問題が生じたこともありました。

その理由は、rpm -U <new-rpm> としたときに、

rpm -e <old-rpm>
rpm -i <new-rpm>

ではなく、

rpm -i <new-rpm>
rpm -e <old-rpm>

とはたらくためです。

つまり、%post で、シンボリック・リンクをはって、 %preun でそれを削除するような rpm のバージョンアップをしようと、 rpm -U (アップデート)を実行すると

  新しいパッケージのインストールが行なわれ、 %postでシンボリック・リンクがつくられる。

  古いパッケージのアンインストールが行なわれる。 このとき、%preunでさっき新しいパッケージが作ったシンボリック・ リンクが削除される。

この仕様は、libcとかのアップグレードの途中でlibcとかがなくなってトラブルが生じるのを避けようとしたためのものと思われます。

実はこの問題は解決法があります。 %pre, %post, %preun, %postunのスクリプト実行時には、スクリプトに対して以下の引数が与えられます。

  rpm -iでインストールを行うとき

  %pre, %postに対して$1=1

  rpm -Uでアップデートを行うとき

    新しいrpmのインストール時に、 %pre, %postに対して$1=2

    古いrpmをアンインストール時に、 %preun, %postunに対して$1=1

  rpm -eでアンインストールを行うとき

  %preun, %postunに対して$1=0

Vine Linux
トラックバック - http://tech.g.hatena.ne.jp/rx7/20110831