Centos7安装svn服务 电玩女神 2022-12-26 11:24 206阅读 0赞 # Centos7安装svn # 最新更新:2020-12-09 22:38:32 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 中文手册 \[金步国\]][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 -R svn:svn /var/svn $ sudo chown -R 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 [systemd.service _]: http://www.jinbuguo.com/systemd/systemd.service.html#
还没有评论,来说两句吧...