从零开始搭建一个从Win7环境备份至CentOS7的SVN双机备份环境

时间:2021-03-08 17:19:46

★几个关键的事项★
  • 需要关闭防火墙filewalld跟selinux ,在root用户下操作:

    [root@localhost svnRepos]# systemctl stop firewalld

    [root@localhost svnRepos]# systemctl disable firewalld

    [root@localhost svnRepos]# systemctl status firewalld

    [root@localhost svnRepos]# vi /etc/selinux/config

    # 把SELINUX=enforcing 改成 SELINUX=disabled
  • 因为CentOS7安装的apache服务器httpd都是以apache组的apache用户身份访问,所以需要把apache用户添加到我们的SVN目录授权访问的组(本文中是cqgk组的cqgk用户拥有SVN目录权限),并且确保这个组对SVN目录有写权限
  • 需要安装以下列表内容:

    yum install httpd

    yum install epel-release

    yum install subversion # 需要按照下面的步骤添加最新的1.10版本的源配置后再安装

    yum install mod_dav_svn # mod_dav_svn是apache服务器访问svn的一个模块,安装成功后会有两个so:

    /usr/lib64/httpd/modules/mod_dav_svn.so、/usr/lib64/httpd/modules/mod_authz_svn.so
  • 配置最多的http.conf里面修改内容:
    • 找到里面的User apache、Group apache,分别修改为:User cqgk、Group cqgk,因为本文中的SVN目录所属用户、所属组均为cqgk
    • 配置访问地址:找到ServerName 这样,修改后面的内容为实际访问的本机地址,例如本文中的

      ServerName 192.168.1.253:80
    • 在最后添加以下两行:

      LoadModule dav_svn_module /usr/lib64/httpd/modules/mod_dav_svn.so

      LoadModule authz_svn_module /usr/lib64/httpd/modules/mod_authz_svn.so
    • 在最后再添加SVN的配置信息如下(多仓库):
