发表于: 2018-08-20 21:48:45

1 2976


SVN服务器搭建 2018.08.15

一. 本地安装centos7 minimal版操作系统及简单配置

  1, 安装好后网络配置静态ip联网

    cenos7默认以networkManager套件管理网络, 以及ip命令, 比较老的ifconfig默认没有安装. 因为详细用法还没吃透, 此处使用networkManager套件的nmcli来进行配置, 再辅以直接修改配置文件来将就一下. 

    参考: REDHAT官方文档联网指南 第二章 https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/networking_guide/

    显示所有设备及其状态:

    nmcli device status

    显示所有网络连接:

    nmcli con show

    添加静态连接:

    nmcli con add type ethernet con-name net_static ifname ens33 ip4 192.168.1.168/24 gw4 192.168.1.1

    type类型很多, 这里用'ethernet'; con-name是指定连接名称, 大概等同win系统的'本地连接','宽带连接'等名词; ifname是设备名之类的, 对应上面两条命令输出结果里的'DEVICE'字段. 此处建立连接后设定了ip地址为192.168.1.168, 网关为192.168.1.1, 其他的还有好几个选项没设置, 直接编辑配置文件修改. networkManager相关配置文件位于/etc/sysconfig/network-scripts/目录下面, 我们编辑的网络连接配置文件是该目录下'ifcfg-'开头, 后面接con-name的文件.

    vi /etc/sysconfig/network-scripts/ifcfg-net_static

    部分修改或添加选项大致如下:

    BOOTPROTO=static              #静态连接

    NETMASK=255.255.255.0         #网关

    DNS1=192.168.1.1              #dns地址, 应该一个就够了

    DNS2=60.191.134.196           #浙江电信的可以设置这个

    重启网络:

    service network restart

  2, 安装程序

    minimal精简安装很多常用软件都没有, 先做点补充:

    1) yum install -y bash-completion  # bash命令自动补全

    2) yum install -y man-pages-zh-CN  # man手册中文版

      自定义cman命令用来查询中文man手册

      vi /etc/profile.d/cman.sh

      输入内容:alias cman='man -M /usr/share/man/zh_CN'

      加载该文件生成cman命令:source /etc/profile.d/cman.sh

      测试中文man手册:cman samba

      可能终端显示一片乱码, 这是系统缺少中文支持, 使用 locale -a 查看系统拥有语言包, 

      安装简体中文语言包:

      yum install -y kde-l10-Chinese

      (中间是字母'l'加数字'10', 另外还有个语言包kde-l10n-Chinese-Traditional应该是繁体中文)

      经实际使用, 感觉这个不是很有必要, 挺多命令没有翻译, 部分命令翻译的不完整, 买一本linux命令手册就差不多了, 不足的地方再man查询, 然后辅以有道翻译

    3) centos7安装ntfs-3g 对ntfs文件系统支持

      yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

      yum install ntfs-3g fuse

    4) vi编辑器显示行号, tab键转换为空格:

      vi /etc/virc

      添加:

      set nu              "显示行号

      set tabstop=4       "tab转为4空格

      set softtabstop=4   "一次退格键回退4空格

      set shiftwidth=4    "缩进长度

      set expandtab       "设置缩进用空格表示,noexpandtab表示不用空格

      set autoident       "自动缩进

      if has("autocmd")   "根据文件类型来设置tab缩进

        autocmd FileType javascript setlocal ts=4 sts=4 sw=4 expandtab

        autocmd FileType ptyhon setlocal ts=4 sts=4 sw=4 expantab

      endif

      此处也是先简单配置一下, 其他语法高亮 语法纠错等以后有空再深入研究

      其中/etc/virc是全局配置, 对所有用户都能生效; ~/.virc配置文件是针对用户的独立配置文件.

  3, 防火墙 部分操作命令

    添加--permanent选项,表示永久设置, 需要在重启防火墙或系统后才会生效, 如果没有添加该选项, 则更改将只是此次运行时配置的一部分.

    查看允许哪些服务:

    firewall-cmd --list-all

    添加允许的服务:

    firewall-cmd --add-service http

    添加允许的端口:

    firewall-cmd --add-port = {22/tcp, 8081/tcp}

    重启防火墙:

    firewall-cmd --reload

    关闭防火墙:

    systemctl stop firewalld.service

    systemctl disable firewalld.service

