RedHat系のパッケージは、rpmというコマンドで管理する。パッケージ間の依存性や要求パッケージを管理して、適切なインストール状態を保ってくれる。使っていると、その管理には2つ課題があることに気付く。行き当りばったりではあるが、問題と対処法を紹介する。
- 一旦依存関係が崩れると、全く管理できなくなる。(100%か0か)
- 本来は許容されるべき依存性を認められない。
Firefox-2のupdateにFirefox-3が出てくるようになった。つまり、2.X系のメンテナンスリリースはもう打ち切りになり、3.Xにupgdadeしなさい、ということなんだろう。しかしながら、私の開発マシンでは、Firefox-3が動かない。TLSエラーが出る。この件は他でもあったが、Thread系の話で、カーネルとglibcの両方が絡む問題のようで、小手先で動くようにはできなかった。このため、古いglibcでFirefox-3をビルドすべく環境を少し追ってみた。その中でdbusが古いと言われたので、新しいのをソースからインストールする。
rpmは一旦依存性が崩れる(--forceとか--nodepsとかをしてインストールしてしまう)と、それ以降関係するパッケージは全部駄目になる(--forceとか付けることになる)ので、なるべく rpm を作ってインストールするようにしており、このために、checkinstallというツールを使っている。今回もこれでdbusをインストールしたのだが、いくつかのパッケージが依存していてインストールできない、とか言っているので、強引に--nodepsとかやってしまった。しかし、Firefoxのほうは結局コンパイルエラーが出てしまい、一旦頓挫した。
それで、何日か経ってみるとプリントができなくなっていた。cupsが上らない。messagesを見て、何時から上がらなくなっているかを確認し、その時刻近辺で変更されたファイルをfind / -ctime xx で確認する。で、dbusが悪いようだ。
UNIXのライブラリは原則としてversionの共存ができる。version番号が付いており、コンパイル時に使ったバージョンのライブラリを実行時にもリンクできる。ところが、古いバージョンのライブラリは消えてしまっていていて、それがリンクできない、ということで起動できなくなっている。rpmはupgrade(-U)でなくても消してしまうようだ。実際には、configuration(/etcとか)やファイル(/usr/shareとかに)を持つものは、libxx.soが共存できても、configとかのせいで動かなくなるかもしれない。ここまで考えて、ライブラリを共存させることは禁止にしているのだろう。
でも、実際には動くものもある。今回も dbus の古いライブラリだけをコピーしてやれば、動くようになった。やり方は、古いrpmを取ってきて、alien というツールでバラす。(alien --to-tgz xxxx.rpmとするとファイルがtar.gz形式で取り出せる)。それを /tmp のようなところで展開して、libxx.so.0.xxのようなファイルをコピーし、libxx.so.0へのリンクを作っておく。(詳しくはないが、major versionでリンクを管理するようだ)。
実際問題として、dbusを通常の通り make install でインストールしてしまえば、古いライブラリは概ね残って問題はなかったはずだ。でもrpmの依存性を壊したくなければ、rpmにしてインストールする。この辺りをスッキリ解決できるようにするアイデアはないのだろうか。aptではできているのかなぁ。