svnserveデーモンを起動させるための設定方法。 ここではローカルネットワーク内からのアクセスのみを許可する条件で設定を行う。

svnserveの設定

まずはsvnserveを動作させるためのユーザ(ここではsvnとする)を作成する。

useradd svn

続いてリポジトリを格納するルートディレクトリ(ここでは/srv/repos)を作成する。 svnserveが書き込めるようにオーナをsvnにしておく。

mkdir /srv/repos
chown -R svn:svn *

/etc/servicesにsvnのサービス名と使用ポート番号が記述されていることを確認する(もしなければ追記する)。

/etc/services
svn   3690/tcp  subversion  # Subversion protocol
svn   3690/udp  subversion

/etc/hosts.allowに下記の内容を追記し、内部ネットワークからの接続のみを許可する。

/etc/hosts.allow
svnserve : 192.168.0. 127.0.0.1

また、iptablesなどを使ってファイヤーウォールの設定がされている場合は、3690番のポートを忘れずに空けておくこと。

続いて、inetdもしくはxinetdでsvnserveを起動するための設定を行う。

xinetd経由でsvnserveを起動する場合

xinetdの設定をするために、/etc/xinetd.d配下にsvnというファイルを作成し、下記の内容を書き込む。

/etc/xinetd.d/svn
service svn
{
        disable         = no
        socket_type     = stream
        wait            = no
        user            = svn
        server          = /usr/bin/svnserve 
        server_args     = -i -r /srv/repos
        log_on_failure  += USERID
        only_from       = 192.168.0.0/24 127.0.0.1
}

設定項目の意味は次の通り。

user
svnserveを実行するユーザ。
server
svnserveへのフルパス。
server_args
svnserveに渡す引数。 「-r /srv/repos」でリポジトリのルートディレクトリを/srv/reposに設定している。
log_on_failure
接続に失敗した場合、ユーザ名をログに記録する。

続いて、chkconfigコマンドを使ってsvnserveを起動できるようにする。

# svnserveを起動するようにする
chkconfig --add svnserve 

# 設定が反映されているか確認する
chkconfig --list svnserve

上記のコマンドを打ったあと、次のように表示されればOK。

svnserve:       on

起動設定が整ったところで、xinetdを再起動する。

service xinetd restart

telnetでsvnserveに接続して、次のようなメッセージが表示されればsvnserveが正常に動作していることが確認できる。

$ telnet localhost svn
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
( success ( 1 2 ( ANONYMOUS ) ( edit-pipeline svndiff1 absent-entries ) ) )
Connection closed by foreign host.

inetd経由でsvnserveを起動する場合

/etc/inetd.confにsvnserveの起動パラメータを追記する。 xinetdの場合と同様、「-r /srv/repos」でリポジトリのルートディレクトリを/srv/reposに設定している。

/etc/inetd.conf
svn stream tcp nowait svn /usr/sbin/tcpd /usr/bin/svnserve -i -r /srv/repos

起動設定が整ったところで、inetdを再起動する。

/etc/init.d/openbsd-inetd restart

telnetでsvnserveに接続して、次のようなメッセージが表示されればsvnserveが正常に動作していることが確認できる。

$ telnet localhost svn
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
( success ( 1 2 ( ANONYMOUS ) ( edit-pipeline svndiff1 absent-entries ) ) )
Connection closed by foreign host.

リポジトリの作成・設定

まずはリポジトリを作る。 ここではsandboxというリポジトリを/srv/reposに作成する。

# svnになる
su svn
# svnadmin createでリポジトリを作成
svnadmin create /srv/repos/sandbox

続いて、リポジトリのアクセス設定を行う。 リポジトリを作成すると自動的にconfディレクトリが作成される。 その中に次の三つのファイルが作成される。

svnserve.conf
svnserve経由でのリポジトリへのアクセス制限。 ユーザ設定ファイル・アクセス設定ファイルの指定など。
passwd
ユーザとパスワードの指定。
authz
ユーザごとのアクセス設定。

まずはsvnserve.confの設定例。

svnserve.conf
[general]
anon-access = none          # Anonymous(匿名)ユーザのアクセスを許可しない
auth-access = write         # 認証済みユーザには書き込み権限を与える
password-db = passwd        # パスワードファイルをpasswdとする
realm = sandbox             # リポジトリの説明(適当でOK)

anon-access、auth-accessに設定できる値は次の三つ。

none
アクセスを許可しない
read
読み込み権限を与える
write
読み込み、書き込みの両方の権限を与える

続いてpasswdの設定例。 リポジトリにアクセスするユーザの数だけ「ユーザ名=パスワード」の形式で記述する。

passwd
[users]
smdn=password

authzについては省略。 passwdファイルの編集が終わったら、アクセス権限をsvnだけに設定して、他のユーザからアクセスできないようにする。

cd /srv/repos/sandbox/conf
chmod 600 passwd
chown svn:svn passwd

ここまでで設定は完了。 作成したリポジトリをチェックアウトできるようになる。

$ svn co svn://localhost/sandbox/ ./sandbox
認証領域: <svn://localhost:3690> sandbox
'smdn' のパスワード: (passwdで指定したパスワードを入力)
リビジョン 0 をチェックアウトしました。

$ svn info ./sandbox
パス: sandbox
URL: svn://localhost/sandbox
リポジトリのルート: svn://localhost/sandbox
リポジトリ UUID: a3c65e7f-1127-41a2-baf2-0f721aaea87c
リビジョン: 0
ノード種別: ディレクトリ
準備中の処理: 特になし
最終変更リビジョン: 0
最終変更日時: 2009-11-21 05:08:44 +0900 (土, 21 11月 2009)