yumリポジトリの使い方/設定/作成方法


業務でよく使用するyumコマンドの使い方についてまとめます。また、リポジトリの設定(登録)方法や、LAN内yumリポジトリの作成方法についても触れます。

yum コマンド

使用頻度の高いコマンド一覧

yumは、Redhat系のLinuxにおけるパッケージ管理の仕組みです。使用頻度の高いyumコマンドをまとめると以下のようになります。

コマンド説明
install指定したパッケージをインストールします。
remove指定したパッケージを削除します。
update指定したパッケージをバージョンアップします。
searchパッケージを検索します。
provides指定したコマンドを提供するパッケージを検索します。
clean metadataパッケージに関するメタデータを削除します。

yum install

yum installは指定したパッケージをインストールするコマンドです。

使用例は以下の通りです。以下のようなコマンドを実行する事で、”httpdをインストールする事ができます。なお、-yは質問に対して全て”yes”と答えるオプションです。”yes”と入力するのが面倒な場合やスクリプトで自動化を検討する場合などは、-yオプションを付与しましょう。

yum search

yum searchはパッケージ名を検索するコマンドです。

例えば、ruby gemを検索したいと思います。以下のようにコマンドを実行すると、”rubygem”を含むパッケージ名を検索する事ができます。検索の結果、正確なパッケージ名は”rubygems”である事が分かります。

検索対象となるのは、パッケージ名とSummary(パッケージの説明概要)です。Summaryも検索対象である事を意識しておくと何かと便利です。例えば、”yum search japanese”とすると日本語フォント一覧を検索する事ができます。

yum provides (whatprovides)

yum provides または whatprovides は、コマンド名からパッケージ名を検索するコマンドです。

例えば、snmpwalkコマンドを提供するパッケージ名を検索するには、”yum provides */snmpwalk”とします。このコマンドの注意点は、コマンドのフルパスを指定しなければならない事です。恐らくコマンドのフルパスを覚えている人はいないと思いますので、snmpwalkコマンドを調べたいならば、*/snmpwalkのように適宜ワイルドカードを使用して下さい。

操作例は以下の通りです。

yum clean metadata

yum clean metadataはパッケージ管理に関するメタデータを削除するコマンドです。

yum update等の完了を待ちきれずCtrl+Cで強制終了させてしまうと、yumのメタデータが壊れてしまいます。恐らく、”TypeError: unsubscriptable object”のようなエラーメッセージが表示されるでしょう。

このようなエラーが発生した場合は、”yum clean metadata”コマンドでメタデータを削除して下さい。メタデータを削除すれば、yumコマンド再実行時にメタデータが再構築されエラーが解消されます。

リポジトリの追加

yumは必要に応じてリポジトリを追加する事ができます。リポジトリを追加する目的は大きく分けて以下2つです。

  • 拡張リポジトリ : 最新のソフトウェアを使用したい
  • 特定リポジトリ : リポジトリによって提供されるソフトウェアをインストールしたい

なお、「拡張リポジトリ」「特定リポジトリ」というのは私の造語です。一般的な命名ではない事をご承知ください。

拡張リポジトリの追加

CentOS, Redhat, Oracle Linux等は比較的安定したソフトウェアを使用します。一方、Fedora等は新しいソフトウェアを提供します。CentOS, Redhat, Oracle Linux等を使用する場合は、提供するパッケージのバージョンが古く業務要件を満たさない場合もあるかもしれません。

そのような場合は、Fedora等のリポジトリを追加する事によって、新しいソフトウェアを導入する事ができます。CentOSを使用している人がよく追加するリポジトリは以下3つです。

  • RPMforge
  • EPEL
  • Remi

これらリポジトリを追加するには、以下のRPMをインストールしてください。RPMをインストールすると、自動的にリポジトリの設定が作成されます。インストールすべきRPMは、OSバージョンやCPUアーキテクチャによって異なる事に注意して下さい。

RPMインストール後、/etc/yum.repos.d/配下に、epel.repo, mirrors-rpmforge, remi.repoが作成された事を確認します。

RPMインストールは、epel.repo, mirrors-rpmforge, remi.repoを作成する事と全く同じ操作です。ですので、epel.repo, mirrors-rpmforge, remi.repoを手作業で作成しても差し支えございません。

RPMForge, EPEL, Remiは非常に便利ですが、「新しい」という事は「バグが枯れていない」という事の裏返しである事に注意して下さい。WEB系の企業ではこれら3つのリポジトリを有効化するのは当たり前ですが、慎重なSIerではリポジトリ追加を行って良いかは要顧客確認です。

専用リポジトリの追加

近年、リポジトリを追加した後にyumコマンドでインストールを行うソフトウェアが増加傾向にあります。例えば、jenkins, nginx, td-agent, mysql, Oracle Pre Install等を挙げる事ができます。以下、Jenkinsのインストールを例に挙げて、専用リポジトリの追加方法を説明します。

手順は非常に簡単です。公式サイトに書かれている手順のコピペで問題なく動作します。

yum_jenkins_001

まず、Jenkinsリポジトリを登録します。

次にyumコマンドでJenkinsのインストールを行います。

以上でJenkinsのインストールが完了です。

yum 設定

/etc/yum.conf, /etc/yum.repos.dの設定を変更する事によって、yumコマンド実行時の挙動を変更する事ができます。

yum リポジトリの有効化 無効化

yumリポジトリは有効 無効を定義する事ができます。例えば、Amazon Linuxの設定は、安定したAmazon Linuxリポジトリは有効になっていますが、新しい(不安定な)EPELリポジトリは無効化されています。このように不安定なリポジトリを無効化しておく事で、バグを含むリスクが大きなソフトウェアを不用意にインストールする事を防ぐ事ができます。

リポジトリの有効無効は、”yum repolist”コマンドで確認する事ができます。このコマンドで有効なリポジトリ一覧を表示します。このコマンドにallオプションを付与すれば、無効なリポジトリ含め一覧を表示します。

リポジトリの有効無効は、enabledという項目によって定義されます。以下は、/etc/yum.repos.d/epel.repoの設定の一部です。enabled=1となっている事からepelリポジトリは有効になっているのに対し、enabled=0となっている事からepel-debuginfoは無効になっている事が分かります。

このenabledの部分をエディタで書き換えても良いですが、yum-config-managerというコマンドを用いるともっと便利です。以下は、centosplusを有効にする操作例です。

centosplusが有効になった事を確認します。

特定ファイルの除外

パッケージの中には、バージョンアップの影響が大きい物と小さい物があります。中でもkernelのバージョンアップはOSの挙動を大きく変えてしまうので、意図しないバージョンアップは何としてでも避けなければなりません。

このような要件の場合、/etc/yum.confにexcludeを指定する事で、特定のパッケージをyumコマンドの対象外とする事ができます。設定例は以下の通りです。複数のパッケージを除外したい場合は以下のようにワイルドカードを使用して下さい。

yum やや使用頻度の低い コマンドとオプションの紹介

やや使用頻度の低いyumコマンドとオプションを紹介します。知らなくてもどうにか運用できますが、知っていると何かと便利なコマンドとオプションです。

yum groupinstall

groupinstallはパッケージ群をインストールするコマンドです。KVMをインストールするならば”Virtualization Platform”が必要になりますし、OracleのようなGUI環境が必要ならば”X Window System”が必要になります。コマンドの実行例は以下の通りです。

パッケージ群の名前はスペースを含む事もありますので、スペースを含む場合はダブルクォートまたはシングルクォートで囲んで下さい。

yum grouplist

yum grouplistはgruopinstallコマンドでインストール可能なパッケージ群一覧を表示させます。パッケージ群の名前はディストリビューションやバージョンによって微妙に異なります。どこかのブログ記事の”yum groupinstall”コマンドをコピペしても動かない事が多いので、ちゃんとgrouplistコマンドで調べてからgroupinstallを実行するようにしましょう。

コマンドの実行例は以下の通りです。

yum –enablerepo –disablerepo

enablerepo, disablerepoは一時的にリポジトリの有効無効を切り替えるコマンドです。例えば、epelが無効化されている環境において、一時的にepelを使用したい場合は”–enablerepo=epel”とします。コマンドの実行例は以下の通りです。

全てのリポジトリを有効化しているような無鉄砲漢らしい環境ならば、disablerepoの指定も有効です。例えば、baseのパッケージのみを使用したいならば、”–disablerepo=*”の後に”–enablerepo=base”とすると良いでしょう。実行例は以下の通りです。

yum –disableexcludes

disableexcludesオプションはexcludesで無効化したパッケージの設定を無視するオプションです。

環境によっては/etc/yum.confに”exclude=kernel*”の指定が存在し、kernelのバージョンアップができない場合もあるかと思います。このような環境下でkernelのバージョンアップを行うには/etc/yum.confを一時的に書きかえても良いですが、disableexcludesオプションを指定した方がより便利です。

disableexcludesにはパッケージ無効化を無視したいリポジトリを指定します。例えば、epelならば”–disableexcludes=epel”と指定し、全てのリポジトリを対象にするならば、”–disableexcludes=all”とします。コマンドの実行例は以下の通りです。

ミラーリポジトリ (LAN内リポジトリ) の作成

ミラーリポジトリ作成の目的

非機能要件や運用ルールによっては、LAN内のリポジトリ構築を検討した方が良い事もあります。LAN内にリポジトリを構築するメリットは以下の通りです。

  • 容易なパッケージ管理ができる。
  • パッケージバージョンを固定化できる
  • インターネットまたは社外リポジトリの仕様変更/障害の影響を受けない

当たり前の話かもしれませんが、yumのメリットは容易なパッケージ管理です。RPMコマンドと違って自動的に依存関係を解決してくれます。エンタープライズ環境では「そもそもインターネット接続ができない」との理由でyumによる管理を諦めている運用もありますが、LAN内にリポジトリを構築してしまえばyumの恩恵を受ける事ができます。リポジトリの構築はそれ程難しくはありません。

例えば”yum install td-agent”のようにバージョン指定を省略すると、最新バージョンのパッケージがインストールされてしまいます。言い換えれば、リポジトリ側に新バージョンのRPMが配置されれば、勝手にバージョンアップされてしまう事を意味します。もし、意図しないバージョンアップを避けたいならば、社内にリポジトリを構築しバージョンを管理できるようにする必要があります。

LAN内リポジトリは「インターネットまたは社外リポジトリの仕様変更/障害の影響を受けない」というメリットがあります。例えば、”yum install munin”のような操作をした際に、DNSやインターネット回線に障害が発生すると、正常なインストールができなくなってしまいます。また、リポジトリ側のURL変更のような仕様変更が発生すると、今まで正常に動いていたインストール処理が突然失敗してしまいます。しかし、LAN内にリポジトリを作成すれば、安定したインストール処理を行う事ができます。

yumリポジトリに関して言えば、社外リポジトリの仕様変更は滅多にありません。しかし、サードパーティ製リポジトリ ( 例 : rubygems, php pearなど ) は障害も多いし仕様変更も多いです。ですので、yumに関して言えばあまり関係ない話ですが、オーケストレーションの文脈では「社外の仕様変更リスク」は充分な設計が必要になるポイントです。

rsyncによるリポジトリ作成

リポジトリを作成する最も簡単な方法は、rsyncでリポジトリをそのままコピーしてしまう方法です。まずは、CentOS公式サイトを訪れて、rsyncに対応したミラーを探します。

centos_rsync_mirrors_001

rsyncを用いてリポジトリをコピーします。以下は、CentOSのbase, updatesリポジトリをコピーするコマンド例です。なお、コピーするリポジトリのURLはOSバージョンやCPUアーキテクチャに応じて適宜変更して下さい。

