読者です 読者をやめる 読者になる 読者になる

mrepoでCentOSミラー&自作なyumレポジトリ作るよ

自宅環境に

yumレポジトリ作りたいけど、手動もめんどうだし、cobblerもちょっと大げさだし・・・
というわけでmrepoというツールを使ってみました。
http://dag.wieers.com/home-made/mrepo/


20行ほどのコンフィグを書いてmrepo -ugvvと打つだけでやりたいことができました。
シンプルでなかなかイイ感じなので、しばらく使ってみようかと思います。


以下、動作確認も兼ねた利用手順です。

インストール

とりあえずEPELから(作者はあのDagなので、みんなはぜひrpmforgeから!)

[root@repo ~]# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
[root@repo ~]# yum install mrepo

/etc/httpd/conf.d/mrepo.confを確認してApacheリロード。

[root@repo ~]# /etc/init.d/httpd reload
httpd を再読み込み中:                                      [  OK  ]

基本設定。ほぼデフォルトです

[root@repo ~]# vi /etc/mrepo.conf
[main]
srcdir = /var/mrepo
wwwdir = /var/www/mrepo
confdir = /etc/mrepo.conf.d
arch = x86_64

mailto = root@localhost
smtp-server = localhost

http://<サーバ>/mrepo/ にアクセスすればレポジトリの公開状況が確認できます。
/usr/share/doc/mrepo-0.8.7/のドキュメント、サンプル設定と合わせて随時参照してください。


CentOSミラーを作成

設定ファイル作成

ディストリビューションごとの設定は/etc/mrepo.conf.d/に置いていきます。
ミラーサイトここから好きなの選びましょう

[root@repo ~]# cp /usr/share/doc/mrepo-0.8.7/dists/centos5.conf /etc/mrepo.conf.d/
[root@repo ~]# vi /etc/mrepo.conf.d/centos5.conf 
[centos5]
name = CentOS $release ($arch)
release = 5
arch = x86_64
metadata = repomd repoview

#ISOファイル指定
iso = CentOS-5.6-x86_64-bin-DVD-?of?.iso

#レポジトリ名とミラーサイトを指定
updates    = rsync://ftp.riken.jp/centos/$release/updates/$arch/RPMS/
fasttrack  = rsync://ftp.riken.jp/centos/$release/fasttrack/$arch/RPMS/
centosplus = rsync://ftp.riken.jp/centos/$release/centosplus/$arch/RPMS/
extras     = rsync://ftp.riken.jp/centos/$release/extras/$arch/RPMS/
addons     = rsync://ftp.riken.jp/centos/$release/addons/$arch/RPMS/
contrib    = rsync://ftp.riken.jp/centos/$release/contrib/$arch/RPMS/

※DAGやEPELもミラーできるがとりあえずやらない

isoファイルをコピー
[root@repo ~]# mkdir /var/mrepo/iso
[root@repo ~]# mv iso/CentOS-5.6-x86_64-bin-DVD-?of2.iso /var/mrepo/iso/

※ソースを見た限りだと/var/mrepo/、/var/mrepo/iso/、/var/mrepo/centos5-x86_64/、/var/mrepo/centos5/のどれかに置けばいいようです。

設定の確認、ISOファイルのマウント
[root@repo ~]# mrepo -vv

公開ディレクトリにISOファイル(シンボリックリンク)とマウントディレクトリが配置されます

[root@repo ~]# ls /var/www/mrepo/centos5-x86_64/
disc1  disc2  iso

[root@repo ~]# ls /var/www/mrepo/centos5-x86_64/iso/
CentOS-5.6-x86_64-bin-DVD-1of2.iso  CentOS-5.6-x86_64-bin-DVD-2of2.iso

[root@repo ~]# df -h
...
/var/mrepo/iso/CentOS-5.6-x86_64-bin-DVD-1of2.iso
             4.0G  4.0G     0 100% /var/www/mrepo/centos5-x86_64/disc1
/var/mrepo/iso/CentOS-5.6-x86_64-bin-DVD-2of2.iso
             640M  640M     0 100% /var/www/mrepo/centos5-x86_64/disc2
