简介
在 Subversion 中包含 Svnserve - 一个轻型的独立服务器,它使用一个基于一般 TCP/IP 连接的定制协议。用于小型安装,或者不能使用全能 Apache 服务器的地方。
In most cases svnserve is easier to setup and runs faster than the Apache based server, although it doesn't have some of the advanced features. And now that SASL support is included it is easy to secure as well.
安装 svnserve
- 可以从这里获取最新版本的 Subversion http://subversion.apache.org/getting.html。另外,也可以从 ColabNet 获取一个打包好的安装程序 http://www.collab.net/downloads/subversion 。这个安装程序将会把 svnserve 设置为 Windows 服务,并且还包含了一些你需要的工具,如果你为了安全而使用 SASL。
- 如果你已经安装了 Subversion,svnserve 已经运行,你需要在继续之前把它停下来。
- 运行 Subversion 安装程序,如果你在你的服务器(推荐)上运行,可以跳过第 4 步。
- 打开资源管理器,进入Subversion的安装目录(通常是
C:\Program Files\Subversion
)的bin
目录,找到文件svnserve.exe
,intl3_svn.dll
,libapr.dll
,libapriconv.dll
,libapriutil.dll
,libdb*.dll
,libeay32.dll
和ssleay32.dll
,复制这些文件,或所有bin
目录内的文件到你的服务器目录,例如c:\svnserve
。
运行 svnserve
现在svnserve已经安装了,你需要在你的server运行它,最简单的方法是在DOS窗口或者windows快捷方式输入:
svnserve.exe --daemon
svnserve将会在端口3690等待请求,--daemon选项告诉svnserve以守护进程方式运行,这样在手动终止之前不会退出。
如果你没有创建一个版本库,根据下面的Apache服务器设置指令“配置”一节。
为了验证svnserve正常工作,使用TortoiseSVN → 版本库浏览器来查看版本库。
假定你的版本库位于c:\repos\TestRepo
,你的服务器叫做localhost
,输入:
svn://localhost/repos/TestRepo
当被版本库浏览器提示输入。
你也可以使用 --root 选项设置根位置来限制访问服务器的目录,从而增加安全性和节约输入 svnserve URL 的时间:
svnserve.exe --daemon --root drive:\path\to\repository\root
以前面的测试为例,svnserve 现在的运行命令为:
svnserve.exe --daemon --root c:\repos
然后在 TortoiseSVN 中我们的版本库浏览器 URL 缩短为:
svn://localhost/TestRepo
注意,当 svnserve 和版本库位于不同分区或盘符时也需要使用 --root 选项。
Svnserve 可以提供任意数量的版本库服务。只要将这些版本库放到你刚才定义的根目录下即可,然后使用相对于根的URL访问它们。
警告
不要创建和访问网络共享上的 Berkeley DB 版本库,它不能存在于一个远程的文件系统,即使是映射到盘符的共享。如果你希望在网络共享使用 Berkeley DB,结果难以预料-你可能会立刻看到奇怪的错误,也有可能几个月之后才发现数据库已经损坏了。
以服务形式运行 svnserve
使用普通用户直接运行 svnserve 通常不是最好的方法。它意味着你的服务器必须有一个用户登录,还要记着重新启动服务器后重新启动 svnserve。最好的方法是将 svnserve 作为 windows 服务运行。从 Subversion 1.4 开始,svnserve 可以安装为 windows 服务。
To install svnserve as a native windows service, execute the following command all on one line to create a service which is automatically started when windows starts.
sc create svnserve binpath= "c:\svnserve\svnserve.exe --service --root c:\repos" displayname= "Subversion" depend= tcpip start= auto
If any of the paths include spaces, you have to use (escaped) quotes around the path, like this:
sc create svnserve binpath= " \"C:\Program Files\Subversion\bin\svnserve.exe\" --service --root c:\repos" displayname= "Subversion" depend= tcpip start= auto
You can also add a description after creating the service. This will show up in the Windows Services Manager.
sc description svnserve "Subversion server (svnserve)"
注意 sc
的命令行很特殊。在 key= value
对中,key 与 =
之间不能有空格,但是在 value 之前,必须有空格。
提示
Microsoft 现在建议服务程序使用本地服务或网络服务帐户运行,参考 The Services and Service Accounts Security Planning Guide。以本地服务帐户创建服务,需要在上面的例子里追加下面几行。
obj= "NT AUTHORITY\LocalService"
请注意需要给本地服务帐户一些目录的适当权限,包括的 Subversion 和你的版本库,还有所有钩子脚本使用的应用。此帐号的内置组名是"LOCAL SERVICE"。
服务安装完毕后,你需要在服务管理器中启动它(仅此一次;当服务器重启后它会自动启动)。
为了得到更详细的信息,可参考 Windows Service Support for Svnserve。
如果你已经使用 SvnService
包装安装了早期的 svnserve,现在想使用内置服务,那么你需要将其从服务中删除(切记先停止服务!)。使用简单的命令
svnservice -remove
即可删除服务。
svnserve 与基本认证
The default svnserve setup provides anonymous read-only access. This means that you can use an svn://
URL to checkout and update, or use the repo-browser in TortoiseSVN to view the repository, but you won't be able to commit any changes.
为了打开对版本库的写访问,你可以编辑版本库目录的conf/svnserve.conf
文件,这个文件控制了svnserve守护进程的配置,也提供了有用的文档。
为了打开匿名的写访问,只需要简单得设置:
[general] anon-access = write
然而,你不会知道谁修改了版本库,因为svn:author
属性是空的,你也不能控制谁来修改版本库,这是一个很危险的设置。
解决这个问题的一个方法是创建密码数据库:
[general] anon-access = none auth-access = write password-db = userfile
这里的 userfile
与 svnserve.conf
文件在同一个目录,这个文件也可以存在于文件系统的其他地方(当多个版本库使用相同的访问权限时尤其有用),可以使用绝对路径,或者是 conf
的相对目录,使用 \ 或盘符不能工作。userfile
的结构如下:
[general] anon-access = none auth-access = write password-db = userfile
这个例子拒绝所有的未认证用户(匿名)访问,给 userfile
中的用户读写权限。
提示
If you maintain multiple repositories using the same password database, the use of an authentication realm will make life easier for users, as TortoiseSVN can cache your credentials so that you only have to enter them once. More information can be found in the Subversion book, specifically in the sections Create a 'users' file and realm and Client Credentials Caching
使用 SASL 以便更安全
什么是 SASL?
Cyrus 简单的认证和安全层(The Cyrus Simple Authentication and Security Layer)是一个由卡耐基梅隆大学编写的开源软件。它可以为任何网络协议增加通用认证和加密的能力,并且从 Subversion 1.5 开始所有的后续版本,包括 svnserve 服务器和 TortoiseSVN 客户端知道如何使用这个库。
要获得这一选项可用性的更充分讨论,你应该看一下 Subversion 手册中的通过 SASL 使用 svnserve 。如果你仅仅是找一种简单的方法为 Windows 服务器设置安全的认证和加密,因此你的版本库可以安全的通过又大又乱的互联网访问,请继续阅读。
SASL 认证
要在服务器上激活详尽的 SASL 功能,你需要做 3 件事。首先,在你的版本库的 svnserve.conf
文件中创建一个 [sasl]
节,包括这样一个配置项:
use-sasl = true
其次,在一个合适的地方创建一个名为 svn.conf
的文件 - 通常在 Subversion 的安装目录中。
第三,创建 2 个新的注册表项目来告诉 SASL 到哪里找到需要的东西。创建一个名为的 [HKEY_LOCAL_MACHINE\SOFTWARE\Carnegie Mellon\Project Cyrus\SASL Library]
注册表键并在其中创建两个新的字符串值:SearchPath
设置为 sasl*.dll
插件所在的目录路径(通常是 Subversion 的安装目录),ConfFile
设置为 svn.conf
文件所在的目录。如果你使用 CollabNet 安装程序,这两个注册表键就已经为你创建好了。
编辑文件 svn.conf
,使其包括下列内容:
pwcheck_method: auxprop auxprop_plugin: sasldb mech_list: DIGEST-MD5 sasldb_path: C:\TortoiseSVN\sasldb
最后一行指示认证数据库的位置,认证数据库是一个名为 sasldb
的文件。它可以在任何地方,不过一个方便的选择是在版本库的上层目录中。确认 svnserve 服务有读取这个文件的权限。
如果 svnserve 已经在运行,你需要重启服务,并确保它读取了更新后的配置参数。
现在所有的东西已经设置完成,你要做的事情就是创建用户和密码。你需要 saslpasswd2
程序来做这件事。如果你使用 CollabNet 安装程序,这个程序会在安装目录内。使用像这样的命令:
saslpasswd2 -c -f C:\TortoiseSVN\sasldb -u realm username
选项 -f
指明数据库的位置,realm
必须与版本库的 svnserve.conf
文件中设置相同的值, username 就是你要使用的用户名。注意 realm 不允许包含空字符。
你可以使用 sasldblistusers2
程序列出数据库中储存的用户名。
SASL 加密
为了启用或禁用加密的不同等级,你可以设置版本库内文件 svnserve.conf
中的两个值:
[sasl] use-sasl = true min-encryption = 128 max-encryption = 256
变量 min-encryption
和 max-encryption
控制服务器所需要的加密强度。要完全禁用加密,就将这 2 个变量的值都设为 0。要启用简单的数据校验(例如,为了防止篡改和保证数据的完整,不加密),就将这 2 个值都设为 1。如果你想允许(但不强制)加密,将最小值设为 0,最大值设为任意位数。要强制加密,将这 2 个值设为大于 1 的数字。在前面的例子中,我们要求客户端至少进行 128 位加密,但是不大于 256 位加密。
使用 svn+ssh 认证
另一种 svnserve 认证的方法是使用 SSH 来建立请求通道。它不像设置 SASL 那样简单,但是某些场合却很有用。
通过此方法,svnserve 不会作为守护进程启动,而是 SSH 为你启动 svnserve,以 SSH 认证的用户身份运行,为此,你需要在你的服务器上有 SSH 守护进程。
设置服务器的基本方法请参见附录 G, 用 SSH 使服务器更安全。你可以在常见问题(FAQ)中使用关键词 “SSH” 找到其它 SSH 相关的主题。
更多的关于svnserve的信息可以看《使用 Subversion 进行版本管理》。
svnserve 基于路径的授权
从 Subversion 1.3 开始,svnserve 支持与 mod_authz_svn
相同的基于路径的授权模式,你需要编辑版本库路径下的 conf/svnserve.conf
引用的授权文件。
[general] authz-db = authz