二. 安装svn服务器(subversion)

  1, yum 安装

    yum info subversion

    yum install -y subversion

    先查询, 再安装, 但是yum库的只到1.7.14版本, 官方目前是1.10.2版, 这里尝试官方下载源码安装

  2, 源码安装

    下载源码

    cd /usr/src

    wget -c mirrors.hust.edu.cn/apache/subversion/subversion-1.10.2.tar.gz

    解压

    tar -zxf subversion-1.10.2.tar.gz

    cd subversion-1.10.2

    编译

    ./configure

      编译的时候会因为缺少一些依赖而报错, 以下补充安装缺少的依赖, 此处其实在源码包的INSTALL文件内也有说明相关必须依赖

      configure: WARNING: APR not found

      The Apache Portable Runtime (APR) library cannot be found.

      Please install APR on this system and configure Subversion

      with the appropriate --with-apr option.

      You probably need to do something similar with the Apache

      Portable Runtime Utility (APRUTIL) library and then configure

      Subversion with both the --with-apr and --with-apr-util options.

      configure: error: no suitable APR found

    yum install -y apr apr-devel apr-util apr-util-devel

      An appropriate version of sqlite could not be found.  We recommmend

      3.8.11.1, but require at least 3.8.2.

      Please either install a newer sqlite on this system

      or

      get the sqlite 3.8.11.1 amalgamation from:

          https://www.sqlite.org/2015/sqlite-amalgamation-3081101.zip

      unpack the archive using unzip and rename the resulting

      directory to:

      /usr/src/subversion-1.10.2/sqlite-amalgamation

      configure: error: Subversion requires SQLite

    wget -c https://www.sqlite.org/2015/sqlite-amalgamation-3081101.zip

    yum install -y unzip

    unzip sqlite-amalgamation-3081101.zip

    mv sqlite-amalgamation-3081101 sqlite-amalgamation

    rm -f sqlite-amalgamation-3081101

      checking for lz4 library via pkg-config... no

      configure: lz4 configuration without pkg-config

      checking for LZ4_compress_default in -llz4... no

      configure: error: Subversion requires LZ4 >= r129, or use --with-lz4=internal

    yum install -y lz4-devel

      configure: utf8proc configuration without pkg-config

      checking for utf8proc_version in -lutf8proc... no

      configure: error: Subversion requires UTF8PROC

    yum install -y utf8proc utf8proc-devel

    依赖补充安装完成

    make && make install

    安装完成, 相关svn程序在/usr/local/bin目录下, 可以使用'svn --version'查看当前svn程序的版本号和RA模块 

