こんにちは、亀本です。ブログはだいぶご無沙汰となりました。
気が付いたらもう春ですね。アシアルにも新入社員が入ってきたりして、なんだか少しずつ環境の変化を感じる今日この頃です。
 さて今日は、社内に自分達専用のミラー+独自 yum リポジトリを立ててしまおう!というお話です。
 扱う話題としては、
  ・ローカルにyum ミラーリポジトリを構築する方法
  ・・+ローカルリポジトリの使用
  ・独自yum リポジトリを作る方法
  ・・+独自リポジトリの参照
 といった内容について紹介します。
0. 専用 yumリポジトリを立てる事のモチベーション
管理するサーバの台数が少ないうちはいいのですが、管理規模がどんどん多くなっていったり、頻繁に新しいOSをインストールしたりするような場合、OSのパッケージ管理に気を配る必要が出てきます。
 社内にCentOSが100台あったとしたら、そいつらが外部からyum updateでメタデータを更新するのにかかるネットワークコストを考えると、なんだかげんなりします。
 まぁyum updateぐらいなら別に我慢しててもいいんですが、サーバを何台も何台もセットアップする、となった場合には、パッケージのダウンロードだけで結構時間も食われますし、そもそも提供リポジトリサーバに対して失礼な感じですよね。
 それに、様々なシステムの構築をしていると、ディストリビュージョンが提供してくれている様々なライブラリ群だけでは物足りなくなって、サードパーティーリポジトリに手を出したりしますよね。
 が、サードパーティーのリポジトリにあるぐらいならまだいいんですが、その中にもないようなものを使おうとすると、もうソースからインストールするしかありません。
 もちろん、管理する規模が小さいうちは「なんだそのくらい」という話になるところですが、ある程度管理するサーバの台数が増えてくると、正直パッケージ管理できないと再利用性もないしバージョンの追随もつらいし、管理が煩雑になってしまって参っちゃいます。
 いや、実際にはできるかもしれませんが、なんかそういうことを心配するだけで疲れます。。。
で、とりあえずそういうデメリットを回避するために、ソースパッケージをrpmパッケージにしちゃってからインストールすると少しは効率良くなるのですが、rpmも依存性を自分で補完しなきゃいけないし、あんまり頭良くありません。
まぁ、そんな諸々の事情をすっきり解決しようと思うと、一番いいのが自前でリポジトリサーバを立ててしまうこと、というわけです。
1. ローカルミラーリポジトリの作成
 まずは、ローカルのミラーリポジトリを作成する方法です。
 これには色々な方法がありますが、ここでは「ネットワークコストを減らす」ということを目的として必要なリポジトリをミラーリングしてくる形をとります。
 HTTPベースでのリポジトリのミラーリングであれば、実はそれほど特別なことをしなくても、簡単にミラーサーバを立てることができます。
 やることはいたって単純で、「他のミラーサーバをまるっとコピーする」というだけです。
実行する処理は、以下の通り。
rsyncを使う場合:
% rsync  -avSHP --delete --exclude "local*" --exclude "isos" rsync://(site url)/centos/5.4/ /path/to/mirror/centos/5.4/
lftpを使う場合:
% lftp -e 'mirror --delete --only-newer -X *isos/* /centos/5.4 /path/to/mirror/centos/5.4  & & exit' (site url)
 パスは適宜環境に合わせて読み変えてください。
 2通りの方法を紹介しましたが、いずれも既にあるミラーから差分を見つけ、更新のあったパッケージのみをダウンロードしてきます。
 なお、--exclude(rsync)や -X(lftp)で指定した名前のディレクトリはダウンロードされませんので、ローカルに不要なisosなどのパッケージは除外しておきましょう。
 これを深夜に1日1回程度の頻度でcronで回してやれば、手軽にローカルのリポジトリを獲得することができます。
 あとは、ここでDLしてきたパッケージ群をHTTPDの見えるところに置いてやり、公開するようにhttpd.confを設定してやれば完了です。
たとえば、/var/www/htmlに centosディレクトリのシンボリックリンクを張り、/etc/httpd/conf.d/mirror.conf といったファイルを以下のような内容で作成してやればよいでしょう。
<Directory /var/www/html/centos>
  Options +Indexes +FollowSymLinks
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
  Allow from 192.168.0.0/16
</Directory>
 これでhttpdをreloadしてやれば、公開完了です。
 ちなみに、リポジトリを配置する場合には
centos/
  + 5 -> 5.4
  + 5.4 -> /path/to/centos/5.4
 という形で5 -> 5.4 のシンボリックリンクを張っておくとよいでしょう。こうしておけば、リンクを張り直してやるだけで常にcentos/5のパスから最新のパッケージを取得できるようになるからです。
 また、これらと同じ階層に、GPG-keyもダウンロードして置いておくとよりよいと思います。(なくても話は通りますが。)