<Location /svn-2>
DAV svn
SVNListParentPath on
# 对于多仓库,需要配置SVNParentPath
SVNParentPath /home/cqgk/svnRepos
AuthType Basic
AuthName "Hello, Subversion repos"
# 控制哪些用户可以访问svn,跟前面配置的路径一致
AuthzSVNAccessFile /etc/httpd/conf.d/svn-policy-file
# 授权用户的认证信息在哪里,跟前面配置的密码信息一致
AuthUserFile /etc/httpd/conf.d/svn-auth-conf
Require valid-user
</Location>
  • 关于最后访问时SVN根目录可以,但是进入子仓库时提示:Could not find the requested SVN filesystem,请看最后一个疑问的暂时解决方案。

  • 系统篇

  • 1.安装CentOS7 7.4.1708_x86_64,下载地址:

    CentOS7 7.4.1708_64 DVD 版本

  • 2.下载最新的UltraISO软件,用它制作一个CentOS7的启动U盘,操作很简单:

    【会格式化U盘,请及时备份重要资料】
    启动UltraISO,从菜单:文件->打开,选择第1步下载的.iso文件
    选择菜单:启动->写入硬盘映像,然后弹出对话框里的【写入方式】选择USB-HDD+,其它的保持默认,点击写入按钮等待制作完成。
  • 3.在电脑上把U盘的卷标修改为:CENTOS7,后面需要用到这个名字

  • 4.电脑插入制作好的U盘,进入BISO设置从这个U盘启动,进入CentOS的启动菜单界面

  • 5.通过上下箭头选择第一个菜单项:Install CentOS 7,然后按TAB按键,底下会出现一行英文,大体意思是说要安装的源路径,可以看到有LABLE=CentOS 7…X86…64… 一长串的内容

     把LABLE等号后面的这个内容修改为:CENTOS7,这个内容就是前面第3步修改的卷标名,区分大小写,必须跟卷标名完全一致,然后回车会自动重启进入到图形安装界面。
  • 6.进入安装界面,第一步就是选择语言,选择我天朝的语言;下一步,时区选择上海时区;软件选择GNOME图形桌面(否则进入的是命令行操作界面,我是还没到那个层次,搞不定),GNOME附加项的内容根据需要勾选.

    我选择的GNOME附加选项是:GNOME应用程序、互联网应用程序、办公套件、开发工具、传统X Windows系统的兼容性
  • 7.安装位置

    选择要把系统安装到那个硬盘,点进去后,选择硬盘(如果有多个就都勾选),然后设置具体分区,/boot挂载点用于存放系统启动相关的,大小设置不超过8G,一般设置4G足够了,可以多搞几个swap交换区,单个swap交换区大小一般是内存的2倍,然后/挂载点跟/home挂载点根据需要分配(/home 这个挂载点我是把1T硬盘剩下的800多G都给它了)
     如果是多个硬盘,前面在选择安装位置时,都勾选上,然后在后面的分区时,设备类型就不能选标准的了,要选LVM类型的,它是在分区跟磁盘更上层的概念,会把多个磁盘连在一起使用。
  • 8.进入安装界面,还有两个黄色的感叹号选项需要配置:设置root密码、创建cqgk用户及密码

  • 配置篇

    • 安装httpd
    yum -y install httpd
    • 卸载CentOS7 默认安装的svn 1.7版本
    yum  remove subversion
    rpm -qa subversion #输入查询如果不显示任何内容表示卸载成功
    创建一个yum repo文件:vi /etc/yum.repos.d/wandisco-svn.repo

    输入以下内容并且保存:

    [WandiscoSVN]

    name=Wandisco SVN Repo baseurl=http://opensource.wandisco.com/centos/7/svn-1.10/RPMS/$basearch/

    enabled=1

    gpgcheck=0

    • 安装svn最新的1.10版本
    yum -y install subversion

    如果提示错误:软件包:subversion-1.10.0-1.x86_64 (WandiscoSVN) 需要:libserf-1.so.0()(64bit) ,则先安装:

    yum install epel-release

    然后重新输入命令安装svn:

    yum -y install subversion

    装完后,输入 svn --version,会显示当前安装的版本信息

    • cd到cqgk的主目录:/home/cqgk,创建SVN目录:mkdir svnRespo,然后进入svnRespo批量创建svn库目录:
    mkdir service.foundation service.order  web.miniprogram front.admin  service.goods web.scheduler service.market uapp web.wechat

    然后逐个初始化svn库:

    svnadmin create front.admin/
    svnadmin create service.foundation/

    • 进入到/home/cqgk/svnRepo 目录,批量删除各个子库下面的conf目录里面的授权、密码文件(用不到,后面会统一指向外层的文件,方便控制,否则对于多仓库的管理非常麻烦)
    [cqgk@localhost svnRespo]$ find  . -name  'authz' -type  f -print -exec  rm -rf  {} \;
    [cqgk@localhost svnRespo]$ find . -name 'passwd' -type f -print -exec rm -rf {} \;
    • 逐个进入到子仓库的conf目录,修改svnserve.conf文件中仓库的授权、账号文件路径:
    在svnserve.conf文件的[general] 下面加入以下代码

    #匿名访问的权限,可以是read,write,none,默认为read

    anon-access=none

    #使授权用户有写权限

    auth-access=write

    #密码数据库的路径

    password-db= /etc/httpd/conf.d/svn-auth-conf

    #访问控制文件

    authz-db = /etc/httpd/conf.d/svn-policy-file

    #认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字

    realm=/home/cqgk/svnRepos

    • 切换到root用户,创建前面这一步指定的授权控制以及密码验证文件
    vi /etc/httpd/conf.d/svn-auth-conf

    然后保存

    vi /etc/httpd/conf.d/svn-policy-file

    按i进入编辑模式,把以下内容粘贴进去:

    [aliases]

    [groups]

    #表示cqgk跟xiaochuanyi两个用户都属于cqgk组

    cqgk = cqgk,xiaochuanyi

    # 如果要允许用户对整个svn库根目录都拥有读写权限

    # [/]

    # 用户名 = rw

    # 如果只是允许用户对svn库下面某个子目录拥有读写权限

    # [xxx:/]

    # 用户名 = rw

    [/]

    @cqgk = rw

    然后按Esc退出编辑模式保存,shift+:进入命令行模式,输入wq,回车,保存成功。

    • 因为整个仓库的最*目录所属用户组是cqgk,而apache用户默认不是属于cqgk组,需要添加到这个组:
    [root@localhost svnRespo]# usermod -G cqgk apache
    • 为前面授权群组中的两个用户:cqgk、xiaochuanyi创建用于http访问svn的密码:
    [root@localhost svnRespo]# htpasswd /etc/httpd/conf.d/svn-auth-conf xiaochuanyi

    输入两次一样的密码,即可为用户配置用于鉴权svn访问权限时用的密码了

    • 为httpd配置通过http方式访问svn的信息:
    [root@localhost svnRespo]# vi /etc/httpd/conf/httpd.conf

    在文件的最后,插入以下内容:

    # 以下两行是http方式通过apache访问svn的通讯必须的库
    LoadModule dav_svn_module /usr/lib64/httpd/modules/mod_dav_svn.so
    LoadModule authz_svn_module /usr/lib64/httpd/modules/mod_authz_svn.so # 以下内容是配置http://ip地址/路径 方式访问的属性:
