yumコマンドを用いてよく新しいモジュールをインストールすることって多いと思います。
このコマンド、あまり細部まで理解していなくても検索して出てきたコマンドをそのまま実行してだまってyをタイプしておけば大体の場合動くと思います。
ここで「よし動いた大丈夫」って思っている方は多分この記事を見る必要はないと思います。
実際内部でどういうことが起こっているのか、レポジトリってなに?(epel?remi?)なぜいっぱいあるの?
とか結構疑問はいっぱい出てきます。
今日はその辺のyumを取り巻く環境について調べたいと思います。
yumコマンド概要を理解する
yumとはYellowdog Updater Modifiedの略であり(それはどうでもいいか)パッケージを管理するメタパッケージ管理システムである。
FedoraやCentOSなどRPMベースのディストリビューションの多くでよく利用されている。
Wikipediaから抜粋
レポジトリとは動作の確認できているコンパイル済みのバイナリファイルを集めたストレージのことで、自分でわざわざソースコードの入手・コンパイルなどを行わなくても簡単に導入できます。
またソフトウェアが必要としているソフトウェアの依存性も自動的に検出して、必要な物も一緒にインストールしてくれます。
レポジトリを理解する
CentOSでよくみるレポジトリepelやらremiについて調べましょう。
Red Hat Enterprise Linux (RHEL)向けのパッケージであり、RHELから分岐したディストリビューション(CentOSもここに含まれます)と互換性のあるパッケージです。
目的はFedoraで提供されているパッケージをRHEL系のディストリビューションでも互換性を提供することにあるようです。
Fedoraで提供されている高品質なパッケージをそのまま互換性をのと同時に、プロジェクトに関してもFedoraプロジェクトと同じガイドライン、ルール、ポリシーに従うことを順守しているようです。
またremiについても同様に、有志によって管理されているプロジェクトになります。
公式ページを参照するとremiの目的ですが、最新バージョンのPHPモジュールをFedoraやRHEL系のディストリビューションに提供することとあります。それぞれ目的が異なるんですね。
yumコマンドを理解する
yumでのよく使うコマンドの一例を紹介します。
コマンド動作
install | パッケージをインストールする |
update | パッケージを更新する |
check-update | アップデート可能なパッケージ一覧を表示する |
remove | パッケージをアンインストールする |
list | インストール可能なパッケージ一覧を表示する |
search | 指定したキーワードでパッケージを検索する |
info | パッケージの情報を表示する |
リポジトリの追加の仕方を理解する
remiリポジトリを例に順をおって説明していきます。
- rpmファイルをダウンロードする
ネットで検索したりしてremiレポジトリのrpmファイルをダウンロードします。rpmファイルのパスは頻繁に更新されるようなので注意が必要です。
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
ここでrpmファイルとは。これまた(RPM Package Manager)とよばれ、Redhatにより開発されたこれまたパッケージ管理システムになります。
yumは実際にはrpmのラッパーとして動作しており、実際にパッケージのインストールに関してはrpmにより行われます。
rpmはパッケージをcpio形式で圧縮し、その中にspecファイル・バイナリまたはソースコードが含まれます。またパッケージを管理するためにBerkeley DBを採用していて、これによりローカルのパッケージ情報の管理がなされる。
specファイルにはパッケージの名前や、概要、依存するパッケージ、バイナリパッケージのインストールパス、インストール前後に実行するスクリプトなどが書かれていて、これによってユーザが意識しなくてもインストールを円滑に行うことができます。
rpmでは依存するパッケージは提供されますが、その実行はユーザに任せています。この辺りを自動的に解決するのがyumということになります。
- rpmファイルをインストールする
rpm --upgrade --verbose --hash remi-release-6.rpm
インストールされたかどうかを確認するためには下記のコマンドを利用します。
# rpm -qa | grep remi-release-6 remi-release-6.5-1.el6.remi.noarch
実際にリポジトリを使用するにはenablerepoと明示的にオプションに指定することや、設定ファイルに優先順位などを記述することで可能になります。
ここでは試しにremiリポジトリが提供しているphpに関するパッケージをかくにしてみましょう。
# yum --enablerepo=remi list | grep php php.x86_64 5.4.32-1.el6.remi @remi php-cli.x86_64 5.4.32-1.el6.remi @remi php-common.x86_64 5.4.32-1.el6.remi @remi php-mysql.x86_64 5.4.32-1.el6.remi @remi php-pdo.x86_64 5.4.32-1.el6.remi @remi ...
結局内部で何をしているかを理解する(つもりだったがまたの機会に)
大雑把なことわかったんですが、中身が気になりますので追っていきます。
確認環境はCentOS6.6になります。
vi /usr/bin/yum -- #!/usr/bin/python import sys try: import yum except ImportError: print >> sys.stderr, """\ There was a problem importing one of the Python modules required to run yum. The error leading to this problem was: %s Please install a package which provides this module, or verify that the module is installed correctly. It's possible that the above module doesn't match the current version of Python, which is: %s If you cannot solve this problem yourself, please go to the yum faq at: http://yum.baseurl.org/wiki/Faq """ % (sys.exc_value, sys.version) sys.exit(1) sys.path.insert(0, '/usr/share/yum-cli') try: import yummain yummain.user_main(sys.argv[1:], exit_code=True) except KeyboardInterrupt, e: print >> sys.stderr, "\n\nExiting on user cancel." sys.exit(1)
python。
ちなみにですがpythonは結構コマンドラインと親和性が高いように思っています。
デプロイツールの一種にもpythonを拡張したfabricというライブラリがあり、コマンドラインなんかを用意に実行できます。
そしてyumスクリプトを見ると実態はpythonのラッパーとして動作していることがわかります。
この続きについてはまた機会があるときに追跡しようと思います。
本日はyumの周りをざっくり理解してもらえたでしょうか。
[…] 解説サイトが多々あるので参照してください yumとかリポジトリとかとりまとめ […]
[…] まずepel?remi?リポジトリ?って感じですが、こちらによると […]
[…] epalやremiがなんなのかわからない方は、下記を参考にして下さい。 [参考] https://zudoh.com/archives/144 http://kayakuguri.github.io/blog/2015/12/18/linux-package/ […]