Centos7安装svn服务

Stella981
• 阅读 721

Centos7安装svn

2020-12-05 09:53:03
2020-11-18 16:54:08+0800 chenxizhan new

  • 在Centos上安装SVN服务器的步骤

  • 简单介绍每个安装步骤的原理

  • CentOS Linux release 7.9

  • svn, version 1.7.14

公司项目使用svn做管理,但我用惯了git,好在有git-svn命令。
只是以前没用过git-svn,想先找个地方练习一下,所以趁着周末在本地虚拟机上搭建了svn 服务。
把搭建过程记录一下。

安装

完整的安装和启动步骤。复制并执行即可。

# 1. 安装服务
sudo yum install subversion
# 2. 创建存放仓库的目录
sudo mkdir -p /var/svn
# 3. 创建名为 rep1 的仓库
pth=/var/svn/rep1
sudo svnadmin create $pth
# 4. 添加一个访问仓库的账号密码
#   4.1 先启用账号密码认证
sudo sed -iE -e 's/# password-db = passwd/password-db = passwd/' $pth/conf/svnserve.conf
#    4.2 再添加用户名 bob,密码 cpc2020*
sudo sed '/^\[users\]/abob=cpc2020*' -i $pth/conf/passwd
# 5. 启动服务
sudo systemctl start svnserve.service
#   5.1 确认服务启动成功
sudo systemctl status svnserve.service
# 6. 设置服务开机启动
sudo systemctl enable svnserve.service

客户端访问

在客户端实际访问一下,测试服务是否搭建正常。

# 1. 检出仓库
$ svn co svn://localhost/rep1
Checked out revision 0.
# 2. 测试提交文件
#   2.1
$ cd rep1
#   2.2 新建文件并提交
$ touch foo
$ svn add foo
$ svn commit -m test # 这时会提示输入用户名和密码
Adding         foo
Transmitting file data .
Committed revision 1.
# 3. 查看提交历史
$ svn up # 先更新
Updating '.':
At revision 1.
$ svn log # 查看历史
------------------------------------------------------------------------
r1 | bob | 2020-12-05 11:14:44 +0800 (六, 05 12月 2020) | 1 line

test
------------------------------------------------------------------------

安装步骤解释

步骤 1,2,5,6 是操作系统相关的内容。
步骤 3,4是svn中的知识点。

1. 安装服务

sudo yum install subversion
这条命令用来安装 subversion 软件包,该软件包同时包含服务器和客户端程序。

安装完成之后,机器上会多出来 svn, svnadmin, svnserve 等命令。
svn 是 subversion 的客户端命令行工具。
svnadmin 和 svnserve 是服务器端程序。
执行 svn 命令,有类似输出说明安装成功。

$ svn --version
svn, version 1.7.14 (r1542130)
   compiled Sep 30 2020, 17:44:04

Copyright (C) 2013 The Apache Software Foundation.
This software consists of contributions made by many people; see the NOTICE
file for more information.
Subversion is open source software, see http://subversion.apache.org/
……

安装过程会在背后处理很多事情,其中一个就是“注册”了subversion服务,只不过是处于禁用状态。

$ systemctl list-unit-files --all | grep svn
svnserve.service                              disabled

简单分析一下这个服务。

  1. centos 使用 systemd 作为 init 进程,它是个大管家。一个系统服务就是特定位置的一个 .service 文件。

    $ systemctl show svnserve.service | grep Path FragmentPath=/usr/lib/systemd/system/svnserve.service

所以 subversion 服务对应的文件就是/usr/lib/systemd/system/svnserve.service

  1. 查看 .service 文件内容

    2.1 可以用 cat 命令

    $ cat /usr/lib/systemd/system/svnserve.service [Unit] Description=Subversion protocol daemon After=syslog.target network.target

    [Service] Type=forking EnvironmentFile=/etc/sysconfig/svnserve ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid $OPTIONS

    [Install] WantedBy=multi-user.target

    2.2 也可以使用 systemctl cat 命令

    $ systemctl cat svnserve.service

    /usr/lib/systemd/system/svnserve.service

    [Unit] Description=Subversion protocol daemon After=syslog.target network.target

    [Service] Type=forking EnvironmentFile=/etc/sysconfig/svnserve ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid $OPTIONS

    [Install] WantedBy=multi-user.target

