3月 252013
 

いやー。cvsup.icmpv6.org というサーバを立てていたのですが csup がいよいよ利用できなくなりましたね。 cvsupd から持ってきたソースコード、例えば ports を portmaster -D -a とかすると「もう使えないぜ。ベイビー。」とか怒られる。

それならば、と、いうことで ports などは snv で取ってくることにしましょう。基本的には以下のコマンドで svn で FreeBSD の ports ツリーを取ってくることができます。

# svn co https://svn0.us-west.FreeBSD.org/ports/head /usr/ports
# cd /usr/ports && svn update

 
FreeBSD のソースコードを取ってくるには svn というのが必要で、それはつまりは ports 的にいうと devel/subversion が必要になるのでこいつをインストールしてあげる必要があります。後で出てきますが、svn サーバを必要としない、クライアントのみで利用するのであれば devel/subversion-static のほうが、余計なのがインストールされないので良いかもしれません。

上記コマンドを実行するときには一旦 /usr/ports/ の中を綺麗にしたほうが良いかもしれんですね。 ports/distfiles/ の中に色々とゴミが残るのでどこかに一時的に移動するか、サッパリと \rm -r /usr/ports してしまったほうが良いかな? 個人的に自由にしてください;-)。

さてさて。svn コマンドを実行したときに、海外のサーバを見に行くことになるのですが、ちょっと遅いかもしれないし大変ですよねぇ。今まで cvsupd なサーバを自分で構築していたので svn なサーバも自分で構築してみましょう。 FreeBSD のための Subversion のミラーサイト (FreeBSD.org subversion mirror) を構築してみます。それが今回のお題目です。

まずは ports から devel/subversion をインストールします。こちらを make すると make config で色々聞いてきます。 devel/subversion-static のほうは特に何も聞いてきません。 FreeBSD の svn サーバを構築する場合には以下のオプションを [X] にして make install しましょう。

[X] MOD_DAV_SVN        mod_dav_svn module for Apache 2.X
[X] MOD_DONTDOTHAT     mod_dontdothat for Apache 2.X

 
すると apache22 までインストールしてくれます。うひっ。 php とか、この手の apache 絡みのヤツを ports からインストールすると強制的に apache までインストールされてしまうのは、ちょっとどーかと思う。僕は apache は自分で make する派なのでねぇ。 mod_* だけインストールしてくれれば嬉しいなぁ。

と、いうことで apache まで起動できる状態になったので svn サーバ (仮に svnweb と言います)を作成していきましょう。

まずは FreeBSD のソースコードや ports 一式を先に取ってきます。

# mkdir /home/svnweb
# cd /home/svnweb
# ftp -a ftp://ftp5.jp.freebsd.org/pub/FreeBSD/development/subversion/svnmirror-base-r238500.tar.xz
# ftp -a ftp://ftp5.jp.freebsd.org/pub/FreeBSD/development/subversion/svnmirror-ports-r301235.tar.xz
# tar xvzfp svnmirror-base-r238500.tar.xz
# tar xvzfp svnmirror-ports-r301235.tar.xz
# svnsync sync file:////home/svnweb/base
# svnsync sync file:////home/svnweb/ports

 
base のほうは FreeBSD のソースコードです。 ports は ports ですね。 r238500 とか r301235 ってのはレビジョンのようです。以下の URL が参考になるかと思います。

http://svnweb.freebsd.org/base/

ftp で取ってきたやつでさえも古いので更に sync して最新のものに揃えます。それが上記コマンドの下の二行です。 snvsync するとどこから取ってくるんでしょうなぁ? 後でキャプチャしてみよう(キャプチャした結果 svn.FreeBSD.org からでした;-)。

と、いうことで最新のソースがこれで準備できたと思います。あ。定期的に svnsync するには以下のスクリプトを書いて cron に登録すれば良いでしょうね。

#!/bin/sh
/usr/local/bin/svnsync sync file:////home/svnweb/base
/usr/local/bin/svnsync sync file:////home/svnweb/ports

 
ちなみに、base と ports だけで 20GByte くらいのディスク容量が必要になります。HDD の容量に気をつけてください。

さささ。続いてサーバのほうを設定していきましょう。基本的には httpd が動作していて port:80 にアクセスします。 SSL に対応しているのであれば https:// でアクセスできます。

まずは httpd.conf ですが、 devel/subversion をインストールしたのであれば特に何もせずとも動作します。うひっ。 ports/subversion インストール時に上に書いた二つのオプションを有効にしたのであれば、多分 httpd.conf に以下の設定が既に追加されているはず。

LoadModule dav_svn_module   libexec/apache22/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so

 
ほー。svn のサーバって dav で動作するんだねぇ。するっていと多分 extra/httpd-dav.conf にも設定必要だね。って思うんですが、果たしてそのとおりで、 extra/httpd-dav.conf の中身を全部消して、以下の行を追加して上げます。

<Location />
    DAV svn
    SVNParentPath       /home/svnweb
    Order deny,allow
    <LimitExcept GET PROPFIND OPTIONS REPORT>
        Deny from all
    </LimitExcept>
</Location>

 
あとは httpd を起動すれば動作すると思います。あ。Include etc/apache22/extra/httpd-dav.conf の行は当然コメントアウトをはずす必要があります。

ウェブブラウザでアクセスすると http://svnweb.icmpv6.org/base/ こんな感じで見えるようになります;-)。

では実際に正しく動作するか確認してみましょう。手元にある FreeBSD から以下のコマンドを実行してみます。

# svn co http://svnweb.icmpv6.org/ports/head /usr/ports

 
既に一回、他の svnweb から /usr/ports に持ってきてしまうと svn のエラーコード E155000 で怒られます。その場合には違うディレクトリに co するか、 /usr/ports/.svn/ というディレクトリが svn の接続先情報を管理しているようなのでこのディレクトリを mv すれば良いかもしれません。

さてさて。 apache の設定に戻りますが、svnweb のためだけに httpd を起動する人は皆無だと思うので、多分 httpd-vhosts.conf で VirtualHost の設定をしているかと思います。 DAV svn の設定も簡単で VirtualHost ディレクティブの中に httpd-dav.conf で書いた設定をそのまま書いてあげると良いです。その場合は Include httpd-dav.conf の設定は必要なくなります。

と、いうことで 簡単な svn の使い方と svnweb の立て方をサラっと書いてみました。皆さんもどんどん日本に FreeBSD 用の svn のサーバを起動してみてください;-)。 ちなみにですが、以下を一応用意しました。それぞれのサーバに base/ と ports/ があります。

http://svnweb.icmpv6.org/ (IPv4/IPv6)
https://svnwebv4.icmpv6.org/ (IPv4)

いつも動作している保証はありません;-)。

  2 件のコメント to “SVN サーバを構築して FreeBSD のソースをミラーする。”

  1. なんか、IPv4 でアクセスした場合は svn クライアントがエラーになって止まる傾向があるようです。

    クライアント側、それはつまりは svn co や svn update する側の FreeBSD ですが、多分ファイアーウォールの内側にあると正しく WebDAV で接続できないようです。

    サーバから切断された旨のメッセージが表示されます。そしてその時に http サーバでは以下のログが出力されます。


    Unable to deliver content. [500, #0]
    Could not write EOS to filter. [500, #175002]
    Provider encountered an error while streaming a REPORT response. [500, #0]
    A failure occurred while driving the update report editor [500, #53]

    svn update するクライアント側は以下のメッセージが表示されます。WITH_NLS=YES なので日本語ですが、エラーコードは万国共通でしょう。


    svn: E000054: Error retrieving REPORT: 接続が通信相手によってリセットされました

    例えば僕の場合は svnweb.icmpv6.org の場合はデュアルスタクなのですが、IPv6 でアクセスすると正常終了し IPv4 でアクセスするとエラーになります。同じクライアントで svn0.us-west.FreeBSD.org の svnweb にアクセスしても同じ終了コードです。

    パケットをキャプチャしてないのですが、何かしら(多分ファイアウォール? が)悪さしているのではないか?と思えるんですね。

    なので IPv4 側のサーバは SSL にしてみました。僕の環境では svnwebv4.icmpv6.org は https にしたら無事に svn update が動作するようになりました。

    当分はこれで行ってみたいと思います。多分、エラーとなる原因はクライアント側にあるように思えます。

    あ。外していたらごめんなさいf(^^;;。

  2. […] 以前のエントリで「SVN サーバを構築して FreeBSD のソースをミラーする。」と、いうのを書いたのですが、これはプロトコル的には http:// にしか対応していないんですね。svn co には http: […]

 コメントを書いてください。

HTML タグが利用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">

(必須項目)

(必須項目)

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)