レポジトリのミラー
[root@repo ~]# mrepo -uvv

/var/mrepo/centos5-x86_64にレポジトリのコピーが作られます

[root@repo mrepo-0.8.7]# ls /var/mrepo/centos5-x86_64
addons  centosplus  contrib  extras  fasttrack  updates
[root@repo ~]# ls /var/mrepo/centos5-x86_64/updates/
apr-1.2.7-11.el5_6.4.i386.rpm
apr-1.2.7-11.el5_6.4.x86_64.rpm
apr-devel-1.2.7-11.el5_6.4.i386.rpm
...
公開ディレクトリに展開
[root@repo ~]# mrepo -gvv

公開ディレクトリのRPM.<レポジトリ名>にRPMシンボリックリンク)が配置されます。

[root@repo ~]# ls /var/www/mrepo/centos5-x86_64/
HEADER.shtml  RPMS.all         RPMS.extras     RPMS.updates  iso
README.shtml  RPMS.centosplus  RPMS.fasttrack  disc1
RPMS.addons   RPMS.contrib     RPMS.os         disc2

[root@repo ~]# ls /var/www/mrepo/centos5-x86_64/RPMS.updates/
apr-1.2.7-11.el5_6.4.i386.rpm
apr-1.2.7-11.el5_6.4.x86_64.rpm
apr-devel-1.2.7-11.el5_6.4.i386.rpm
...

自作レポジトリの作成

freezeレポジトリにテスト済みのものを、testテストレポジトリにテスト中のものを、というシナリオでいきます

RPMを配置

テキトウなディレクトリにRPMを突っ込みます。

[root@repo ~]# mkdir -p /var/rpm/{freeze,test}
[root@repo ~]# mv rpm/MySQL-*.rpm /var/rpm/freeze/
[root@repo ~]# mv rpm/q4m-0.9.5-1.x86_64.rpm /var/rpm/test/
設定ファイル編集

/etc/mrepo.conf.d/centos5.confに以下を追記

freeze = file:///var/rpm/freeze/
test   = file:///var/rpm/test/
RPMの取り込み

レポジトリディストリビューションを指定するオプションをつけてアップデート

[root@repo ~]# mrepo -uvv -r freeze,test centos5-x86_64

この場合はシンボリックが作成されるだけなので、構成変更がなければ初回のみで良いです

[root@repo ~]# ll /var/mrepo/centos5-x86_64
合計 108
drwxr-xr-x 2 root root  4096 10月 20  2009 addons
drwxr-xr-x 2 root root 12288  4月 17 04:28 centosplus
drwxr-xr-x 2 root root  4096  5月 15  2010 contrib
drwxr-xr-x 2 root root 28672  5月 15 00:21 extras
drwxr-xr-x 2 root root  4096  5月 19 06:17 fasttrack
lrwxrwxrwx 1 root root    35  5月 23 10:49 freeze -> ../../os/centos5-x86_64/rpm/freeze/
lrwxrwxrwx 1 root root    33  5月 23 10:49 test -> ../../os/centos5-x86_64/rpm/test/
drwxr-xr-x 2 root root 53248  5月 19 04:58 updates
公開ディレクトリに展開
[root@repo ~]# mrepo -gvv -r freeze,test centos5-x86_64

シンボリックリンクが作成されてます

[root@repo ~]# ls /var/www/mrepo/centos5-x86_64/RPMS.freeze/
MySQL-client-community-5.1.56-1.rhel5.x86_64.rpm  MySQL-shared-community-5.1.56-1.rhel5.x86_64.rpm
MySQL-devel-community-5.1.56-1.rhel5.ia64.rpm     MySQL-shared-compat-5.1.56-1.rhel5.x86_64.rpm
MySQL-server-community-5.1.56-1.rhel5.x86_64.rpm  repodata

[root@repo ~]# ls /var/www/mrepo/centos5-x86_64/RPMS.test
q4m-0.9.5-1.x86_64.rpm  repodata

クライアント設定

/etc/yum.repos.d/CentOS-Base.repoを以下のように書き換えちゃいましょう。

[root@test02 ~]# cp /etc/yum.repos.d/CentOS-Base.repo{,.bak}
[root@test02 ~]# vi /etc/yum.repos.d/CentOS-Base.repo

[base-local]
name=CentOS-$releasever - Base
baseurl=http://192.168.1.10/mrepo/centos5-x86_64/RPMS.os/
gpgcheck=0

[updates-local]
name=CentOS-$releasever - Updates
baseurl=http://192.168.1.10/mrepo/centos5-x86_64/RPMS.updates/
gpgcheck=0

[addons-local]
name=CentOS-$releasever - Addons
baseurl=http://192.168.1.10/mrepo/centos5-x86_64/RPMS.addons/
gpgcheck=0

[extras-local]
name=CentOS-$releasever - Extras
baseurl=http://192.168.1.10/mrepo/centos5-x86_64/RPMS.extras/
gpgcheck=0

[centosplus-local]
name=CentOS-$releasever - Plus
baseurl=http://192.168.1.10/mrepo/centos5-x86_64/RPMS.centosplus/
gpgcheck=0
enabled=0

[contrib-local]
name=CentOS-$releasever - Contrib
baseurl=http://192.168.1.10/mrepo/centos5-x86_64/RPMS.contrib/
gpgcheck=0
enabled=0

[fasttrack-local]
name=CentOS-$releasever - Fasttrack
baseurl=http://192.168.1.10/mrepo/centos5-x86_64/RPMS.fasttrack/
gpgcheck=0
enabled=0

違いがわかりやすいように-localつけてます
(※ちゃんと変数つかうようにあとで書きなおす・・・)

自作レポジトリも登録

[root@test02 ~]# vi /etc/yum.repos.d/local.repo

[freeze]
name=CentOS-$releasever - Freeze
baseurl=http://192.168.1.10/mrepo/centos5-x86_64/RPMS.freeze/
gpgcheck=0

[test]
name=CentOS-$releasever - Test
baseurl=http://192.168.1.10/mrepo/centos5-x86_64/RPMS.test/
gpgcheck=0
enabled=0

使ってみる!!!

[root@test02 ~]# yum clean all
[root@test02 ~]# yum install php53
...
======================================================================
 Package         Arch      Version             Repository        Size
======================================================================
Installing:
 php53           x86_64    5.3.3-1.el5_6.1     updates-local    1.3 M
Installing for dependencies:
 php53-cli       x86_64    5.3.3-1.el5_6.1     updates-local    2.4 M
 php53-common    x86_64    5.3.3-1.el5_6.1     updates-local    605 k

Transaction Summary
======================================================================
Install       3 Package(s)
Upgrade       0 Package(s)

Total download size: 4.3 M
Is this ok [y/N]: y

…

Complete!

[root@test02 ~]# yum install --enablerepo=test q4m
...

======================================================================
 Package                  Arch     Version             Repository
                                                                 Size
======================================================================
Installing:
 q4m                      x86_64   0.9.5-1             test     712 k
Installing for dependencies:
 MySQL-server-community   x86_64   5.1.56-1.rhel5      freeze    20 M

Transaction Summary
======================================================================
Install       2 Package(s)
Upgrade       0 Package(s)

Total download size: 21 M
Is this ok [y/N]: y

...
Complete!
[root@test02 ~]#

あと細々したこと

自動更新したければcron設定しましょう
50 4 * * * mrepo -ug
--remountオプションがコケるのでちょっとだけ修正しました
[root@repo ~]# diff /usr/bin/mrepo /usr/bin/mrepo.orig 
584c584
<                 if mount:
---
>                 if mountpoint(mount):
yumグループ(comps.xml)が作られてないので修正しました・・・
#                for file in glob.glob(pathjoin(self.dir + '/disc1/*/base/comps.xml')):
                for file in glob.glob(pathjoin(self.dir + '/disc1/*/comps.xml')):


便利なんだけど、なにやらいろいろ不安なツールだ><