<Location /svn>
DAV svn
SVNListParentPath on # 对于多仓库,需要配置SVNParentPath
SVNParentPath /home/cqgk/svnRespo/
AuthType Basic
AuthName "Hello, Subversion repos" # 控制哪些用户可以访问svn,跟前面配置的路径一致
AuthzSVNAccessFile /etc/httpd/conf.d/svn-policy-file # 授权用户的认证信息在哪里,跟前面配置的密码信息一致
AuthUserFile /etc/httpd/conf.d/svn-auth-conf Require valid-user
</Location>
    # 以上配置,访问时的url为:http://ip地址/svn/仓库1
    • mod_dav_svn是apache服务器访问svn的一个模块,通过yum安装:
    [root@localhost svnRespo]# yum install mod_dav_svn

    安装成功后,会有mod_dav_svn.so和mod_authz_svn.so两个文件。

    [root@localhost svnRespo]# find / -name mod_dav_svn.so

    会出现:/usr/lib64/httpd/modules/mod_dav_svn.so

    [root@localhost svnRespo]# find / -name mod_authz_svn.so

    会出现:/usr/lib64/httpd/modules/mod_authz_svn.so

    • 启动svn服务:
    [root@localhost svnRespo]# svnserve -d -r /home/cqgk/svnRespo/
    • 启动httpd服务,以便通过http方式访问svn库:
    [root@localhost svnRepos]# systemctl start httpd.service

    关于httpd服务的命令:

    # 启动、终止、重启
    systemctl start httpd.service #启动
    systemctl stop httpd.service #停止
    systemctl restart httpd.service #重启 # 设置开机启动/关闭
    systemctl enable httpd.service #开机启动
    systemctl disable httpd.service #开机不启动 # 检查httpd状态
    systemctl status httpd.service
    • 此时通过http://当前服务器ip/svn 如果无法访问刚才建立的SVN 仓库,或者返回403错误,可能是防火墙问题,需要增加防火墙规则:
    [root@localhost svnRespo]# firewall-cmd --permanent --add-service=http
    [root@localhost svnRespo]# firewall-cmd --permanent --add-service=https
    [root@localhost svnRespo]# firewall-cmd --reload
    • 进入到各个子仓库目录的hooks钩子目录,复制一个钩子pre-revprop-change文件,然后进入编辑,里面所有内容去掉,只保留exit 0 这一句:
    [cqgk@localhost hooks]$ cp pre-revprop-change.tmpl pre-revprop-change

    然后初始化仓库:

    [cqgk@localhost hooks]$ svnsync init file:///home/cqgk/svnRespo/cqgk.commons https://192.168.1.251/svn/cqgk.commons  --username xiaochuanyi --password xiaochuanyi521*

    正常会出现:复制版本0 的属性

    注意:上面的用户名跟密码,在源服务器(Win7系统)跟当前CentOS7 服务器中需要完全一致,也就是两个SVN库中都有这个用户,且密码都是一样的

    最后,同步仓库内容:

    [cqgk@localhost hooks]$ svnsync sync file:///home/cqgk/svnRespo/cqgk.commons https://192.168.1.251/svn/cqgk.commons  --username xiaochuanyi --password xiaochuanyi521*

    正常会出现以下内容:

    已提交版本 14。
    复制版本 14 的属性。
    已提交版本 15。
    复制版本 15 的属性。
    已提交版本 16。
    复制版本 16 的属性。
    已提交版本 17。
    传输文件数据.........
    • 此时通过http://ip地址/svn 来访问svn,还是不行,提示:Can’t open directory’/home/cqgk/svnRepos’: Permissiondenied ,原来是还忘修改http.conf里面的几个地方,哈哈:

    [root@localhost svnRepos]$ vi /etc/httpd/conf/httpd.conf\

    找到以下两行:

    User apache

    Group apache

    因为我们的svn目录都是cqgk用户,属于cqgk用户组,所以要把这两个都改为cqgk:

    User cqgk

    Group cqgk

    还有,修改ServerName 为你的当前Linux真实ip地址 :

    ServerName 192.168.1.253:80

    最后让apache用户对”/home/cqgk/svnRepos″目录拥有写权限。

    #将用户apache加入root组

    [root@localhost cqgk]# usermod -a -G cqgk apache

    #让group对/home/cqgk/svnRepos目录也有写权限

    [root@localhost cqgk]# chmod -R g+w /home/cqgk/svnRepos

