2014年11月18日火曜日

Ubuntu でリポジトリのミラーサーバーを構築

Ubuntu Japanese Team Ubuntu 14.04 日本語パッケージリポジトリのミラーサーバーをローカルに立ててみました。

構成的には以下のようになります

http://2.bp.blogspot.com/-16Bx2WPqbsc/VGq_Q6iF-kI/AAAAAAAAAIk/PmcHxyWx_bU/s1600/Schematic.png

環境

RepoMirror, ClientHost 共に Ubuntu 14.04 Server amd64 です。

本当は Ubuntu Japanese Team とは全く関係が無い重くて遅い別のリポジトリがあって、複数台のサーバーからリポジトリを直接参照するのが大変なので、最終的にはそのリポジトリをミラーする予定です。


ClientHost 側の確認

まず、仮にリポジトリのミラーを使用しない場合に ClientHost に Ubuntu 14.04 日本語パッケージリポジトリを登録するとしたら sources.list に記載すべき内容を確認します。

https://www.ubuntulinux.jp/japanese を参考にすると、Ubuntu 14.04 (trusty) の場合は以下の内容で良いようです。 (読みやすくするために適宜スペースを入れてます。)

$ wget --output-document - --quiet https://www.ubuntulinux.jp/sources.list.d/trusty.list
## Ubuntu Japanese LoCo Team's repository for Ubuntu 14.04
## Please report any bugs to https://bugs.launchpad.net/ubuntu-jp-improvement
deb     http://archive.ubuntulinux.jp/ubuntu             trusty main
deb-src http://archive.ubuntulinux.jp/ubuntu             trusty main
deb     http://archive.ubuntulinux.jp/ubuntu-ja-non-free trusty multiverse
deb-src http://archive.ubuntulinux.jp/ubuntu-ja-non-free trusty multiverse

https://wiki.debian.org/Multiarch/HOWTO を読むと、「 deb http:... 」の場合は、 dpkg コマンドで得られるアーキテクチャ (amd64 とか armhf とか) をリポジトリからダウンロードするようです。

TestClient にて現在のマシンアーキテクチャを dpkg コマンドで確認します。
$ dpkg --print-architecture
amd64

Ubuntu 14.04 Server amd64 なサーバーなので、amd64 です。

マシンアーキテクチャ以外のインストール可能なアーキテクチャも確認します。
$ dpkg --print-foreign-architectures
i386

amd64 以外だと、i386 用のパッケージもインストール可能になってます。

これらは以下のようにファイルでも確認できるようです。
$ cat /var/lib/dpkg/arch
amd64
i386

以上より、 https://www.ubuntulinux.jp/sources.list.d/trusty.list の内容を sources.list に書いた場合は TestClient は amd64 と i386 アーキテクチャ及びソースコードのパッケージをダウンロードしてインストールする可能性があることがわかりました。

なので、TestClient のためのミラーサーバー RepoMirror では amd64 と i386 用及びソースコードのリポジトリを本家 archive.ubuntulinux.jp からミラーする必要があります。

余談ですが、sources.list で

deb [arch=armel,armhf] http://ports.ubuntu.com/ubuntu-ports quantal main universe

という感じでアーキテクチャを指定すると dpkg で得られるアーキテクチャを無視して armel, armhf 用のパッケージをインストールすることになるようです。 (指定したリポジトリに armel, armhf 用のパッケージが用意されていない場合には apt-get update が失敗するはずです。)


RepoMirror 構築

必要なパッケージインストール

$ sudo apt-get install apt-mirror
$ sudo apt-get install nginx

上の「ClientHost 側の確認」により、RepoMirror では以下のリポジトリを本家からミラーする必要があることがわかります。

Architecture Uri Suite Components
amd64 http://archive.ubuntulinux.jp/ubuntu trusty main
i386 http://archive.ubuntulinux.jp/ubuntu trusty main
src http://archive.ubuntulinux.jp/ubuntu trusty main
amd64 http://archive.ubuntulinux.jp/ubuntu-ja-non-free trusty multiverse
i386 http://archive.ubuntulinux.jp/ubuntu-ja-non-free trusty multiverse
src http://archive.ubuntulinux.jp/ubuntu-ja-non-free trusty multiverse
/etc/apt/mirror.list は以下のようになりました。
$ cat /etc/apt/mirror.list
############# config ##################
#
# set base_path    /var/spool/apt-mirror
#
# set mirror_path  $base_path/mirror
# set skel_path    $base_path/skel
# set var_path     $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch  <running host architecture>
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set nthreads     20
set _tilde 0
#
############# end config ##############