三. svn服务器配置

  参考http://svnbook.red-bean.com/nightly/zh/svn.serverconfig.overview.html

  常用svn服务器主要分为: 

  1) Apache http服务器, 也就是待解决问题1里的apache+svn网页服务器, 这里暂时先跳过, 后面跟nginx+svn一起了解

  2) svnserve 小型轻量服务器程序, 使用定制的协议与客户端通信. (本文采用该服务器)

  3) 另外还有一种svnserve + ssh

  1, 启动服务器

    1) 独立守护进程启动模式

      svnserve -d -r /var/svn [--listen-port 3690 --listen-host 127.0.0.1]

      

      -d[--daemon] 表示以守护进程模式启动

      -r[--root] 指定服务器仓库根目录, 提供相对路径访问, 比如仓库在/var/svn/pro1, 正常访问url得写成 svn://host.example.com/var/svn/pro1, 设置-r选项之后, url可以写成 svn://host.example.com/pro1

      --listen-port和--listen-host可以修改守护进程绑定的端口号和主机名

    2) 超级进程调用模式

      新建系统用户svnowner用于管理svn服务

      useradd svnowner -s /sbin/nologin -M

      

      由inetd调用, 在/etc/inetd.conf文件内添加内容:

      svn stream tcp nowait svnowner /usr/local/bin/svnserve svnserve -i

      由xinetd调用, 编辑配置文件/etc/xinetd.d/svn (本文采用该启动方式, xinetd相关配置参考man手册, 以及鸟哥的linux私房菜http://cn.linux.vbird.org/linux_basic/0560daemons_2.php)

      vi /etc/xinetd.d/svn

        # default: on

        # description: Subversion server for the svn protocol

        service svn

        {

            disabled        = no

            port            = 3690

            socket_type     = stream

            protocol        = tcp

            wait            = no

            user            = svnowner

            server          = /usr/local/bin/svnserve

            server_args     = -i -r /var/svn --log-file /var/log/svn/svn.log

        }

      注意, 此处日志文件需要手动创建, 至少我测试的时候是需要我手动去创建的. 然后创建文件后还要修改文件的所有者

      chown svnowner /var/log/svn/svn.log

      要不然会因为无法写入日志而报错. 

  

  2, 配置svn服务器

    svnserve.conf配置文件位于每个仓库的'conf/svnserve.conf', 该配置文件在建立仓库的时候会自动生成. 如果想让所有仓库都是用同一个配置文件, 在启动svnserve服务的时候添加'--config-file'选项.

    配置参考:http://svnbook.red-bean.com/nightly/zh/svn.serverconfig.svnserve.html(页面底部)

    1) 建立仓库

      svnadmin create /var/svn/test

      ls /var/svn/test

        conf/  db/  format  hooks/  locks/  README.txt

        创建仓库之后会自动生成一些子目录和文件, 其中

        conf/   是存放配置文件的目录

        db/     目录包含了所有版本花数据相关的数据

        hooks/  目录存放钩子脚本模板和已安装的钩子脚本

        locks/  目录存放仓库锁文件, 用于管理仓库的并发访问

        format  描述了仓库内部组织结构的文件

        README.txt  readme文件

      此时ll /var/svn/test查看目录文件属性, 会发现用户和用户组都是root, 而前面运行svn服务器的时候是交给新创建的svnowner用户的, 所以这里要修改仓库文件目录所有者支持svnowner

      chown -R svnowner:svnowner /var/svn/test

      之后每次创建新的仓库的时候, 也要注意修改目录文件所有者. 

      特别要注意, 如果新建了什么文件, 那一定要检查权限是否正确.

      或者给/var/svn目录赋予SGID, 设置权限为2770, 然后给文件权限掩码设置为002, 则当以root用户建立新仓库的时候, 虽然所有者是root, 但是用户组还是svnowner的, 然后因为掩码权限为002, svnowner用户组对文件及目录具有写权限, 也就不会因为权限问题导致svn服务器无法操作仓库. 这个属于个人当前水准的突发奇想'偷懒', 暂时还没想到会不会造成什么安全隐患. 

      cd /var/svn

      chown -R svnowner:svnowner /var/svn

      chmod 2770 /var/svn

      umask 002

    2) 修改配置文件svnserve.conf(先备份原来的svnserve.conf, 有很多注释说明, 也可以用来做参考)

      cp /var/svn/test/conf/svnserve.conf /var/svn/test/conf/svnserve.conf.tmp

      > /var/svn/test/conf/svnserve.conf

      vi /var/svn/test/conf/svnserve.conf

        [general]

        anon-access = none            # 匿名用户不能访问

        auth-access = write           # 认证用户可读可写

        password-db = passwd          # 用户密码文件路径 同级目录下的passwd文件

        #authz-db = authz             # 指定基于路径的授权的配置文件路径

        #groups-db = groups           # 组文件的路径

        realm = test                  # 仓库的认证域, 默认是他的UUID, 创建仓库时的目录名

        force-username-case = none    # 用户名的大小写形式 upper统一大写, lower统一小写形式, none区分大小写

        hooks-env = hooks-env         # 钩子脚本环境配置文件路径

      配置svn用户密码文件

      vi /var/svn/test/conf/passwd

        [users]

        test = test123    # 用户名 = 密码

      配置基于路径的授权的配置文件

      根据文档描述定义用户更细粒度的访问权限, 比如仓库下的特定目录, 部分用户只读, 其他用户还可写等..

      但是会更加消耗系统资源, 某些情况下, 性能损失很严重. 所以此处配置先略过, 以后有需要再研究

      vi /var/svn/test/conf/authz

        [aliases]

        # joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

        [groups]

        # harry_and_sally = harry,sally

        # harry_sally_and_joe = harry,sally,&joe

        # [/foo/bar]

        # harry = rw

        # &joe = r

        # * =

      以上是svn提供的模板部分代码,

    3) 补充额外的SASL配置

      [root@myectouch svn]# svn checkout svn://192.168.1.163/pro3/project/trunk /home/xy/pro3

      Authentication realm: <svn://192.168.1.163:3690> pro3

      Password for 'test': *******

      -----------------------------------------------------------------------

      ATTENTION!  Your password for authentication realm:

         <svn://192.168.1.163:3690> pro3

      can only be stored to disk unencrypted!  You are advised to configure

      your system so that Subversion can store passwords encrypted, if

      possible.  See the documentation for details.

      You can avoid future appearances of this warning by setting the value

      of the 'store-plaintext-passwords' option to either 'yes' or 'no' in

      '/root/.subversion/servers'.

      -----------------------------------------------------------------------

      Store password unencrypted (yes/no)? no

      svnserve服务器默认情况下使用CRAM-MD5授权验证, 网络协议是未加密的, 而且服务器以明文形式保存密码, 所以当进行一些操作的时候, 就会有类似上面的提示 是否明文保存密码等...此处添加SASL认证加密

      在之前编辑的svnserve.conf文件中添加内容:

      vi /var/svn/test/conf/svnserve.conf

        [sasl]      # 以下内容追加在原文件后面

        use-sasl = true

        min-encryption = 0

        max-encryption = 256

      变量 min-encryption 和 max-encryption 决定加密的级别. 为了完全禁止加密, 就把两个变量都设为 0. 为了开启简单的数据检验 (即防止数据被篡改, 保证数据的完整性, 但没有对数据进行加密), 把两个变量都设为 1. 如果 管理员希望允许—但并非强制—加密, 就把 min-encryption 设为 0, 把 max-encryption 设为稍微大点的值. 为了强制要求 对数据进行加密, 把两个变量都设为大于 1 的数. 

      然后在/etc/sasl2/目录添加新文件svn.conf, 配置DIGEST-MD5认证. 这个文件必须要放在SASL库函数能够找到的位置, 可以运行"whereis sasl2"命令来确认.

      vi /etc/sasl2/svn.conf

        pwcheck_method: auxprop

        auxprop_plugin: sasldb

        sasldb_path: /etc/my_sasldb

        mech_list: DIGEST-MD5

      文件创建好之后, 就可以使用saslpasswd2来添加用户名和密码了,

        saslpasswd2 -c -f /etc/my_sasldb -u [realm] [username]

      此处的realm要跟svnserve.conf文件里的realm对应起来.

      对于saslpasswd2建立的用户列表, 可以使用sasldblistusers2命令来查看

      以上sasl配置参考http://svnbook.red-bean.com/nightly/zh/svn.serverconfig.svnserve.html#svn.serverconfig.svnserve.sasl

      但是配置好之后checkout测试的时候, 报了一个错

      svn: E170013: Unable to connect to a repository at URL 'svn://192.168.1.163/pro1'

      svn: E170001: SASL(-4): no mechanism available: Internal Error -4 in server.c near line 1757

      看还是很明显的, 好像是缺少认证机制, 但是不知道这个server.c文件在哪里, 然后想着我这里用到的是digest-md5这个机制, 使用"yum info *digest-md5*"来查询得到一个"perl-Digest-MD5"的安装包, 安装之后再次checkout还是报同样的错误

      sasl官方文档:https://cyrusimap.org/sasl/index.html

      英语不好, 大致看下来总感觉这个文档在讲一些原理性的东西, 反正是没找到怎样使用sasl配置的东西, man手册也是看的一头雾水, 此处只想说"fuck!!!"

      !!!这个错误解决了, 突然脑子一抽, yum检索了一下'cyrus-sasl*'安装包, 然后发现有一个'cyrus-sasl-md5', 正是这里缺少的认证机制模块.

      然后! 这里创建的my_sasldb文件的所有者也要改为svnserve, 要不然读取不到数据.

      ll /etc/my_sasldb

      -rw-r--r--  1 root     root   104 Aug 20 07:47 svn.conf

      -rw-r-----  1 svnowner root 12288 Aug 20 07:49 svn.sasldb

  3, 客户端常见基本操作

    1) 往仓库中导入数据

      svn import /var/www/website file:///var/svn/test/website -m "init import"

  4, svn服务器维护基本操作

    创建仓库:

    svnadmin create /var/svn/project1

    查看版本号和事务(transactions正在生成过程中的版本号):

    如果不加额外参数, 查看最新版本号, 否则是查看指定版本号/事务

    svnlook info /var/svn/repos [-r NO.][-t NO.]

    删除僵死的事务: 因为某些原因提交失败, 在仓库中残留下来的多余文件或目录等数据

    svnadmin lstxns repos   # 列出所有未完成的事务(输出的每项结果都可以给svnlook作为参数查询)

    svnadmin rmtxns repos 'svnadmin lstxns repos'   # 直接删除所有僵死事务, 也可以先lstxns, 再svnlook查看信息, 然后再具体删除某个事务

    FSFS文件系统压缩: 经过多次版本更新后, 会产生很多描述版本更新信息的小文件, 消耗额外存储空间, 索引大量文件也会影响访问速度

    svnadmin pack /var/svn/repos

    迁移仓库数据

    svnadmin dump repos > dumpfile    # 将仓库导出到一个文件

    svnadmin load newrepos < dumpfile   # 将文件读入到一个新仓库

    svnadmin create newrepos    # 也可以先创建新仓库

    svnadmin dump repos | svnadmin load newrepos    # 然后使用管道命令直接把就仓库迁移到新仓库

    svnadmin dump repos -r 18 > rev-18.dumpfile

    svnadmin dump repos -r 18:37 > rev-18.dumpfile    # 添加-r选项转储指定版本号, 或一段范围内的版本号

    svnadmin dump repos -r 18:37 --incremental > rev-18.dumpfile

    还可以继续添加--incremental选项仅仅转储该范围版本号内的差异文件, 否则在默认情况下会完整的把范围内第一个版本号转储过来.

    在转储的时候, 生成的转储文件一般会比仓库还要大, 可以添加--deltas选项压缩一下, 

    个人猜测: 此处范围转储仓库以及'--incremental'选项在实际开发中的其中一个应用可能是: 一个仓库用于开发测试, 然后另外迁移出一个版本作为正式版

    移动删除仓库: 直接使用系统提供的rm, mv等命令就可以了

     