☆实现客户端提交代码后,从Win7源服务器自动同步到CentOS7备份服务器☆

前面的步骤,已经实现了能正常通过 http://ip:端口/svn 来访问仓库了。现在要实现的是,从win7源服务器上有代码提交时自动同步到CetnOS7备份服务器。下面描述中代号:SPC 表示win7源服务器,DPC表示CentOS备份服务器

  • 首先,需要在SPC里面执行一下同步的命令,让SPC的SVN应用能获得自动执行所需的权限 :
      C:\Users\Administrator>svnsync sync  http://192.168.1.253/svn-2/service.goods --sync-username 用户名 --sync-password  密码 --config-dir E:\svnsynccertauth

    然后会提示询问你是否保存 https证书信息

    ®eject, accept (t)emporarily or accept §ermanently?

    选择p。然后输入当前主机登录所需的账号、密码

    Error validating server certificate for 'https://192.168.1.251:443':
- The certificate is not issued by a trusted authority. Use the
fingerprint to validate the certificate manually!
- The certificate hostname does not match.
Certificate information:
- Hostname: PC201411132127
- Valid: from Apr 13 02:56:53 2015 GMT until Apr 10 02:56:53 2025 GMT
- Issuer:
- Fingerprint: F6:76:A2:CA:A5:AF:EC:30:47:4B:36:8E:DB:6A:F6:23:3D:81:FF:AC
(R)eject, accept (t)emporarily or accept (p)ermanently? p
Authentication realm: <https://192.168.1.251:443> VisualSVN Server
Password for 'Administrator': 输入你登录当前win7系统用户的密码
Authentication realm: <https://192.168.1.251:443> VisualSVN Server
Username: 访问当前SVN服务器的用户名
Password for 'xiaochuanyi': 访问当前SVN服务器用户的密码
  • 然后,在VisualSVN Server的应用程序上,在所需要同步的仓库目录右键选择属性,点击hooks钩子页签,双击Commit 下面的Post-commit hook ,输入以下同步的命令:

svnsync sync –non-interactive --trust-server-cert http://192.168.1.253/svn-2/仓库名 --sync-username xiaochuanyi --sync-password xiaochuanyi521* --config-dir E:\svnsynccertauth

  • ☆注意以上命令中最后的https证书存储目录–config-dir E:\svnsynccertauth要跟前面输入用户名密码前的那个命令里面的目录一致。

然后,当这个仓库有代码提交后,就会自动同步到192.168.1.253的备份SVN服务中了。

☆搞不懂的疑问?☆

  • 疑问 在http.conf里面配置的ip访问时的根目录名如果为svn,其它都配置好之后,访问时,只能进入所有子仓库的共同父级目录,比如本文中的 /home/cqgk/svnRepos,会列出此目录中的各个子仓库,但是点击以后进入,就会提示Could not find the requested SVN filesystem

    进入查看http的错误日志: vi /etc/httpd/logs/error_log,会提示

    [Sun May 06 14:56:11.694794 2018] [:error] [pid 6481] (20014)Internal error: [client 192.168.1.212:62124] Can’t open file ‘/home/cqgk/svnRepos/svn/format’: No such file or directory, referer: http://192.168.1.253/svn/

    这个目录肯定是没有的,真实的目录结构是/home/cqgk/svnRepos/xxxproject,然后把httpd.conf中配置的访问地址根目录从

    <Location /svn>改为 <Location /svn-2>,然后重启httpd服务:

    [root@localhost svnRepos]# systemctl restart httpd.service

    然后通过http://192.168.1.253/svn-2/的地址访问,会列出所有子仓库列表,点击某个子仓库也能正常访问了…