deb-amd64 http://archive.ubuntulinux.jp/ubuntu             trusty main
deb-i386  http://archive.ubuntulinux.jp/ubuntu             trusty main
deb-src   http://archive.ubuntulinux.jp/ubuntu             trusty main
deb-amd64 http://archive.ubuntulinux.jp/ubuntu-ja-non-free trusty multiverse
deb-i386  http://archive.ubuntulinux.jp/ubuntu-ja-non-free trusty multiverse
deb-src   http://archive.ubuntulinux.jp/ubuntu-ja-non-free trusty multiverse

clean     http://archive.ubuntulinux.jp/ubuntu
clean     http://archive.ubuntulinux.jp/ubuntu-ja-non-free

このファイルには本家 Ubuntu のリポジトリ (http://archive.ubuntu.com/ubuntu) がすでに載っていましたが、今回これらはミラーしないのでバッサリ削除して Ubuntu 14.04 日本語パッケージリポジトリに関するものを載せています。

最後の二行の「 clean ... 」はこれを付けないとミラー同期する度に不要となるファイルが削除されず、ディスク使用量が不必要にどんどん増えていってしまうようです。

mirror.list の内容に従いミラー同期

$ sudo apt-mirror

同期が完了すると /var/spool/apt-mirror/mirror/ 配下に同期されたファイルが保存されています。

$ ls -la /var/spool/apt-mirror/mirror/
total 12
drwxr-xr-x 3 apt-mirror apt-mirror 4096 Nov 11 12:23 .
drwxr-xr-x 5 apt-mirror apt-mirror 4096 Oct 28 19:11 ..
drwxr-xr-x 4 root       root       4096 Nov 11 12:23 archive.ubuntulinux.jp

このディレクトリ構成はどうやら以下のようになっているようです。

/var/spool/apt-mirror/mirror/{Uri}/{Suite}/{Component}/binary-{Architecture}/

インストールする deb パッケージは以下にあるようです。

/var/spool/apt-mirror/mirror/{Uri}/pool/{Component}/

ミラーしたリポジトリは nginx を使って HTTP で公開します。

今回はミラーしたリポジトリの公開専用として nginx 使うので、 /etc/nginx/sites-available/default を書き換えることにします。

$ pwd
/etc/nginx/sites-available

$ diff -u default.org default
--- default.org 2014-03-05 07:25:36.000000000 +0900
+++ default     2014-10-30 12:50:07.525282000 +0900
@@ -21,8 +21,7 @@
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

-       root /usr/share/nginx/html;
-       index index.html index.htm;
+       root /var/spool/apt-mirror/mirror;

        # Make site accessible from http://localhost/
        server_name localhost;
@@ -33,6 +32,9 @@
                try_files $uri $uri/ =404;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
+
+               autoindex on;
+               autoindex_exact_size off;
        }

        # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests

nginx を再起動

$ sudo service nginx restart

ブラウザから http://XXX.XXX.XXX.XXX/ で公開してる内容を確認できます。 (XXX.XXX.XXX.XXX はミラーサーバーの IP アドレスです。)

オリジナルのリポジトリは随時更新されるので、 RepoMirror で cron とかで定期的に sudo apt-mirror を実行するのが良いようです。 (今回はこれ実施してません。)


ClientHost の設定

/etc/apt/sources.list.d/ubuntu-ja.list 設置

$ cat /etc/apt/sources.list.d/ubuntu-ja.list
deb     http://[RepoMirror の IP]/archive.ubuntulinux.jp/ubuntu             trusty main
deb-src http://[RepoMirror の IP]/archive.ubuntulinux.jp/ubuntu             trusty main

deb     http://[RepoMirror の IP]/archive.ubuntulinux.jp/ubuntu-ja-non-free trusty multiverse
deb-src http://[RepoMirror の IP]/archive.ubuntulinux.jp/ubuntu-ja-non-free trusty multiverse
Ubuntu Japanese Team の GPG キーをインポート
$ wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
$ wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg     -O- | sudo apt-key add -

RepoMirror にでミラーしたパッケージの正当性を確認するために必要なようです。

パッケージのインデックスをアップデート

$ sudo apt-get update

以上により、ClientHost は RepoMirror のミラーされたリポジトリを使うようになりました。

試しに RepoMirror からパッケージをインストールしてみます。

$ sudo apt-get install ubuntu-defaults-ja


0 件のコメント:

コメントを投稿