2007/05/31

ローカルミラーレポジトリ・その4・レポジトリの更新(reposync & createrepo)

ローカルミラーレポジトリシリーズ第四回。前回は、更新されないBaseレポジトリを構築したが、今回はUpdatesやExtrasなど、随時更新されるレポジトリを構築・運用する。

第一回目で書いた通り、公式レポジトリの内、Baseを除くUpdates、Addons、Extras、PlusおよびContribは、随時更新されるレポジトリなので、定期的に内容を同期(ミラーリング)しなければならない。同期する手段は、
  • lftpコマンドのmirrorコマンドを利用する
  • rsyncを利用する
  • reposyncコマンドを利用する
等の方法があるが、今回は最後のreposyncコマンドを利用する方法を紹介する。

このreposyncコマンドは、yumレポジトリの同期を取るコマンドで、yum-utilsパッケージに収録されている。もしこのパッケージがインストールされていなければ、インストールする。
# yum install yum-utils
reposyncコマンドのmanページは無い様だ。使い方は、reposync --helpを実行して確認する。

まず、レポジトリ管理は、root権限を必要としないので、レポジトリを管理するユーザを作成する。これは既存のユーザを流用してもいいが、レポジトリが汚染されると一大事なので、これ専用のユーザを準備し、レポジトリの所有者を変更する。
# useradd -c "Repository Maintainer" -d /home/reposer reposer
# cd /var/www/html/
# chown -R reposer.reposer centos/
以後、レポジトリに対する操作は、このユーザの権限で行う。

CentOSのレポジトリは通常、以下のようなディレクトリ構造を持つ。
$ pwd
/var/www/html
$ find . -type d
.
./centos
./centos/5
<<略>>
./centos/5/extras
./centos/5/extras/i386
./centos/5/extras/i386/repodata
./centos/5/contrib
<<略>>
repodataというディレクトリは、yumが利用するメタデータを格納したディレクトリで、RPMSは文字通り、RPMパッケージが格納されている。目標は、これと同じ構造をローカルに作ること、ということになる。

しかし、reposyncコマンドは、このようなディレクトリ構造を生成しない。例えば、
$ ls
$ reposync -r extras
Loading "installonlyn" plugin
Downloading Terminal-0.2.6-2.i386.rpm
<<略>>
Downloading yumex-1.2.2-1.0.el5.centos.noarch.rpm
$ find . -type d
.
./extras
./extras/RPMS
$
まず、パス中にi386ディレクトリが抜かれているし、repodataディレクトリも存在していない。これを解決するために、reposyncの実行に先立ち、必要なディレクトリ構造及びシンボリックリンクを作成するスクリプトCreateRepoDirs.sh/var/www/html/centos/5へ移動した後実行する。
$ cat CreateRepoDirs.sh
#!/bin/bash
REPOSITORIES="updates addons extras centosplus"
TOP=$PWD
for repository in $REPOSITORIES
do
repo_path=$TOP/$repository
mkdir $repo_path
mkdir $repo_path/RPMS
ln -s $repo_path/RPMS $repo_path/i386
done
続いて、パッケージをダウンロードするスクリプトCentOS-repository-mirror.shを準備する。Cronで実行するだけなので、どこに置いても構わないが、私は、/usr/local/sbinの下に置いた。
$ cat CentOS-repository-mirror.sh
#!/bin/bash
LANG=C
REPOSITORIES="updates addons extras centosplus"
TOP=$PWD
echo "## `date`: BEGIN MIRRORING"
for repository in $REPOSITORIES
do
echo "#### `date`: BEGIN REPOSITORY $repository"
repo_path=$TOP/$repository
reposync -c /usr/local/etc/yum.conf -r $repository
createrepo -v $repo_path/RPMS
echo "#### `date`: END REPOSITORY $repository"
done
echo "## `date`: END MIRRORING"
$
わざわざreposyncの設定ファイルを/usr/local/etc/yum.confに準備しているのは、パッケージを更新するのに参照するのをローカルミラーレポジトリに、reposyncが参照するのを公開ミラーレポジトリに変更するため。次のcreaterepoコマンドは、メタデータ(repodata)を作成するコマンド。
/usr/local/etc/yum.confの内容は以下の通り。
$ cat yum.conf
[main]
reposdir=/usr/local/etc/yum.repos.d
$
/usr/local/etc/yum.repos.dには/etc/yum.repos.d/CentOS-Base.repoをコピーしておく(BaseとContribは不要なので、セクションごとコメントアウトした方がいいかもしれない)
後は、/var/www/html/centos/5に移動して、CentOS-repository-mirror.shを実行すればOKだ。

これらのレポジトリは、随時更新されるので、このコマンドを定期的に実行するといいだろう。これは、ユーザreposerの権限でcronにより実行する。ユーザreposerでコマンドcrontab -eを実行し、ユーザのreposerのcrontabに以下の行を追加する。
13 2 * * * cd /var/www/html/centos/5; mv -f mirror.log mirror.log.old; /usr/local/sbin/CentOS-repository-mirror.sh > mirror.log 2>&1
上の設定は、毎日2:13にレポジトリを更新する例。時刻は環境に応じて変更する。

最後にPGPのキーをインストールする。CentOS 5のPGPのキーは、http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5にあるので、これを/var/www/html/centosに置く。
$ cd /var/www/html/centos
$ wget http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

ローカルミラーレポジトリ・その1・概要
ローカルミラーレポジトリ・その2・レポジトリの準備と公開
ローカルミラーレポジトリ・その3・Baseレポジトリ
ローカルミラーレポジトリ・その4・レポジトリの更新(reposync & createrepo)
ローカルミラーレポジトリ・その5・レポジトリの利用

0 件のコメント: