【パッケージ】Linuxの「パッケージ」と「yum」と「rpm」について勉強したのでまとめてみた。

#事始め
CentOS6.5に入っているsvn1.6を1.8にしようと思った。

そこでrpmコマンドでrpmforgeのリポジトリを追加した事があったので、同様にsvn用のrpmをWANdiscoから取ってきてrpm -Uvhで追加。

yum update subversionしてみたのだが何故か1.6のまま。
それに/etc/yum.repos.d/を見てもrpmforgeの時とは異なりrepoファイルが追加されていない。

しかしrpm -qa | grep subversionでは何故かsubversion-1.8.9と表示されるから何がいけないのかまるで分らなくなった。
rpmはyumのリポジトリを追加するものだと思っていたのにぐぐってみるとそもそもその用途での説明が一切見つからないし。

完全にお手上げとなったので１から勉強しなおす事にした。
そんときのまとめ。

#パッケージについて
##概要
rpmコマンドはRPMパッケージをインストール/アンインストールするものらしい。

そもそもパッケージとは何か。

例えば何かしらのアプリケーションを使いたいとする。
昔はソースコードだけが提供されていたのでコンパイルする必要があった。
しかしこれではあんまりなので、あらかじめコンパイル済みのバイナリと、関連するファイル群を提供するようになった。

これをひとまとまりにしたファイルをパッケージと呼ぶ。

このパッケージはzipのような物と考えると不味い。
パッケージは解凍して自分で配置したりしない。パッケージを取り扱うことの出来るアプリケーションによってインストール・アンインストールなどが行える。

CentOSではrpmというコマンドでパッケージを取り扱う。

##RPMパッケージ
パッケージの形式はLinuxディストリビュージョンによって異なる。
Wikipedia先生によると

> RPM   : Red Hat系 (CentOSとか)
> deb   : Debian用 (Ubuntuも)
> ports : FreeDSB
> pkg   : Solaris

だそうで。
pkgと言えばMacのインストーラはpkgだった気がするけど同じものなのかはよく判らなかった。

んでRPMパッケージとはとりあえず自分が使ってるのはCentOSなので、CentOS向けのパッケージという事。
拡張子は「\*.rpm」(\*は任意の文字列)。

尚パッケージには命名規則が存在する。「OS名 - CPU - bit数」みたいな感じの。
ちょっと本稿の主題とずれるから命名規則に関しては割愛。

##ソースコード形式のパッケージ？
rpmは上述のようにアプリケーションのバイナリとそれを動かす為に必要な各種ファイルが固まっているファイル。

じゃあソースコード形式のパッケージなんて意味不明なわけなんだけど、
そんな感じの説明で「SRPM(ソースパッケージ)」というのを見かける。
拡張子は「\*.src.rpm」

これはRPMパッケージとはまた別のものと考えた方が良かった。
SRPMとはRPMパッケージを作る為のソースで、SRPMをビルドする事でRPMパッケージを作成できる。

これも本稿の主題とずれるのでこれ以上の解説は割愛。

##ここまでのまとめ
・パッケージとはアプリケーションのバイナリとそれを動かすのに必要な物が固まったファイル
・Red Hat系のLinuxのパッケージは「RPMパッケージ」として配布されるのが主流
・RPMパッケージはrpmコマンドによってインストール・アンインストールすることが出来る
・SRPMとはRPMパッケージを作る為のソースの事

#パッケージ管理について
##概要
ここからはLinuxディストリビュージョンはRed Hat系であるものとしてパッケージについて説明する。
この章ではRPMパッケージを取り扱うコマンド「rpm」についてまとめてみる。

##rpm(RedHat Package Manager)
rpmとはRedHat Package Managerの略。
ここから見ても判るとおりパッケージを管理するコマンドの事。

##「パッケージを管理する」とは何か
rpmコマンドはインストールしたパッケージを管理する。
「管理する」とは何か。

パッケージ間にはそれぞれ依存関係があるらしい。

例えば「パッケージＡ」「パッケージＢ」の２つのパッケージがあったとする。

パッケージＡを使うにはパッケージＢが必要。

という情報が　※どこかに　書かれているものとする。
(※パッケージＡ内に依存関係が記載されてるのかと思ったけど調べても判らなかったのでお茶を濁してます)

rpmコマンドで「パッケージＡ」をインストールしようとすると、
パッケージＢが存在しないのでインストールできなくなる。

逆にパッケージＡ、パッケージＢの２つがインストールされた状態でパッケージＢをrpmコマンドでアンインストールする。
すると依存関係を見ればパッケージＡが動かなくなるのは明白なので、アンインストール時に
「パッケージＡで使われてるからアンインストールできない」
というエラーが出る。

依存関係の管理とはこれらを行う為の情報を管理する事。
rpmではインストールしたパッケージの依存関係の情報をRPMデータベースというところに登録しておき、アンインストール時に確認しにいく。

