シンボリック・リンク等を%postとかで張らない
間違えてもそれ(%postではったリンクなど)を%preunや%postunで削除してはいけない
シンボリック・リンクを含む全てのファイルを%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でさっき新しいパッケージが作ったシンボリック・ リンクが削除される。
実はこの問題は解決法があります。 %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
すなわち、はじめてインストールするときには、引数として1がわたされ、 rpm -eでアンインストールするときには0がわたされるわけです。 これを利用すると、
%post if [ $1 = 1]; then echo ``First installation!'' fi %preun if [ $1 = 0]; then echo ``Good bye!'' fi