Subversionによるバージョン管理:Apache 2.0でWebDAV(後編)(2/3 ページ)
DeltaVと呼ばれていたバージョニング拡張がRFCとしてリリースされたことにより、WebDAVのバージョン管理機能もようやく足元か固まった。以前紹介したSubversionをApache 2.0+WebDAV環境に導入してみよう。
Subversionのコンパイル&インストール
下準備ができたところで、Subversionのインストールに取り掛かりましょう。
Subversionのアーカイブ入手と展開
まず、Subversionのtarボールを入手、展開します。tarボールは、File Sharingメニューの1つ(http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=74)から入手可能です。今回は、原稿執筆時点での最新版であるsubversion-r2291.tar.gzを使用しました(注)。
注:Subversionで管理されているリポジトリからスナップショットを取得する手もありますが、ここではtarボールで配布されているものを紹介します。
$ gzip -dc subversion-r2291.tar.gz | tar xvf -
configureとmake
tarボールを展開したら、生成されたディレクトリに移動してconfigureとmakeを実行します。
$ cd subversion-r2291 $ configure --with-apxs=/usr/local/apache2/bin/apxs \ --with-apr=/home/wakatono/httpd-2.0.39/srclib/apr \ --with-apr-util=/home/wakatono/httpd-2.0.39/srclib/apr-util \ --with-berkeley-db=/usr/local/BerkeleyDB.4.0 $ make
--with-aprと--with-apr-utilで指定するaprおよびapr-utilのディレクトリについては、コンパイルしたApache 2.0のビルドツリー配下にあるものを指定します。--with-berkeley-dbは、DBライブラリをインストールしたディレクトリを指定します。
なお、Berkeley DBの検出がうまくいかないなどでconfigureが失敗することがありますが、これについてはトラブルシューティングとして後述します。
Subversionのインストール
makeが終わったら、rootになってインストールを行います。
$ su root # rm -f /usr/local/lib/libsvn* # make install
この時点で、httpd.confにSubversion用のモジュールを組み込む設定が追加されます。
2行目のrmコマンドは、「古いライブラリを明示的に消去するように」というドキュメントの記述に従っています(注)。
注:Subversionを初めてインストールする場合などは必要ありません。筆者は、何十回となくインストールを繰り返したので、この作業を実施するのが染み付いています。
なお、mod_encodingのコンパイルで発生したようなlibtool関係の問題については、Subversionが自前でlibtoolを生成するため、発生しません。
リポジトリのエントリ追加と作成
次世代プロトコルWebDAVの可能性で説明した方法と何ら変わるところはありません。また、以下の(1)と(2)は順序を逆にして実行しても問題ありません。
(1) リポジトリのエントリ追加
httpd.confの中に、以下のようにしてリポジトリのLocationとSubversionの使用、そして実際のPATHを指定します。
<Location /svn/repos> ←ロケーションの指定 DAV svn ←Subversionを使用 SVNPath /home/svn/repos ←実際のリポジトリを格納するディレクトリ </Location>
(2) リポジトリの作成
SVNPathで指定した/home/svn/reposの配下にSVNリポジトリを作成します。/home/svnをあらかじめ作成しておく必要があります。
リポジトリの作成には、svnadminコマンドを使用します。
$ svnadmin create /home/svn/repos $ su root # chown -R nobody:nobody /home/svn
最後にnobodyにchownしているのは、httpdの権限で実際にリポジトリを読み書きできるようにするためです。
ここまでで作成されたリポジトリの様子を以下に示します。
$ ls -lR /home/svn/repos/ /home/svn/repos/: 合計 24 -rw-r--r-- 1 nobody nobody 376 6月 24 17:14 README drwxr-xr-x 2 nobody nobody 4096 6月 24 17:14 conf drwxr-xr-x 2 nobody nobody 4096 6月 24 17:14 dav drwxr-xr-x 2 nobody nobody 4096 6月 24 17:14 db drwxr-xr-x 2 nobody nobody 4096 6月 24 17:14 hooks drwxr-xr-x 2 nobody nobody 4096 6月 24 17:14 locks /home/svn/repos/conf: 合計 0 /home/svn/repos/dav: 合計 0 /home/svn/repos/db: 合計 720 -rw-r--r-- 1 nobody nobody 328 6月 24 17:14 DB_CONFIG -rw-r--r-- 1 nobody nobody 8192 6月 24 17:14 __db.001 -rw-r--r-- 1 nobody nobody 270336 6月 24 17:14 __db.002 -rw-r--r-- 1 nobody nobody 327680 6月 24 17:14 __db.003 -rw-r--r-- 1 nobody nobody 712704 6月 24 17:14 __db.004 -rw-r--r-- 1 nobody nobody 16384 6月 24 17:14 __db.005 -rw-r--r-- 1 nobody nobody 8192 6月 25 02:38 copies -rw-r--r-- 1 nobody nobody 62115 6月 25 02:38 log.0000000001 -rw-r--r-- 1 nobody nobody 8192 6月 25 02:38 nodes -rw-r--r-- 1 nobody nobody 8192 6月 25 02:38 representations -rw-r--r-- 1 nobody nobody 8192 6月 25 02:38 revisions -rw-r--r-- 1 nobody nobody 8192 6月 25 02:38 strings -rw-r--r-- 1 nobody nobody 8192 6月 25 02:38 transactions /home/svn/repos/hooks: 合計 20 -rw-r--r-- 1 nobody nobody 1302 6月 24 17:14 post-commit.tmpl -rw-r--r-- 1 nobody nobody 1366 6月 24 17:14 pre-commit.tmpl -rw-r--r-- 1 nobody nobody 99 6月 24 17:14 read-sentinels.tmpl -rw-r--r-- 1 nobody nobody 1322 6月 24 17:14 start-commit.tmpl -rw-r--r-- 1 nobody nobody 101 6月 24 17:14 write-sentinels.tmpl /home/svn/repos/locks: 合計 4 -rw-r--r-- 1 nobody nobody 460 6月 24 17:14 db.lock
httpdの起動と試験
ここまでの設定で、Subversionが使用できるようになるはずです。Apache 2.0を起動してみましょう。
# /usr/local/apache/bin/apachectl start
ちゃんと動いているかどうかのチェックは、OPTIONSメソッドを「(1)リポジトリのエントリ追加」で指定したLocationに対して発行することで行えます。以下にチェックの例を示します。
$ telnet localhost 80 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. OPTIONS /svn/repos/ HTTP/1.0 HTTP/1.1 200 OK Date: Mon, 24 Jun 2002 17:38:34 GMT Server: Apache/2.0.39 (Unix) DAV/2 SVN/0.13.1 (r2291) DAV: 1 DAV: version-control,checkout,working-resource DAV: merge,baseline,activity,version-controlled-collection DAV: <http://apache.org/dav/propset/fs/1> MS-Author-Via: DAV Allow: OPTIONS,GET,HEAD,POST,DELETE,TRACE,PROPFIND,PROPPATCH,COPY, MOVE,CHECKOUT Content-Length: 0 Connection: close Content-Type: text/plain; charset=ISO-8859-1 Connection closed by foreign host.
おおよそこんな感じのメッセージが出てくれば、インストールは成功しています。ただし、許可されているメソッドについては、一部出力されないものもあります。
Subversionのインストールトラブルシューティング
今回の記事を書くに当たっての検証では、いくつか大きなトラブルが出ています。ドキュメントを読んだだけではまったく分からないものもいくつかあります。ここでは、そういったトラブルとその対策についていくつか述べてみます。
(1) コンパイル、インストールできない
Subversionは、Apache 2.0で導入されたAPR(Apache Portable Runtime)ライブラリを利用します。ところが、正式リリースされた後もAPRのAPIがFIXされず、コンパイルできないなどということが発生することがあります。
この事象をクリアするには、APRをApache 2.0で利用されているものに差し替えるのが一番の早道です。Subversionのtarボールは、APRライブラリも同梱された形で作成されていますが、Apache 2.0のどのバージョンを使ってビルド&機能チェックしているのかが不明なため、上記のような事象が発生した場合はAPRライブラリのAPIなどの不整合を疑ってみてください。
インストール時に、--with-aprおよび--with-apr-utilを明示的に指定しているのは、このトラブルを避けるためです。こうすると、tarボールに同梱されているAPRおよびARP-UTILは使われません。
(2) コンパイル、インストールはできたが、OPTIONSメソッドによるチェックが成功しない
一番ありがちなのは、こちらの事象でしょう。以下に、実際に発生した例を示しますが、ここでは「データベースのバージョンが不正である」というエラーが出ています。
# telnet localhost 80 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. OPTIONS /svn/repos/ HTTP/1.1 Host: bishop.todo.gr.jp HTTP/1.1 500 Internal Server Error Date: Fri, 21 Jun 2002 05:57:17 GMT Server: Apache/2.0.39 (Unix) DAV/2 SVN/0.13.1 (r2291) Content-Length: 223 Connection: close Content-Type: text/xml; charset="utf-8" <?xml version="1.0" encoding="utf-8"?> <D:error xmlns:D="DAV:" xmlns:m="http://apache.org/dav/xmlns" xmlns:C="svn:"> <C:error/> <m:human-readable errcode="21053"> bad database version: 3.3.11 </m:human-readable> </D:error> Connection closed by foreign host.
libsvn_fs-1.soというライブラリにおいて、DBライブラリのバージョンチェックを実施しているのですが、このトラブルはそのバージョンチェックで返却されたバージョン値が「期待されているものよりも古い」ことに起因しています。これは、動いているApache 2.0で有効なDBライブラリのバージョンが古いことにほかなりません。このような事象が発生する原因は、以下の2つが考えられます。
- httpdが参照しているDBライブラリが古い
- libsvn_*で参照しているDBライブラリがまちまち
それぞれの場合における解決方法の例を以下で説明します。
httpdが参照しているDBライブラリが古い
こちらの問題が発現していると、libsvnにおいていくら新しいDBライブラリを参照するようにしていても、決してSubversionが動作することはありません。
問題が発生している場合に、httpdについてlddを実行した結果を示します。
$ ldd httpd libgdbm.so.2 => /usr/lib/libgdbm.so.2 (0x4002b000) libdb-3.3.so => /lib/libdb-3.3.so (0x40032000) libexpat.so.0 => /usr/lib/libexpat.so.0 (0x400c1000) libm.so.6 => /lib/i686/libm.so.6 (0x400e0000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x40102000) libnsl.so.1 => /lib/libnsl.so.1 (0x4012f000) libdl.so.2 => /lib/libdl.so.2 (0x40144000) libpthread.so.0 => /lib/i686/libpthread.so.0 (0x40148000) libc.so.6 => /lib/i686/libc.so.6 (0x42000000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
解決法としては、2つあります。
(1) 本稿に示す手順で、Apache 2.0をインストールし直す
本格的な対処です。このトラブルが解決したのが、Apache 2.0でWebDAVの掲載後だったため、あの記事でApache 2.0をインストールして「Subversionが動かない」という方は、まずインストールされたhttpd実行ファイルについてlddコマンドを実行し、その結果を確認してみてください。
(2) (強引に)新しいDBライブラリを参照するようにする
httpdのバイナリ中で、db-3.3.so(環境によって異なる)と記述されている部分をdb-4.0.soと修正し、新しいDBライブラリを参照するようにします。あまりお勧めできる対処方法ではありませんが、Apache 2.0を再インストールしたくない場合に有効です。ただし、この方法で修正したバイナリを使用して不具合が起きる可能性は否定できないため、あくまで急場しのぎと考えてください。
画面1に、実際にEmacsを用いた編集の様子を(libdb-3.3.soという文字列を探し出したところ)を、画面2に保存の様子を示します。
その結果更新されたバイナリファイルに対してlddコマンドを実行した結果を以下に示します。
$ ldd httpd libgdbm.so.2 => /usr/lib/libgdbm.so.2 (0x4002b000) libdb-4.0.so => /usr/local/BerkeleyDB.4.0/lib/libdb-4.0.so (0x40032000) libexpat.so.0 => /usr/lib/libexpat.so.0 (0x400b7000) libm.so.6 => /lib/i686/libm.so.6 (0x400d6000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x400f8000) libnsl.so.1 => /lib/libnsl.so.1 (0x40125000) libdl.so.2 => /lib/libdl.so.2 (0x4013a000) libpthread.so.0 => /lib/i686/libpthread.so.0 (0x4013e000) libc.so.6 => /lib/i686/libc.so.6 (0x42000000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
場合によっては、httpdから実行権が落ちていることがあるため、lddがそのようなエラーを出力する場合は、
# chmod +x httpd
としてhttpdに実行権を付加した後にlddを再実行してみてください。
libsvn_*で参照しているDBライブラリがまちまち
httpdがDBライブラリを参照していない場合は、こちらの原因でトラブルが発生することがあります。注意しないと、システム標準のDBライブラリを参照しているものとBerkeley DB 4.0を参照しているものが混在したり、古いライブラリを参照したりと、動作不安定の原因にしかなりません。以下に動作不安定なSubversionをインストールした場合のldd libsvn_*の結果を示しますが、libdb-4.0を参照したりlibdb-3.3を参照したりとまちまちなのが分かります。
解決方法として理想的なのは、どちらの場合においても新しいDBライブラリを参照するようにすることです。
- Subversionのコンパイル時に--with-berkeley-db=[Berkeley DB 4.0.14をインストールしたディレクトリ]というオプションを付加する
- Subversionを展開したディレクトリ直下でBerkeley DB 4.0.14のアーカイブを展開し、作成されたディレクトリをdbとリネームする
- libdb-3.3.soを参照しているダイナミックリンクライブラリの内容を修正し、db-4.0.soを参照できるようにする
いずれの場合も、Subversionのconfigure時に以下のような形になることがあります。
SVN_APRUTIL_LIBS = /home/wakatono/cleaninstall/httpd-2.0.39/srclib/apr-util/libaprutil.la -lgdbm -ldb -lexpat SVN_DB_LIBS = -L/usr/local/BerkeleyDB.4.0/lib -ldb
このような場合、SVN_APRUTIL_LIBSにおいてDBライブラリが-ldbとしか指定されていないため、configureの結果作成されたMakefileに対して、
SVN_APRUTIL_LIBS = /home/wakatono/cleaninstall/httpd-2.0.39/srclib/apr-util/libaprutil.la -lgdbm -L/usr/local/BerkeleyDB.4.0/lib -ldb-4.0 -lexpat SVN_DB_LIBS = -L/usr/local/BerkeleyDB.4.0/lib -ldb-4.0
などとして、必ず/usr/local/BerkeleyDB.4.0/lib配下のlibdb-4.0.soを参照するように記述するという手もあります。
Copyright © ITmedia, Inc. All Rights Reserved.