パーミッションの設定も忘れずに行いましょう。

最後に/etc/yum.repo.d/CentOS-Base.repoに記述されたリポジトリのURLを変更する事で、LAN内リポジトリ環境の構築完了です。baseurlの部分を適当な値に書き換えて下さい。

reposyncによるリポジトリ作成

リポジトリのコピーを作成するには、reposyncとcreaterepoコマンドを使用すると非常に便利です。まず、reposync, createrepoコマンドが使用可能になるように、以下のパッケージをインストールします。

reposyncは/etc/yum.confで定義されたリポジトリのミラーを作成するコマンドです。-r (–repoid)でリポジトリ名を指定して使用します。以下はepelのミラー作成例です。

reposyncは単純にRPMのコピーだけを行うだけのコマンドです。yumによるパッケージ検索を行うには、リポジトリの情報を定義したXMLファイルも設ける必要があります。このXMLファイルを手作業で作成するのは非常に難しいので、createrepoというコマンドを使用します。

以下のような要領で、createrepoコマンドを実行します。すると、リポジトリの定義情報である”./repodata/repomd.xml”が作成されている事が分かります。

パーミッションの設定も忘れずに行いましょう。

最後に/etc/yum.repo.d/epel.repoに記述されたリポジトリのURLを変更する事で、LAN内リポジトリ環境の構築完了です。baseurlの部分を適当な値に書き換えて下さい。

補足説明です。createrepoコマンドで作成された”./repodata/repomd.xml”にはgroupinstallに関する情報は含まれていない事に注意して下さい。もしgroupinstallが必要となる運用の場合は、前述のrsyncによる構築か、後述のCD-ROMによる構築を検討して下さい。

CD-ROM によるリポジトリ作成

今まで紹介したrsync, reposyncによるリポジトリ構築手順は、比較的セキュリティポリシーの緩い、インターネット接続が可能な環境を前提にした手順になります。

しかし、インターネット接続が許されないようなエンタープライズ環境では、上記手順を遂行する事は非常に難しいかもしれません。そのような環境でお勧めする方法がCD-ROMによるリポジトリ構築です。

CentOSのCD-ROMが物理的に接続されているのならば、以下のようなマウント操作を行います。

もし、CentOSがISO形式のデータならば、-o loopオプションを使用してマウントします。

あとは、/etc/yum.repos.d/CentOS-Media.repoの設定を適宜変更します。baseurlを適切な値に変更し、enabled=1とします。

Tips

yumBackend.py

yumコマンド実行時に、”Existing lock /var/run/yum.pid: another copy is running as pid XXXX.”とのエラーメッセージが、以下のように出力される事があるかもしれません。

これはpackagekitdと呼ばれるパッケージ管理の常駐プログラムがハングアップしてしまう事に起因する現象です。packagekitdは、Redhat系LinuxをGUI (ランレベル 5)で起動した時に右上に表示される「パッケージ更新のプログラム」です。

以下はOracle Linuxのスクリーンショットですが、右上のバグのアイコンがpackagekitdです。

packagekitd_001

ランレベル 5で発生する不具合なので、GUIをよく使うような環境、例えば、

  • 家庭用としてFedoraを使用する場合
  • OracleやKVMのインストールのためにGUIを立ち上げた場合

のような環境でよく見られる不具合です。

この現象に対する一次対応としては、yumBackend.pyをkillして下さい。そうすれば、親プロセスであるpackagekitdも自動的に終了します。

恒久対応としては、/etc/PackageKit/PackageKit.confという設定ファイルについて、DefaultBackendをyumからnobackendに変更します。設定例は以下の通りです。

動作確認環境

  • 動作確認日 : 2014/10/16
  • CentOS 6.5 64bit ( Sakura VPS ), Redhat 6.5 64bit ( AWS ), Oracle Linux 6.5 64bit (Virtual Box)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする