SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

Subversionサーバー移転の例

問題

SVNサーバーの移転をしたいです。

サーバーをリプレイスして、データは引き継ぎたいです。

答え

例です。

sshd

svn+ssh:// する場合は、sshdが起動していること。

Subversion 1.8 インストール

# vi /etc/yum.repos.d/subversion.repo

[subversion]
name=subversion
baseurl=http://opensource.wandisco.com/centos/6/svn-1.8/RPMS/
enabled=1
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco

# yum install subversion

svnユーザー作成

# adduser svn

svnユーザー、svnグループできてよし。

ホームディレクトリできてよし。そこにリポジトリ作成予定。

鍵認証のみで使用する予定。

このユーザーには直接パスワードは設定しないでおく。

リポジトリ 作成

# su - svn
$ mkdir -p /home/svn/repo
$ svnadmin create /home/svn/repo

リポジトリ 移転元でダンプ

# svnadmin dump /home/svn/repo > dumpfile

リポジトリ 移転先でリストア

$ svnadmin load /home/svn/repo < dumpfile

リポジトリ 移転先を移転元と同期

どのような流れで切り替えるかが問題で、移転先を作ったものの切り替え前に移転元にコミットが発生したりすると調整が必要。

差分のダンプを取得して投入してもよい。

svnsync で同期ができるようにしておく。

$ vi /home/svn/repo/hooks/pre-revprop-change

#!/bin/sh
exit 0

$ chmod u+x /home/svn/repo/hooks/pre-revprop-change

※切り替えが完了したら、実行できなくしてよい。

初期設定

$ svnsync init file:///home/svn/repo 移転元リポジトリのURL

同期実行

$ svnsync sync file:///home/svn/repo

鍵作成

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
(ホームディレクトリは755以下で)

開発者各個人ごとに鍵を作る。

$ ssh-keygen -t rsa -N ” -f staff_aaa
$ ssh-keygen -t rsa -N ” -f staff_bbb
$ ssh-keygen -t rsa …

くっつけるだけででも使える。

$ cat *.pub >> authorized_keys
$ chmod 600 authorized_keys

鍵が漏れてもsvn操作しかできないようにしておくには、authorized_keys の各行の先頭に以下を追記する。

command="svnserve -t --tunnel-user=(svnのユーザー名)",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty

tunnel-userを一応付けはしたが、Eclipse経由だとあまり意味はない(ユーザー名を強制できない)。

Linuxのsvnコマンドではユーザー名が指定される(たぶんクライアントが明示しないときに)。

鍵を配布

各開発者に鍵を渡して、リポジトリに接続するときに使ってもらう。

どうしてもパスワード認証したい

場合によって、鍵を持っていけない場所などあれば、ユーザーを作ってパスワードを設定すると、パスワード認証できる。

# useradd -o svn2 -u svnユーザーと同じ -g svnユーザーと同じ
# passwd svn2

リポジトリが壊れているとき1

リポジトリが壊れていると、移転元で svnadmin dump ができない。データの入ったディレクトリをコピーしてしまえば壊れたまま移転は可能な様子。ディレクトリを移転先にコピーして再開するのも一つの手。

コピーをするときは、誰もアクセスしていないときに限れば、cp や rsync をしてもよさそうだが、コピー用のコマンドもあって、svnadmin hotcopy を使ってコピーするのがよい。エラーがあってもコピーできてしまうので、無理やり移転するときには使えそう。

リポジトリが壊れているとき2

移転先を作って svnadmin create /home/svn/hoge
設定して svnsync init file:///home/svn/hoge 移転元URL
同期して svnsync sync file:///home/svn/hoge

移転元が壊れていると、時々エラーが発生する。

svndiff データの解凍に失敗しました

わざと何かコミットしてリビジョンを進めると、エラーのあるリビジョンの同期をスキップできる。

リビジョン進めて、同期再開を繰り返す svnsync sync file:///home/svn/hoge

これで壊れていないリポジトリは作れるが、スキップしたコミットの分だけ内容が欠損した状態となる。

関連するメモ

コメント