はじめに
エンジニアのnorthmkyです。
ラクスに新卒で入社し、今年で2年目になります。
業務ではシステムの運用保守チームに所属しているので断然サーバ周りの作業が多いということで今回はその中でもyum
コマンドについてまとめてみました。
おそらくこれを読めば
yum
とrpm
との違いって?とりあえずyum
使ってるけど...yum install [package]
って打つだけでなんでDL&Installできるの?
という疑問は少し解消されるかと思います。
まだまだ浅い知識なので間違っているところがあれば指摘いただけると嬉しいです。
yumとは
まずものすごく大雑把にいいますとyumは下記になります。
yumはRedHat系ディストリビューションのパッケージ管理システムです。
パッケージというのは「ソフトウェアを構成するファイルらをまとめたもの」で、設定ファイルやドキュメント、プログラム本体、プログラム本体が動くためのライブラリなどがそれにあたります。1
Linuxでは「パッケージ読み解き、ソフトウェアを正しく動作させるようにする」「パッケージの情報を管理する」ことでソフトウェアを使える/管理する仕組みを採用していて、今回取り上げるyumはLinuxディストリビューションのなかでRedHat系のパッケージ管理システムとなります。
このyumですが実際裏側ではrpmというパッケージ管理システムを使っています。
「rpmではできなかった点をyumができるようにしている」という立ち位置になっています。
この出来なかった点が冒頭に述べた
- 「リポジトリ」による自動更新機能
- 依存関係の管理(検出だけじゃない)
です。
リポジトリとは
意味のあるまとまりでパッケージを複数格納している場所のことです。
この場所には下記が格納されています。
- 複数のパッケージ(
./*.rpm
) - そのリポジトリのメタ情報ら(
./repodata
)
パッケージが複数存在してもその場所はリポジトリとは言えません。メタ情報があってリポジトリとなります。2
yumではこのリポジトリの情報を元にパッケージを検索したり、installを行います。
yum/rpm/リポジトリの関係性
yumとrpmとリポジトリの配置場所との関係性は下記のようになっています。
yumは/etc/yum.repos.d/*.repo
に記載されているリポジトリ場所にあるパッケージらに対してrpm経由でDLしたり、インストールしたり、必要であればインストール時に依存関係のあるパッケージを検出して一緒にインストールしたりします。
逆をいえば、/etc/yum.repos.d/*.repo
以外のレポジトリは情報がないのでyumは取得することができませんので注意してください。
では、実際によく打つコマンドを例にしてどのようになっているか見てみます。
yum install
を見てみる
「このコマンド(ソフトウェア)、インストールしてないからインストールしよう」というのはよくあると思うので
今回はyum isntall [package]
を通してどんなことが行われているかを見ていきたいと思います。
大枠の流れは上記のようになっています。
今回はphpをインストールしてみたいと思います。 (OS:CentOS6)
[root@localhost ~]# yum install php
こちらを実行すると、下記のようによく見るインストールしますか?
という対話モードになります。
この中身を見ていきましょう。
[root@localhost ~]# yum install php 読み込んだプラグイン:fastestmirror, security インストール処理の設定をしています Loading mirror speeds from cached hostfile /* 1.ミラーサイトの中で一番地理的に近いミラーサーバを各レポジトリごとに探す */ * base: ftp.jaist.ac.jp * epel: ftp.jaist.ac.jp * extras: ftp.jaist.ac.jp * remi-safe: mirrors.mediatemple.net * updates: ftp.jaist.ac.jp 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> Package php.x86_64 0:5.3.3-49.el6 will be インストール --> 依存性の処理をしています: php-common(x86-64) = 5.3.3-49.el6 のパッケージ: php-5.3.3-49.el6.x86_64 --> 依存性の処理をしています: php-cli(x86-64) = 5.3.3-49.el6 のパッケージ: php-5.3.3-49.el6.x86_64 --> トランザクションの確認を実行しています。 ---> Package php-cli.x86_64 0:5.3.3-49.el6 will be インストール ---> Package php-common.x86_64 0:5.3.3-49.el6 will be インストール --> 依存性解決を終了しました。 依存性を解決しました /* 2.必要なパッケージ情報を取得する */ ============================================================================================================================= パッケージ アーキテクチャ バージョン リポジトリー 容量 ============================================================================================================================= インストールしています: php x86_64 5.3.3-49.el6 base 1.1 M 依存性関連でのインストールをします。: php-cli x86_64 5.3.3-49.el6 base 2.2 M php-common x86_64 5.3.3-49.el6 base 530 k トランザクションの要約 ============================================================================================================================= インストール 3 パッケージ 総ダウンロード容量: 3.8 M インストール済み容量: 13 M これでいいですか? [y/N]
1. ミラーサイトの中で一番地理的に近いミラーサーバを各レポジトリごとに探す
結果としてリポジトリの場所(URL)のほとんどが.jp
ドメインつきなため、一番地理的に近いミラーサイトをレスポンスを計測して選んだというのがわかります。
これはyumが、前述した/etc/yum.repos.d/*.repo
のリポジトリの情報からインストールするリポジトリの場所を決定しています。ではphpのパッケージが存在する 「base」というリポジトリの情報が記載されているCentOS-Base.repo
を見てみます。
CentOS-Base.repo
1 # CentOS-Base.repo 2 # 3 # The mirror system uses the connecting IP address of the client and the 4 # update status of each mirror to pick mirrors that are updated to and 5 # geographically close to the client. You should use this for CentOS updates 6 # unless you are manually picking other mirrors. 7 # 8 # If the mirrorlist= does not work for you, as a fall back you can try the 9 # remarked out baseurl= line instead. 10 # 11 # 12 13 [base] /* 1.リポジトリ名 */ 14 name=CentOS-$releasever - Base 15 mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra /* 2.ミラーサイトリスト */ 16 #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ 17 gpgcheck=1 18 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 19 20 #released updates 21 [updates] 22 name=CentOS-$releasever - Updates 23 mirrorlist=http://mirrorlist.centos.org/? ... ...
*.repo
の中には基本的にはリポジトリ情報が複数記載されています。
mirrorlist
に設定されているURLを実際に叩くと、
[root@localhost ~]# curl 'http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os&infra=' http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/6.9/os/x86_64/ http://ftp.iij.ad.jp/pub/linux/centos/6.9/os/x86_64/ http://mirror.fairway.ne.jp/centos/6.9/os/x86_64/ http://ftp.tsukuba.wide.ad.jp/Linux/centos/6.9/os/x86_64/ http://ftp.riken.jp/Linux/centos/6.9/os/x86_64/ http://ftp.nara.wide.ad.jp/pub/Linux/centos/6.9/os/x86_64/ http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.9/os/x86_64/ http://www.ftp.ne.jp/Linux/packages/CentOS/6.9/os/x86_64/ http://mirror.0x.sg/centos/6.9/os/x86_64/ http://mirror.nus.edu.sg/centos/6.9/os/x86_64/ [root@localhost ~]
ミラーサイトのリストが返ってきます。
このリストからyumは一番近い場所を選定して、リポジトリ内のパッケージを取得する、ということをしているようです。
今回はftp.jaist.ac.jp
でした。
2. 必要なパッケージ情報を取得する
phpパッケージを対象にしただけですが、実際には依存してる他パッケージもインストールの準備をしています。
パッケージが依存しているソフトウェアは、パッケージ(.rpm)のSPECファイルというパッケージのメタ情報(ソースバージョンなど)を記載したファイルに記載してあります。3
この情報をRPMデータベース(/var/lib/rpm
)4と呼ばれるパッケージの情報を保存しておくDBに登録し、install前に検索をかけ、依存関係の有無を見ています。
このような処理が走ったあとでDL&installが行われます。
おわりに
yumについてまとめてみました。
yumとは
に記載した
- パッケージ管理システム
- rpmというパッケージ管理システムをラッパーしている
が伝えることができていれば幸いです。
ネットではチートシートや「rpmよりyumをまずは使うべし」などのハウツーの記事は多いのですが、
改めてどういった仕組み、処理でインストールが行われているかの記事はあまり見なかったので試行錯誤しながら執筆しました。
少しでも知識の助けになれば幸いです。(そして私自身の正しい知識の定着のためにもご指摘頂けると非常に助かります...!!)