你已经看到资料库可以用许多不同的方式来访问。但让你的资料库同时被多种方式访问可以吗,或安全么?答案是肯定的,开发者颇有远见的提供了这个功能。
在某个时间,下面这些进程可能需要读并且写你的资料库:
常规的系统用户使用Subversion客户端(作为他们自己)来直接通过file:///URL访问资料库。
常规的系统用户连接到一个SSH孵化的私有svnserve进程(作为他们自己运行)来访问资料库。
svnserve进程——作为守护进程或被inetd启动——以一个固定的用户运行;
Apache httpd,以一个特定的固定用户运行。
管理员最常遇到的问题是资料库所有权和访问权限。上面列出的各个进程(或用户)有读写Berkeley DB文件的权限吗?假设你有一个类Unix的操作系统,直接的办法可能是把所有可能使用资料库的用户加到一个新的svn组中,并使资料库完全被这个组所有。但是即使这样也不够,因为进程可能会用一个不友好的umask——它阻止别的用户的访问——来写数据库文件。
因此为资料库用户设置了公共组的下一步是强制每个资料库访问进程使用合理的umask。对那些直接访问资料库的用户,你可以把svn程序用一个脚本文件包装起来,其中在运行实际的svn客户程序前先设置umask 002。你可以为svnserve写相似的包装脚本,并在Apache本身的启动脚本apachectl里加上umask
002命令。例如:
$ cat /usr/local/bin/svn #!/bin/sh umask 002 /usr/local/subversion/bin/svn "$@"
另一个普遍的问题常常在Unix类系统上遇到。当资料库在使用时,BerkeleyDB有时会创建新的日志文件来记录动作。即使资料库被svn组完全拥有,但是这些新创建不一定会被相同的组所有,它们给你的用户造成了更多的权限问题。一个很好的解决方法是在资料库的db上设置组SUID。这样使得所有新创建的日志文件和它的父目录有相同的组所有者。
只要你跳过了这些障碍,你的资料库应该可以被所有需要的进程访问了。看起来有点乱和复杂,但是多用户共享公共文件的写访问的问题是经典难题,通常无法优雅的解决。
幸运的是,大部分资料库管理员永远不需要这么复杂的配置。访问位于相同机器上的用户不限于只用file://访问URL——他们通常可以通过在他们的http:// 或 svn://URL中使用localhost作为服务器名来连接Apache HTTP服务器。并且为你的Subversion资料库维护多个服务器进程可能带来的麻烦远大于必要性,我们推荐你选择最能满足你需求的服务器然后一直使用它!