#yum
##概要
どちらかといえばインストールやアンインストールはyumの方が一般的な気がする。知らないけど、何となく。
yumもパッケージ管理のコマンドで、rpmと目的は同じ。

##rpmの問題点
例えばあるパッケージをインストールするのに必要なパッケージが10個あったとする。
そして更にその10個のパッケージが、それぞれ別の10個のパッケージ(つまり全部で100個)に依存しているものとする。

そして更にその100個のパッケージが別の・・・

となるとrpmコマンドでははっきり言ってお手上げ。
（ここまで酷いとインストール以前に循環依存の方が心配だけど・・・）

##rpmの問題点を解消したyum
yumの素晴らしい点は上記の「rpmの問題点」を全て自動でやってくれること。
yumは何かパッケージをインストールする際に、依存するパッケージを全て勝手にダウンロードして、依存関係も全部調べて正しくインストールしてくれる。

その代りRPMパッケージを持ってきてインストールするっていう手順が隠れて
自分みたいにyumで適当にインスコしてた人類がいざrpmを使う際に何だこれな感じになってしまった感あるけどまぁ気にしない。

##yumはrpmと競合しないの？
気になるのがyumとrpmは競合しないのかという点。

しかしyumはrpmを使っている為問題ないらしい。
だからyumでインストールしてrpmでインストールしてと滅茶苦茶にやっても依存関係のデータベースは壊れやしない。

##リポジトリ
yumは指定したアプリケーションをインストールする際に、必要なパッケージを勝手にダウンロードしてくれる。つまりダウンロード先があるということ。このダウンロード先をリポジトリという。

yumが参照するリポジトリは

> /etc/yum.repos.d/

にファイルとして存在する。
インストール時にCentOS-Base.repoとかいうのが既に存在していて通常はこれを見てるっぽい。

yumはこのような仕様から「リポジトリ内に存在しないパッケージは落とせない」。

ようは「最新版のパッケージがリポジトリ内に無い場合はそれをインストールすることが出来ない」ってこと。

##別のリポジトリを参照する
例えば2015/02/09現在ではsubversionをデフォルトのリポジトリを参照してインストールすると1.6くらいが入る。
でもsubversionの最新は1.8.9。本当はこっちが使いたい。でもリポジトリに無いからインストールできない。

そこで２つの方法がある。
１つはオフィシャルサイトで配布されている最新のRPMパッケージを持ってきて直接rpmコマンドでインストールする方法。
もう１つは1.8.9の最新のsvnのパッケージが存在するリポジトリを追加する方法。

実はyum用のリポジトリには様々なものがある。
今まで使ったことがあるのはepel, remi, rpmforge。
どれも有名な物らしいが使った頃は上記のような仕様自体知らなかったので色々とアレだった。

どちらが良いかはケースバイケースな気がするけど、ここで言いたいのはyumが参照するリポジトリは追加できるよって話。
後リポジトリには様々なものがあるよって話。

尚、複数のリポジトリを参照する場合色々と問題が起きるらしい。
ただし、これについては本稿の主題とずれるので割愛する。

#「事始め」に記載した問題に対応する
ここまで情報が集まればやっとこやりたいことを実現する方法も判る。

svn1.6から1.8にアップデートしたくてもyumには存在しない。
svn1.8のパッケージが存在するリポジトリを追加するのはちょっと大げさすぎる気がする。

なのでsubversionのオフィシャルサイトからRPMパッケージを落としてきて

> $ rpm -i subversion-1.8

すれば良い。

実際やったらできた。良かった良かった。

#yum用のリポジトリを追加するのにrpmコマンドを利用する？
ところで事始めにて

> そこでrpmコマンドでrpmforgeのリポジトリを追加した事があったので...

と書いた。
そもそもこの記事を書こうと思った事の発端がこれ。これの所為で今まで中途半端に判らなかったrpmとかいうものが完全に判らなくなった。
rpmがあってyumがあるはずなのにrpmでyum用のリポジトリを追加するというのはどういうことだろう。

これに関しては結局最後まで判らなかったのだけれど、
どうやらrpmのインストールによってyum用のリポジトリを追加する事もできるらしい・・・。

憶測を書くのもどうかと思うけど以下は自分用メモ程度に見てほしい。

結局はパッケージというのはアプリケーション以外でも何らかのファイルならパッケージと言ってしまって構わないのだと思う。
yum用のリポジトリも実体はファイルでインストール場所は

>/etc/yum.repos.d/

である。rpmコマンドでこの場所にインストールしアンインストールもできる。

yum用のリポジトリには依存関係があるものもある。
rpmコマンドでパッケージとしてインストールできるようになっていればrpmコマンドに依存関係を管理させられる、
こういった依存関係のあるデータはパッケージとしてrpmに管理させた方が便利だ。

rpmがあってyumがあるのにyum用の情報をrpmでインストールできるというのが非常に気に食わなかったけど、
上記のように考えれば納得できるかな・・・