本节将介绍如何设置、管理和保护 Subversion 服务器。
以下说明将安装一个 Subversion 服务器,该服务器将配置为 使用 OpenSSH 作为安全远程访问方法,并提供 svnserve 用于匿名访问。
Subversion 服务器的配置包括以下步骤:
配置的初始部分需要以 root 用户身份执行。使用以下命令创建
svn 用户和组:
groupadd -g 56 svn && useradd -c "SVN Owner" -d /home/svn -m -g svn -s /bin/false -u 56 svn
如果计划拥有多个仓库,应该为每个仓库设置一个专用组以方便管理。使用以下 命令为测试仓库创建 svntest 组,并将 svn 用户添加到该组:
groupadd -g 57 svntest && usermod -G svntest -a svn
此外,在处理仓库时应设置 umask 002,以便所有新建文件 都可被所有者和组写入。可以通过为 svn 和 svnserve 创建包装脚本来强制实现这一点:
mv /usr/bin/svn /usr/bin/svn.orig && mv /usr/bin/svnserve /usr/bin/svnserve.orig && cat >> /usr/bin/svn << "EOF"#!/bin/sh umask 002 /usr/bin/svn.orig "$@"EOF cat >> /usr/bin/svnserve << "EOF"#!/bin/sh umask 002 /usr/bin/svnserve.orig "$@"EOF chmod 0755 /usr/bin/svn{,serve}
如果使用 Apache 通过 HTTP 访问仓库, 即使是匿名访问,也应该用类似的脚本包装 /usr/sbin/httpd。
有几种方法可以设置 Subversion 仓库。建议查看 《SVN Book》 的相应章节。可以使用以下说明设置一个基本仓库。
使用以下命令(以 root 用户身份)创建一个新的
Subversion 仓库:
install -v -m 0755 -d /srv/svn && install -v -m 0755 -o svn -g svn -d /srv/svn/repositories && svnadmin create /srv/svn/repositories/svntest
仓库创建完成后,应该填充一些有用的内容。你需要预先设置好 目录结构,确保它完全按照你希望仓库的样子来组织。例如, 这里是一个以
svntest/ 为根的示例 BLFS 布局设置。
你需要设置类似于以下的目录树:
svntest/ # 仓库名称
trunk/ # 包含现有的源代码树
BOOK/
bootscripts/
edguide/
patches/
scripts/
branches/ # 额外分支所需
tags/ # 标记发布点所需
按照上述内容创建目录布局后,就可以进行初始导入:
svn import -m "Initial import." \
</path/to/source/tree> \
file:///srv/svn/repositories/svntest
现在修改仓库的所有者和组信息,并将一个非特权用户添加到 svn 和
svntest 组:
chown -R svn:svntest /srv/svn/repositories/svntest &&
chmod -R g+w /srv/svn/repositories/svntest &&
chmod g+s /srv/svn/repositories/svntest/db &&
usermod -G svn,svntest -a <username>
svntest 是分配给 svntest
仓库的组。如前所述,这在使用 OpenSSH 进行认证时,
可以简化多个仓库的管理。接下来,你需要将非特权用户以及任何希望获得 仓库写入权限的其他用户添加到 svn 和 svntest
组。
此外,你会注意到新仓库的 db 目录设置了 set-groupID
位。如果原因不显而易见,当使用任何外部认证方法(例如 ssh)时,设置粘滞位是为了使所有新文件的所有者都是该用户,
但组为 svntest。 svntest 组中的任何人都可以创建文件,
同时仍然给予整个组对这些文件的写入权限。这可以避免将其他用户锁定在仓库之外。
现在,返回到非特权用户帐户,使用 svnlook 查看新仓库:
svnlook tree /srv/svn/repositories/svntest/
可能需要注销并重新登录以刷新组成员资格。su <username>
也应该有效。
如前所述,这些说明将配置服务器仅使用 ssh 对仓库进行 写入访问,并使用 svnserve 提供匿名访问。还有几种 其他方法可以提供对仓库的访问。这些额外配置的最佳说明请参阅 https://svnbook.red-bean.com/。
需要为每个仓库进行访问配置。使用以下命令为 svntest 仓库创建 svnserve.conf 文件:
cp /srv/svn/repositories/svntest/conf/svnserve.conf \
/srv/svn/repositories/svntest/conf/svnserve.conf.default &&
cat > /srv/svn/repositories/svntest/conf/svnserve.conf << "EOF"
[general]
anon-access = read
auth-access = write
EOF
配置文件的内容其实不多。你会注意到只需要 general 段。 查看 svnserve.conf.default 文件以获取有关使用 svnserve 内置认证方法的信息。
要在启动时启动服务器,请从 blfs-systemd-units-20251204 软件包安装
svnserve.service 单元:
make install-svnserve
此外,上述说明要求 svn 服务器使用 umask 002,以便所有新建文件 都可被所有者和组写入。可以通过运行以下命令创建 systemd 单元覆盖文件来实现这一点:
mkdir -p /etc/systemd/system/svnserve.service.d echo "UMask=0002" > /etc/systemd/system/svnserve.service.d/99-user.conf
传递给 svnserve
守护进程的选项可以在 /etc/default/svnserve
中更改。