連載
» 2002年07月13日 00時00分 UPDATE

Apache 2.0でWebDAV(後編):Subversionによるバージョン管理 (2/3)

[宮本久仁男,NTTデータ]

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に保存の様子を示します。

画面1 「libdb-3.3.so」という文字列が見える 画面1 「libdb-3.3.so」という文字列が見える
画面2 修正したファイルを保存 画面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を参照したりとまちまちなのが分かります。

リスト ldd libsvn_*の結果

 解決方法として理想的なのは、どちらの場合においても新しい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© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。