.service 文件中各个字段的含义,查阅man systemd.service,或者看中文翻译:
systemd.service 中文手册 [金步国]

2. 创建存放仓库的目录

sudo mkdir -p /var/svn

svnserve.service文件内容很简单。看一下[Service]小节。

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/svnserve
ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid $OPTIONS

[Service]表明这是一个系统服务,
ExecStart 给出了启动服务的命令。
EnvironmentFile给出了环境变量设置,cat 一下,这个文件只设置了一个环境变量 OPTIONS

$ cat /etc/sysconfig/svnserve
# OPTIONS is used to pass command-line arguments to svnserve.
#
# Specify the repository location in -r parameter:
OPTIONS="-r /var/svn"

所以启动服务实际执行的命令就会是:
/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid -r /var/svn
这里的 -r /var/svn 是指定了 svn 服务存放仓库的路径。
一个 svn 服务可以同时管理多个仓库,每个仓库就是 /var/svn 下的一个子目录。
安装svn不会自动创建这个目录,所以需要手动创建。

3. 创建名为 rep1 的仓库

pth=/var/svn/rep1
sudo svnadmin create $pth

一个 svn 服务可以同时管理多个仓库,每个仓库就是 /var/svn 下的一个子目录。
比如,如果svn服务管理了 rep1,rep2 两个仓库,则 /var/svn 下就会有两个子目录。

$ ls /var/svn/
rep1/  rep2/

从文件系统的角度看,一个svn服务端的仓库就是 /var/svn 目录下一个具备特定结构的子目录。

$ ls /var/svn/rep1 -F
conf/  db/  format  hooks/  locks/  README.txt

svnadmin 是服务端辅助管理工具,它可以创建空仓库。
项目中使用的仓库一般有 trunk/, tags/, branches/ 三个子目录。这里只简单创建空的目录。
svn 仓库布局和svn的使用参考 svn-book(svn 官网的一本书)。

4. 添加一个访问仓库的账号密码

#    4.1 先启用账号密码认证
sudo sed -iE -e 's/# password-db = passwd/password-db = passwd/' $pth/conf/svnserve.conf
#    4.2 再添加用户名 bob,密码 cpc2020*
sudo sed '/^\[users\]/abob=cpc2020*' -i $pth/conf/passwd

每个仓库下都有 conf/svnserve.conf 文件,它是所在仓库的主配置文件,账号密码和访问权限的设置都是在这里。
该文件默认的内容提供了文件格式说明、可用的选项及其含义、选项默认值。

默认权限设置是:允许匿名用户读取仓库,但必须有账号密码才能做提交。

相关的设置是这两行:

# read 权限只能读取,不能提交;write 可以读取和提交;设置为anno则禁止访问。
# 等号两侧的空格是可选的。
# anon-access = read
# auth-access = write

因为是默认值,所以svn就放在了注释中,如果需要修改默认行为,去掉井号,设置特定的值就行了.

这一步骤的第一条命令执行完毕后,去掉注释(井号开头的行),有实际意义的行只有两行:

[general]
password-db = passwd

password-db = passwd指定存放账号密码的文件是passwd

第二条命令就在 passwd 文件中添加了一个账号。紧挨着[users]下面那一行就是。

[users]
chenx=1995*
# harry = harryssecret
# sally = sallyssecret

conf/svnserve.conf 文件中还有个authz-db = authz选项,放开这一行可以开启基于仓库
路径的访问控制(默认是对整个仓库授权),只要在 authz 文件中设置权限即可。

5. 启动服务

sudo systemctl start svnserve.service
这是 systemd 工具链中的组件。

验证服务是否成功启动:

