首页 > 代码库 > 搭建SVN服务并且实现备份

搭建SVN服务并且实现备份

<link rel="File-List"><link rel="themeData"><link rel="colorSchemeMapping"><style>p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 10.5pt; font-family: 等线 } h1 { margin-top: 17.0pt; margin-right: 0cm; margin-bottom: 16.5pt; margin-left: 0cm; text-align: justify; line-height: 240%; page-break-after: avoid; font-size: 22.0pt; font-family: 等线 } a:link,span.MsoHyperlink { color: #0563C1; text-decoration: underline } a:visited,span.MsoHyperlinkFollowed { color: #954F72; text-decoration: underline } p.MsoListParagraph,li.MsoListParagraph,div.MsoListParagraph { margin: 0cm; margin-bottom: .0001pt; text-align: justify; text-indent: 21.0pt; font-size: 10.5pt; font-family: 等线 } span.1Char { font-weight: bold } .MsoChpDefault { font-family: 等线 } div.WordSection1 { } ol { margin-bottom: 0cm } ul { margin-bottom: 0cm }</style>

搭建SVN服务并且实现备份

场景:

       某公司承接了两个开发项目,准备为开发项目组建立svn服务,收集开发人员一天开发的代码,要求有三点

1、 可以实现开发人员使用svn客户端连接使用

2、 需要实现代码的实施备份一遍灾难恢复

3、 开发人员可以执行上传下载操作

实现思路:

1、 搭建svn版本控制,创建多个项目,客户端成功使用

2、 实现svn服务端与备份机的无登录交互

3、 结合ssh同步源实现代码同步

4、 测试增删改到备份机,数据是否一致

物理拓扑:

在开始之前需要检查以下几点:

1、 主机名是否更改

2、 Hosts文件双方是否能够解析

3、 双方是否可以正常物理通信

4、 系统为最小化安装,并配置yum源安装了gcc编辑器以及Development tools

5、 确定好svn版本库树形结构

6、 关闭SELINUX

Svn版本库结构

此结构主要是分为了一个大的总版本库,版本库下面有两个分支,分别代表了一个项目,每个项目下面分别有骨干、分支、合并等

能够阙东以上三点就可以实施了

首先在svnserver上进行操作

由于很多公司的svn是采用rpm的方式进行安装的,今天我这里也是一样,采用rpm的方式安装

检查系统是否已经默认安装了subversion,如果未安装执行

rpm -qa subversion

subversion-1.6.11-7.el6.x86_64

如果未安装请执行yum -y install subversion安装即可


按照版本库创建版本库,我们按照规范进行操作,在根目录下创建一个目录名为development,在development目录下面我们建立svn总版本库名为svndata

mkdir /development

svnadmin  create /development/svndata

其中svnadmin svn的管理命令可以使用 svnadmin –help查看相关帮助,create创建版本库的选项,想查看create后面的参数请使用 svnadmin help create 查看相关帮助。


再根目录下svnroot目录并在这个目录下创建两个大版本库分别为北京项目、天津项目,在这两个项目下建立分支,由于项目名称不能使用中文,请使用project1代表北京项目,使用project2代表天津项目

mkdir /svnroot

mkdir /svnroot/project1/trunk  -p

mkdir /svnroot/project1/branch

mkdir /svnroot/project1/age

 mkdir /svnroot/project2

mkdir /svnroot/project2/trunk -p

mkdir /svnroot/project2/branch

mkdir /svnroot/project2/age

ls /svnroot/

总用量 8

drwxr-xr-x 2 root root 4096 6   5 17:58 project1

drwxr-xr-x 2 root root 4096 6   5 17:58 project2

将这两个大版本库导入到svndata版本库下

svn import /svnroot/  file:///development/svndata/ -m  "import svndata"

增加           /svnroot/project1

增加           /svnroot/project1/trunk

增加/svnroot/project1/age

增加/svnroot/project1/branch

增加           /svnroot/project2

增加/svnroot/project2/trunk

增加/svnroot/project2/age

增加/svnroot/project2/branch

提交后的版本为 1

解释一下以上命令的含义

Import  为导入命令,将/svnroot目录下的目录导入到svndata版本库下 -m输入日志信息

Import的其他用法请使用 svn help import查看具体帮助


具体的svndata下生成了那些信息,我这里就不做解释了,我解释的一些相关信息并不全面,想了解具体信息请游览官网查看http://subversion.apache.org/

我今天只是把这次版本发布svn的搭建过程整理了一份资料方便以后查阅使用,当然了本人并不反对与有爱好的人分享此篇总结。


先进入到svndata目录下有一个conf目录,里面存放了svndata版本库的配置文件

cd /development/svndata/conf/

/development/svndata/conf

ls -l

总用量 12

-rw-r--r-- 1 root root 1080 6   5 17:50 authz

-rw-r--r-- 1 root root  309 6   5 17:50 passwd

-rw-r--r-- 1 root root 2279 6   5 17:50 svnserve.conf

其中svnserver.confsvn版本库的配置文件,里面包含了认证文件的路径以及匿名用户是否拥有读取权限等操作

      passwd文件指定了用户的登录名以及对应的密码信息

      authz文件指定了passwd文件中用户的权限


为了便于管理,我习惯在/development目录下建立一个存放认证文件的目录名为svnpasswd

mkdir /development/svnpasswd

修改svnserve.conf文件,在修改之前先备份,备份的目的有两个,一个是便于操作失误能够进行快速还原,另外一个就是改完之后可以对比文件修改了那些地方

cp svnserve.confsvnserve.conf.backup

开始编辑,过程略,直接看编辑完成之后的结果,此文件的修改配置项必须定格,否则配置错误

diff svnserve.conf.backupsvnserve.conf

12,13c12,13

< # anon-access = read

< # auth-access = write

---

> anon-access = none

> auth-access = write

20c20

< # password-db = passwd

---

> password-db = /development/svnpasswd/passwd

27c27

< # authz-db = authz

---

> authz-db = /devdelopment/svnpasswd/authz

<开头的是修改之前的配置项信息

>开头的是修改之后的配置项信息


authz  passwd 文件复制到/development/svnpasswd目录下请切换到该目录

cp authz  passwd  /development/svnpasswd/

cd /development/svnpasswd/

pwd

/development/svnpasswd

编辑passwd文件定义用户属性,这里的用户分为两个项目组的用户,其中zhangsanlisiproject1组的成员,有读写权限、liutaogaoyuanyaunchenglongproject2组的成员拥有读写权限,admin作为管理员对svndata总版本库拥有rw权限

Passwd文件主要定义有哪些用户,格式为  用户名 = 密码    #注意等号两边的空格以及书写必须顶格

[users]                       #存在

# harry = harryssecret

# sally = sallyssecret

zhangsan = 123456                #从这里之后都是添加,前面是用户名,后面是密码

lisi = 123456

liutao = 123456

gaoyuanyuan = 123456

chenglong = 123456

admin = 123456

定义authz文件,定义这些用户的权限,之中这里面有组的概念,可以将多个用户定义一个组,为组定义权限,组内的用户共享这个权限

此文件格式定义组的格式为

[group]               存在

组名 = 用户多个用户使用逗号进行分隔

版本库授权的格式为

[版本库根目录]

@组名 = 权限

用户名 = 权限

[版本库根目录:/项目目录]

@组名 = 权限

用户名 = 权限

[groups]

project1 = zhangsan,lisi

project2 = liutao,gaoyuanyuan,chenlong

[/]

admin = rw

[/project1]

@project1 = rw

[/project2]

@project2 = rw

 * =   


启动svn服务

svnserve -d -r /development/svndata/

检查启动结果,端口号为3690,如果防火墙开启了请建立相关规则

svnserve -d -r /development/svndata/

netstat -anptlu | grep svn

tcp        00 0.0.0.0:36900.0.0.0:*                   LISTEN      34834/svnserve   

iptables -I INPUT -p tcp --dport 3690 -j ACCEPT

service  iptables save


客户端操作

安装客户端软件,软件下载地址http://pan.baidu.com/s/1c0YZJC,里面有汉化包,下载完成之后,直接双击安装即可

安装完成之后,在任意地点创建文件夹名字任意,我在桌面上创建一个文件夹为svndata

点击右键会出现一个SVN检出的选项点击一下

这里输入svn的路径即可点击确定,之后输入admin的用户信息,否则其他用户不能验证成功,

这里介绍一下svn客户端的三种登录方式

svn://ip地址    这种是svn默认的登录方式

http://ip地址   这种是结合了apache实现的 web登录方式

https://ip地址  这种是结合了apache+openssl实现的安全登录方式,.常用于外网svn

file:///本地的登录方式,一般在svn服务端本地操作时会用到

在创建两个文件夹,一个为peoject1,,一个为project2分别使用这两个项目组的用户登录

这是你登录进去就会发现属于project1组的项目就会出现在project1的文件夹中

同样project2也是一样

到此为止svn的简单部署就完成了,后面呢就介绍如何实现svn实施同步的问题


备份思路:

       利用svn自带的 svnadmin dump命令进行全库备份以及增量备份,之后上传到备份服务器上

在备份机上操作

useradd rput && passwd rput

service sshd restart

ntpdate time.nist.gov

mkdir /backup

setfacl-R -m user:rput:rwx /backup/

setfacl-R -m default:user:rput:rwx /back


在服务器端操作

ntpdate time.nist.gov

mkdir /backup

mkdir /data

ssh-keygen -t rsa     #后面一路回车即可

ssh-copy-id -I /root/.ssh/id_rsa.pub  rput@192.168.1.67


建立全量,增量脚本

以下为两个脚本

1、 全库备份

#!/bin/sh

SVN_DIR=/development/svndata/       #定义SVN库目录变量

SVN_BAK_DIR=/backup/                #定义备份文件存放目录变量

NUM1=$(cat /data/jsb_svn_id)         #取初始化版本号

NUM2=$(svnlook youngest $SVN_DIR)   #取当前最新的版本号

#开始备份

svnadmin dump $SVN_DIR  -r $NUM1:$NUM2  --incremental >  $SVN_B

AK_DIR/whole_bak_$DATE

#判断备份是否成功,若成功,则记录当前最新的版本号到临时文件中,

用于下次增量备份使用

if [ $? -eq 0 ];

then

echo $NUM2 > /data/jsb_svn_id

else

echo "backup fail...."

fi

~                   


2、 增量备份

#!/bin/sh

SVN_DIR=/development/svndata/              #定义SVN库目录变量

SVN_BAK_DIR=/backup/       #定义备份文件存放目录变量

NUM1=$(cat /data/jsb_svn_id)         #取初始化版本号

NUM2=$(svnlook youngest $SVN_DIR)   #取当前最新的版本号

#开始备份

svnadmin dump $SVN_DIR  -r $NUM1:$NUM2  --incremental >  $SVN_B

AK_DIR/ increment_bak_$DATE

#判断备份是否成功,若成功,则记录当前最新的版本号到临时文件中,

用于下次增量备份使用

if [ $? -eq 0 ];

then

echo $NUM2 > /data/jsb_svn_id

else

echo "backup fail...."

fi

               


在配置计划任务之前请手动执行一次这两个脚本

建立计划任务,实现每周日凌晨1点进行一次全库备份,凌晨2点进行增量备份

最后利用rsync进行同步

       rsync -azH /backup  rput@192.168.1.67:/backup

crontab -e

00 1 * * 7 /bin/sh whole.sh

00 2 1 * * /bin/sh increment.sh

00 3 1 * * /usr/bin/rsync -azH /backup rput@192.168.1.67:/backup

恢复思路:

1、 建立全新的svn

2、 使用最近一次的全库备份进行恢复,在进行每天的增量恢复

3、 进行结果查看

恢复命令

svnadmin load  要恢复的svn < 备份全路径



来自为知笔记(Wiz)


搭建SVN服务并且实现备份