三. 待解决问题

  1, 因为configure时候第一个补充安装的依赖就是APR(Apache Portable Runtime), 看着就是跟apache有关系的样子, 搜索得知subversion建立http://形式的服务器, 标配apache + mod_dav_svn, 但是其他的nginx之类的就不会太友好, 

  这个暂时不需要, 待配置测试, 参考链接:

  https://serverfault.com/questions/380648/installing-svn-server-using-nginx

  这个貌似nginx + svn配置成功了

  https://serverfault.com/questions/166218/nginx-and-subversion

  解释了svn跟nginx不友好是因为nginx没有完整的web_dav实现, 而svn又好像必须这个东西. 只能使用代理

  https://blog.csdn.net/neubuffer/article/details/16901007

  这篇更加详细的说明了为什么nginx + svn不友好, 有外国同行手写php代码补充缺省功能实现了ngin + svn, 待阅读...

  https://stackoverflow.com/questions/4797242/install-subversion-on-ubuntu-with-nginx-not-apache

  提问ubuntu环境如何使用nginx + svn, 回答subversion只需要libapr等依赖, 不是必须apache, 也就是本文上面介绍的svn或者svn + ssh服务器

  2, svnserve+ssh服务器配置

    对于ssh部分还比较懵逼, 暂时不考虑了, 等以后ssh有点入门之后再回来测试



返回列表 返回列表
评论

    分享到