YUM(Yellowdog Updater Modified)はRPMベースのパッケージマネージャーであり、指定されたサーバーからRPMパッケージを自動的にダウンロードしてインストールできます。ソフトウェア間の依存関係を処理し、必要なすべての依存パッケージを一度にインストールできるため、個別にダウンロードしてインストールする必要はありません。
原理
YUMの動作原理
YUMの動作には、YUMサーバーとクライアント側のyumツールの2つの部分が連携して行われます。それぞれの部分の動作原理について以下で説明します。
- YUMサーバー
リリースされるすべてのRPMパッケージは、ダウンロードのためにYUMサーバーに配置されます。RPMパッケージはカーネルのバージョン番号やCPUのバージョン番号に基づいてそれぞれコンパイルされてリリースされます。YUMサーバーは単純なダウンロード機能を提供するだけでよく、FTPまたはHTTPDの形式どちらでも可能です。YUMサーバーで最も重要なのは、各RPMパッケージの基本情報を整理することです。これには、RPMパッケージに対応するバージョン番号、設定ファイル、バイナリ情報、そして非常に重要な依存関係情報が含まれます。YUMサーバーにはcreaterepoツールが提供されており、これを使用してRPMパッケージの基本概要情報を「一覧表」を作成します。この「一覧表」は各RPMパッケージのspecファイルの情報を記述したものです。
- YUMクライアント側
クライアントがyum installやsearchを呼び出すたびに、/etc/yum.repos.d以下のすべての.repoで終わる設定ファイル(YUMリポジトリ)を解析します。これらの設定ファイルはYUMサーバーのアドレスを指定しています。yumは定期的にYUMサーバー上のRPMパッケージの「一覧表」を「更新」し、その「一覧表」をyum自身のキャッシュにダウンロードして保存します。これは/etc/yum.confの設定に基づいて行われ(デフォルトでは/var/cache/yum以下)、yumでパッケージをインストールするたびにこのキャッシュディレクトリから「一覧表」を探します。「一覧表」内のRPMパッケージの説明に基づいて、インストールするパッケージの名前、バージョン番号、必要な依存パッケージなどを特定し、その後YUMサーバーからRPMパッケージをダウンロードしてインストールします(RPMパッケージのキャッシュが存在しない場合)。
/etc/yum.repos.d以下のすべての.repoで終わる設定ファイルがYUMリポジトリです。YUMリポジトリはソフトウェアウェアハウスへの接続のようなものであり、yumでソフトウェアをインストールする際には、実際にはこの接続を通じてソフトウェアウェアハウスにアクセスし、対応するソフトウェアパッケージを取得してインストールします。
YUMサーバーとクライアントの両方から構成されています:
YUMサーバー
Linuxクライアント
プロセス
YUMの設定ファイル
設定ファイルのディレクトリ:/etc/yum.repos.d
# vim /etc/yum.repos.d/CentOS-Base.repo
$releaserver:リリースバージョン番号$basearch:システム基本アーキテクチャ(例:x86_64)
[base]:コンテナ名を表し、名前は任意に設定できます
name:コンテナの意味を説明
mirrorlist:このコンテナで使用できるミラーサイトをリストアップ。使用したくない場合はコメントアウト可能
baseurl:コンテナアドレスを指定。mirrorlistはyumプログラムが自動でミラーサイトを探し、baseurlは特定のコンテナアドレスを指定
gpgcheck:RPMファイル内のデジタル証明書を確認する必要があるかどうか
gpgkey:デジタル証明書の公開鍵ファイルの場所。デフォルト値を使用
YUMサーバーが使用するコンテナの確認:
yum repolist allすべてのコンテ関連データを削除:yum clean all
機能
1. 検索
# yum search raid // 特定のソフトウェア名または説明の重要なキーワードを検索
# yum info mdadm // ソフトウェア機能を一覧表示
# yum list // YUMサーバー上のすべてのソフトウェア名を一覧表示
# yum list pam* // pamで始まるソフトウェア名を検索
# yum list updates // YUMサーバーで利用可能なアップグレードソフトウェアを一覧表示
2. インストール/アップグレード
# yum install/update ソフトウェア名
# yum install ソフトウェア名 -y // インストール中にyの確認入力不要
3. 削除
# yum remove ソフトウェア名
4. ソフトウェアグループ機能
# yum grouplist // コンテナとローカルで利用可能およびインストール済みのソフトウェアグループを確認
# yum groupinfo グループ名 // グループ内のすべてのグループ名を確認
# yum install/remove グループ名 // インストールと削除
システム全体のアップグレード
yum -y update:すべてのパッケージをアップグレードし、ソフトウェア設定とシステム設定を変更。システムバージョンとカーネルもアップグレード
yum -y upgrade:すべてのパッケージをアップグレードするが、ソフトウェア設定とシステム設定は変更しない。システムバージョンはアップグレードされるが、カーネルは変更されない
既に運用中のシステムではyum -y upgradeの方が安定しています
新規システムではyum -y updateの方が適しています
YUMサーバーの構築
1. ツールcreaterepoのインストール
$ yum install createrepo
2. リポジトリ公開ディレクトリの作成
$ mkdir /var/www/yum/centos/5/{i386,x86_64}
$ mkdir /var/www/yum/centos/6/{i386,x86_64}
3. rpmbuildで2つのRPMパッケージを生成。例えば、以下のパッケージでバージョン番号が異なり、パッケージ名も異なります
rpm_test-0.0.1-3.noarch.rpm
rpm_test-0.0.2-3.noarch.rpm
rpm_test2-0.0.2-3.noarch.rpm
4. RPMパッケージを公開ディレクトリにコピー
$ cp rpm_test-0.0.* /var/www/yum/centos/5/i386/
5. createrepoでメタ情報を生成
$ createrepo -o /var/www/yum/centos/5/i386/ /var/www/yum/centos/5/i386
3/3 - rpm_test-0.0.1-3.noarch.rpm
Saving Primary metadata
Saving file lists metadata
Saving other metadata
6. apacheまたはnginxを公開ディレクトリに設定
createrepoの後、/var/www/yum/centos/5/i386/に以下のディレクトリとファイルが生成されます
$ tree repodata/
repodata/
|-- filelists.xml.gz
|-- other.xml.gz
|-- primary.xml.gz
`-- repomd.xml
$ gunzip filelists.xml.gz
$ gunzip primary.xml.gz
filelists.xmlにはすべてのRPMパッケージのリスト、バージョン番号、設定ファイルなどが記録されています
<package pkgid="19c82aa653a394ee1f7dbc7b694fbf0221bc1848" name="rpm_test" arch="noarch"><version epoch="0" ver="0.0.1" rel="3"/><file>/usr/local/rpm_test/conf/test.conf</file><file>/usr/local/rpm_test/test.py</file><file type="dir">/usr/local/rpm_test/conf</file></package> ...
primary.xmlにはRPMパッケージの依存関係などの情報が記述されています
クライアントの設定
$ vim /etc/yum.repos.d/my_custom.repo
[myrepo]
name=My Custom Repository
baseurl=http://example.com/centos/5/i386/
enabled=1
gpgcheck=0
gpgkey=
ローカルYUMキャッシュの確認
デフォルトでは/var/cache/yumに各リポジトリに対応するキャッシュが記録されています
/var/cache/yum/
|-- base
| |-- cachecookie
| |-- mirrorlist.txt
| |-- packages
| |-- primary.xml.gz
| |-- primary.xml.gz.sqlite
| `-- repomd.xml
|-- epel
| |-- 76c4dcbfaf075e55d5876839eb11c4f33b3a2495-primary.sqlite
| |-- cachecookie
| |-- mirrorlist.txt
| |-- packages
| `-- repomd.xml
|-- myrepo
| |-- cachecookie
| |-- packages
| |-- primary.xml.gz
| |-- primary.xml.gz.sqlite
| `-- repomd.xml
|-- timedhosts.txt
|-- updates
| |-- cachecookie
| |-- mirrorlist.txt
| |-- packages
| |-- primary.sqlite
| `-- repomd.xml
- myrepoというリポジトリを確認すると、primary.xml.gzがYUMサーバーの「一覧表」ですが、ここではsqlite形式で保存されています。sqliteのDBを確認できます
$ sqlite3 primary.xml.gz.sqlite
sqlite> .table
conflicts db_info files obsoletes packages provides requires
sqlite> select * from packages;
1|896712eb4b4af2d61745dd30e0a6f6513043fd69|rpm_test|noarch|0.0.2|0|3|rpm_test|rpm_test by Developer||1406360629|1406360561|Commercial||tools|myrepo|rpm_test-0.0.2-3.src.rpm|280|2402||2734|268|816|rpm_test-0.0.2-3.noarch.rpm||sha
2|3ad546bd3ce28b0a82a1387f438f456349e20c78|rpm_test2|noarch|0.0.2|0|3|rpm_test|rpm_test by Developer||1406363739|1406363674|Commercial||tools|myrepo|rpm_test2-0.0.2-3.src.rpm|280|2406||2738|268|816|rpm_test2-0.0.2-3.noarch.rpm||sha
3|19c82aa653a394ee1f7dbc7b694fbf0221bc1848|rpm_test|noarch|0.0.1|0|3|rpm_test|rpm_test by Developer||1406360629|1406356964|Commercial||tools|myrepo|rpm_test-0.0.1-3.src.rpm|280|2402||2733|268|816|rpm_test-0.0.1-3.noarch.rpm||sha
sqlite> select * from requires;
/bin/sh|||||1|TRUE
python|GE|0|2.4.3||1|FALSE
/bin/sh|||||2|TRUE
python|GE|0|2.4.3||2|FALSE
/bin/sh|||||3|TRUE
python|GE|0|2.4.3||3|FALSE
- yumでパッケージをインストールまたはアンインストールするたびにこのsqliteのDBをクエリし、対応する操作を行います。
- ローカルYUMキャッシュのクリア
sudo yumを呼び出すとこの「一覧表」がすべてクリアされ、次回yum installなどの操作で再生成されます。
$ sudo yum clean
/var/cache/yum/
|-- base
| |-- packages
|-- epel
| |-- packages
|-- myrepo
| |-- packages
|-- updates
| |-- packages
- timedhosts.txtというファイルにはすべてのソースアドレスへのアクセスに必要な時間が記録されており、どのソースアドレスが遅いかを確認できます
- /etc/yum.confでkeepcacheオプションが1に設定されている場合、ダウンロードされたRPMパッケージはすべて/var/cache/yum/xxx/packageに保存されます
- yum install packageでパッケージが既にインストールされているかどうかを判断する方法は、これは/var/cache/yumではなく/var/lib/rpm/で取得されます。なぜなら、パッケージをインストールする際にroot権限でこのフォルダの下のdbに書き込む必要があるからです。この部分の詳細はrpmのソースコードを見る必要があります