% ln -s /path/to/mirror/centos/5.4
% ln -s 5.4/ 5
% wget ftp://(site url)/path/to/centos/RPM-GPG-KEY-CentOS-5
なお、rsyncでもlftpでもどちらでも可能なのですが、ダウンロード元のサーバ負荷を考えると、lftpでやることをお勧めします。
 rsyncは、更新があったかどうかを確認するために両者のサーバで対象ファイルを細かいブロックに分割し、そのブロックごとにチェックサムを計算して必要な部分だけをダウンロードしてきます。
 そのためダウンロード効率はいいのですが、ファイルサイズが大きくなればなるほど、チェックサムの計算に大きなCPU負荷を強いられる場合があります。
 (DBのdumpデータなどをrsyncしようとしたことのある方は、経験があるのではないでしょうか。)
対して、lftpのmirrorは、単純にファイルごとの更新時刻を見て判断し、ファイルを丸ごとダウンロードしてきます。
 このような事情があるため、rsyncでのミラーリングを定期cronで回すのは結構な負荷を強いることになります。
 善意で公開してくれているリポジトリサーバに余計な負荷をかけないためにも、特別な理由がなければlftpを使うようにしましょう。
1.1 ローカルマシンに、作成したミラーリポジトリを使うように設定する
せっかくミラーリポジトリを作っても、ローカル側でそれを利用するように指定してやらなければ、意味がありません。
というわけで、今作ったリポジトリを、ローカルマシンから指定するようにします。
 やることは単純で、.repoファイルの指定先URLを今公開しているサーバに向けるだけです。
 具体的には、/etc/yum.repos.d/CentOS-Base.repo 等の内容を、以下のように編集します。
[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever &arch=$basearch &repo=os
baseurl=http://(myrepo_name)/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
#released updates-
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever &arch=$basearch &repo=updates
baseurl=http://(myrepo_name)/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
#packages used/produced in the build but not released
[addons]
name=CentOS-$releasever - Addons
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever &arch=$basearch &repo=addons
baseurl=http://(myrepo_name)/centos/$releasever/addons/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
.
.
.
 やっている事は、mirrorlistのコメントアウトと、独自リポジトリURLの指定(baseurl=....)です。
 これを行うだけで、ローカルのリポジトリサーバを使うように指定することができます。
 なお、パッケージ管理をもっとちゃんとしたシステムとして組む場合なら、baseurlを指定するのではなく、ミラーリストファイルを独自に作成するとよいでしょう。
 mirrorlistの指定先としてそのファイルを見るように指定してやれば、仮に独自ミラーが死んだとしても更新は止まらずに済みます。
2. 独自yumリポジトリの作成
 さて、今までの話でローカルにミラーを構築・それを利用することはできるようになりました。
 では残る問題として、独自作成のrpm管理を行うために、独自の yum リポジトリを作成していきましょう。
 ...と、大仰な言い方をしては見ましたが、これもやはりサクッとやってしまうことができます。
 まずは、リポジトリ作成に使うcreaterepoコマンドをインストールします。
% sudo yum install createrepo
次に、公開したいパッケージを、httpdが見えるようなところに集めます。
% cd /var/ww/html
% mkdir -p asial/5/x86_64
% cp /path/to/hoge-package.rpm asial/5/x86_64
% ...
そして、このパッケージを配置したディレクトリに対して、createrepoコマンドを実行し、メタデータを作成します。
% createrepo asial/5/x86_64
 すると、同ディレクトリ内にrepodataディレクトリができ、その中にメタデータが記録されたファイルが配置されます。
 あとは、このディレクトリを先ほどと同様に公開してやれば、独自リポジトリが使えるようになります。
2.1 独自リポジトリを指定する
 あとは、呼び出し側でこのリポジトリを利用するように指定してやればOKです。
 /etc/yum.repos.d/asial.repo といったファイルを、以下のような内容で作成します。
[asial]
name=asial-CentOS-$releasever - additional
baseurl=http://(myrepo_name)/asial/5/$basearch/
enabled=1
gpgcheck=0
あとはこれで、yumを利用してやれば、他のリポジトリまで参照しながら依存関係をきちんと解決してくれます。
たとえば、以下は社内で作成したflareパッケージをインストールしようとしているところですが、きちんとasialリポジトリにあるflareが、baseにあるboostパッケージに依存している事を正しく判断しているのがわかります。
 このように、独自のyumリポジトリ作成は極めて簡単に行えることが分かってもらえたと思います。
 これだけ簡単に組めるにもかかわらず、yum を効率化できるメリットはとても大きいです。
この機会にぜひ、リポジトリ作成にトライしてみてください。