$ sudo systemctl status svnserve.service
● svnserve.service - Subversion protocol daemon
   Loaded: loaded (/usr/lib/systemd/system/svnserve.service; disabled; vendor preset: disabled)
   Active: active (running) since 六 2020-12-05 12:27:33 CST; 5s ago

看到 active (running) 表示启动成功。

6. 设置服务开机启动

sudo systemctl enable svnserve.service

# 创建存放svn仓库的目录
sudo mkdir /var/svn
# 创建一个svn仓库
sudo svnadmin create /var/svn/rep1

从 rep1/svnserve.conf 文件可以看到,
默认,svn仓库允许匿名用户读取,允许登录用户完整的读/写权限。

  • 指定 authz-db 选项,可以开启基于路径的权限管理。默认是不开启的。

让svn服务以非特权用户启动

安装svn之后,查看 svnserve 服务是以 root 身份运行的。
通产来说这是有安全隐患的。所以把它改成非特权用户。

先查看 svnserve.service 的当前运行身份

$ systemctl show svnserve.service  -p User,Group
User=
Group=

User=表示没有指定身份,又因为该服务直接由 systemd 启动,所以svn服务的有效用户id就是root用户。
man systemd.exec

User=, Group= 设置进程在执行时使用的用户与组。 既可以设为一个数字形式的 UID/GID 也可以设为一个字符串形式的名称。 对于系统服务(由 PID=1 的 systemd 系统实例管理)以及由 root 运行的用户服务(由 root 用户启动的 systemd --user 用户实例管理), User= 的默认值是 “root” ,同时亦可明确将 User= 设为其他用户。 对于普通用户运行的用户服务,User= 的默认值就是该用户自身,并且禁止将 User= 切换为其他用户。 如果没有明确设置 Group= 选项,则使用 User= 所属的默认组。 此选项不影响 带有 “+” 前缀的命令。

下面是具体的操作步骤:

# 添加 svn 用户(系统用户)
$ sudo useradd svn --system
# 把相关文件的所有权转移到 svn
$ sudo chown svn:svn /var/svn
$ sudo chown svn:svn /run/svnserve


# 对 svnserve.service 文件做一些定制
$ sudo EDITOR=$(which vim) systemctl edit svnserve.service

这里的 EDITOR=$(which vim) 是为了让 systemctl 使用 vim 编辑器打开,否则它会使用的
古老的 nano 编辑器。
然后在编辑器界面输入如下三行内容:

[Service]
User=svn
Group=svn


# 通知systemd,svnserve.service 服务配置发生了变化
$ sudo sytemctl daemon-reload
# 重新启动服务
$ sudo systemctl start svnserve.service

到此,设置完成。

关于 systemctl edit 命令

为了避免和包管理软件(如yum)冲突,不应该直接编辑软件包提供的文件(如 svnserve.serivce)。
有两种方法可以在不改动原始文件的情况下修改单元文件:创建一个优先级更高的本地单元文件
或创建一个片段,应用到原始单元文件之上。
systemctl edit 实际是创建了 /etc/systemd/system/svnserve.service.d/override.conf 文件,
目录 /etc/systemd/system/svnserve.service.d/ 下的文件配置的同名选项会具有比
/etc/systemd/system/svnserve.service 更高的优先级。
而目录 /etc/systemd/system/svnserve.service.d/ 不是软件包的一部分,把自定义配置放在这里
可以防止更新 svn 软件包的时候被覆盖掉。

用 systemctl cat 可以查看最终的配置效果:

$ sudo systemctl cat svnserve.service
# /etc/systemd/system/svnserve.service
[Unit]
Description=Subversion protocol daemon
After=syslog.target network.target

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/svnserve
ExecStart=/usr/bin/svnserve --daemon --pid-file=/run/svnserve/svnserve.pid $OPTIONS

[Install]
WantedBy=multi-user.target

# /etc/systemd/system/svnserve.service.d/override.conf
[Service]
User=svn
Group=svn

这个再看服务对应的用户和组,已经都是 svn 了。

$ systemctl show svnserve.service  -p User,Group
User=svn
Group=svn
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这