版本控制系统CVS:CVS服务器的配置

CVS服务器的安装与配置,工程建立与管理(在CVS服务器上导入项目实例、设置CVS项目访问控制)

CVS Concurrent Version System(并行版本系统)的缩写,用于版本管理.如果大家曾经参与过多人协作开发的项目,大家肯定有这样的痛苦经历:由于多个人同时修改同一个文件, 自己辛辛苦苦修改的程序被别人彻底删除了.另外,如果你的软件/程序已经发布了三个版本, 而 这时候用户需要你修改第二个版本的东西,也许你会因为只保留了最新版本而痛哭流涕。还有就是你对程序做了一些修改,但是修改很少,你只想给远方的同事发一 个两个版本之间的差别文件,这样可以免于邮箱不够大,网速太慢之类的问题.为了解决类似这样的问题,以及诸如生成补丁文件,历史版本修改等,一帮黑客(褒 义)在原先 Unix 体系里很成熟的 SCCS RCS 的基础上,开发了 CVS(SCCSSource Code Control SystemRCSRevision Control System)。

CVS 的 基本工作思路是这样的:在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序。由仓库管理员统一管理这些源程序.这样,就好象只有一个人在修 改文件一样.避免了冲突.每个用户在使用仓库之前,首先要把仓库里的项目文件下载到本地。用户做的任何修改首先都是在本地进行,然后用 cvs 命令进行提交,由 cvs 仓库管理员统一 修改.这样就可以做到跟踪文件变化,冲突控制等等.

由于 CVS 是典型的 C/S 结构的软件,因此它也分成服务器端和客户端两部分。不过大多数CVS 软件都把它们合二为一了。我们这里就分别从服务器和客户端的角度讨论cvs的使用。


安装CVS

在Debian安装是非常容易的,省略了:)

创建CVS属主用户

# useradd -d /cvsroot cvs

# chmod 771 /cv       sroot
(在Debian系统安装中,会提示你配置的,这步应该也不用做了)

建立CVS仓库(初始化cvs)

# su cvs

 $ cvs -d /cvsroot init

 $exit

#

启动cvs服务器

/etc/xinetd.d/目录下创建文件cvspserver,内容如下:

# default: on

# description: The cvs server sessions;

service cvspserver

{

        socket_type     = stream       

        wait            = no

        user            = root

        server          = /usr/bin/cvs

        server_args     = -f --allow-root=/cvsroot pserver

        log_on_failure  += USERID

        only_from      = 192.168.0.0/24

}

其中only_from是用来限制访问的,可以根据实际情况不要或者修改。

修改该文件权限:

# chmod 644 cvspserver

然后重新启动xinetd

# /etc/rc.d/init.d/xined restart

然后察看cvs服务器是否已经运行:

# netstat -lnp|grep 2401

tcp   0   0 0.0.0.0:2401    0.0.0.0:*       LISTEN      7866/xinetd

则说明cvs服务器已经运行。

============================================
在Linux上CVS服务可以通过inetd、xinetd或tcpwrapper等来启动,其中inetd由于安全理由在许多场合已经被xinetd所取代了。这里我们使用xinetd来启动CVS服务。

在/etc/xinetd.d目录下为CVS服务创建一个配置文件,比如:/etc/xinetd.d/cvspserver,编辑/etc/xinetd.d/cvspserver,输入如下内容:

  service cvspserver
  {
  disable = no
  socket_type = stream
  wait = no
  user = root
  env = HOME=
  server = /usr/bin/cvs
  server_args = -f --allow-root=/home/cvsroot pserver
  }

  注:
  1)pserver表示是口令认证的访问方式,这是最常用的方式,其他还有gserver,kserver,ext,如果想要更高的安全性可以使用ssh来加密口令和数据流,不过这里为了用户使用的方便,仍然选的是pserver

  2)--allow-root是指定Repository的目录,可以建立多个Repository

  然后重新启动xinetd:

  [root@terry bin]# /etc/rc.d/init.d/xinetd restart
=====================================================

创建用来访问cvs的用户

前面创建的cvs用户是cvs仓库管理用户,而为了让用户访问则还需要一个访问用户:

       # useradd cvspub

       # usemod –G cvs cvspub

这里添加了一个用户cvspub,并且将该用户添加到cvs组中。

管理cvs服务器

管理 cvs 服务器.服务器可以用了,现在大家最关心的就是如何管理服务器,比如,我想让一些人有读和/或写 CVS 仓库的权限,但是不想给它系统权限怎么办呢?不难,cvs初始化结束以后,在管理员用户(这里是cvs用户)的主目录里有一个 CVSROOT 目录,这个目录里有三个配置文件:passwd, readers, writers。我们可以通过设置这三个文件来配置 CVS 服务器,下面分别介绍这几个文件的作用:

passwdcvs 用户的用户列表文件,它的格式很象 shadow 文件:

{cvs 用户名}:[加密的口令]:[等效系统用户名]

如果你希望一个用户只是 cvs 用户,而不是系统用户,那么你就要设置这个文件,刚刚安装完之后这个文件可能不存在,你需要以cvs管理员身份(su cvs)用户手工创建,当然要按照上面格式;

第二个字段是该用户的加密口令,就是用 crypt (3) 加密的,你可以自己写一个程序来做加密,也可以用两个偷懒的方法:先创建一个系统用户,名字和 cvs 用户一样,口令就是准备给它的 cvs 用户口令,创建完之后从 /etc/shadow 把该用户第二个字段拷贝过来,然后 再把这个用户删除.这个方法对付数量少的用户比较方便,人一多就不合适了,而且还有冲突条件(race condition)的安全隐患,还要 root 权限,实在不怎么样,不过权益之计而已;另外一个方法就是利用apchehtpasswd命令创建passwd用户,添加用户只需要htpasswd passwd username即可添加用户到passwd文件中,不过需要在文件中对应行的最后添加一个“:”冒号和对应的等效系统用户名;最好的就是自己编写一个程序了来生成这个passwd文件了。

第三个字段就是等效系统用户名,实际上就是赋与一个 cvs 用户一个等效的系统用户的权限,看下面的例子你就明白它的功能了。

readers:有 cvs 读权限的用户列表文件,就是一个一维列表。在这个文件中的用户对 cvs

只有读权限。

writers:有 cvs 写权限的用户的列表文件,和 readers 一样,是一个一维列表。在这个文件中的用户对 cvs 有写权限。

上面三个文件在缺省安装的时候可能都不存在,需要我们自己创建,好吧,现在还是让我们用一个例子来教学吧.假设我们有下面几个用户需要使用 cvs

cvsuser1, cvsuser2, henry, betty, anonymous

其中 laser gumpwu 是系统用户,而henry, betty, anonymous 我们都不想给系统用户权限,并且 betty anonymous 都是只读用户,而且 anonymous 更是连口令都没有。

然后编辑 cvs 管理员家目录里 CVSROOT/passwd 文件,加入下面几行:

 

laser:$xxefajfka;faffa33:cvspub

gumpwu:$ajfaal;323r0ofeeanv:cvspub

henry:$fajkdpaieje:cvspub

betty:fjkal;ffjieinfn/:cvspub

anonymous::cvspub

注意:上面的第二个字段(分隔符为 :)是密文口令,你要用程序或者用我的土办法生成。

编辑 readers 文件,加入下面几行:

anonymous

betty

编辑 writer 文件,加入下面几行:

laser

gumpwu

henry

这样就 ok 了,你再用几个用户分别登陆测试,就会发现一切都 ok 了。这里面的原理和说明我想就不多说了,其实很简单,和系统管理用户的概念是一样的。

建立新的CVS项目

一般我们都已经有一个或多个项目了,这样我们可以用下面步骤生成一个新的CVS项目。

将一个工程文件置于CVs中进行版本控制,在CVS 术语中称作导入(import)。从名字上就可以看出,在导入前需要为此作些准备工作。

输入操作的基本要求是有个“干净”的目录结 构。“干净”的意思是不需要版本控制的文件都被移走了(如编译生成的文件,备份文件等等)。如果工程已经开始一段时间了,这就显得很重要。在目录中也许有 些是不打算将其置于版本控制下的文件,但是又想将他们放在这里,这种情况下,你要在输入之前将它们移走,然后再移回来。

注意的是CVS 认为空目录是不存在的。如果想增加一个既不包含文件又不包含子目录的目录,需要在其下创建一个哑文件。建议你创建一个名为 README.txt 的文件,其内容为对目录的简要说明。

进入到已有项目的目录,比如叫 cvstest

$cd  cvstest

运行命令将项目文件导入到cvs仓库中:

$cvs import -m "this is a cvstest project"  cvstest  v_0_0_1  start

说明:import cvs的命令之一,表示向cvs仓库输入项目文件.

    -m参数后面的字串是描述文本,对项目进行描述,如果不加 -m 参数,那么cvs会自动运行一个编辑器(一般是vi,但是可以通过修改环境变量EDITOR来改成你喜欢用的编辑器)让你输入信息,cvstest 是项目名称(实际上是仓库名,在CVS服务器上会存储在以这个名字命名的仓库里)

    v_0_0_1是这个分支的总标记.没啥用(或曰不常用)

    start 是每次 import 标识文件的输入层次的标记,没啥用。

这样我们就建立了一个CVS仓库了,然后,我们可以把这个测试项目的文件删除,试验如何从仓库获取文件这会在后面的客户端文章进行说明。

=====================================================
在CVS服务器端建立Repository

  首先要创建一个名为cvs的组和一个名为cvsroot的用户,以后要访问CVS服务的用户加入cvs这个组:

  [root@terry root]# groupadd cvs
  [root@terry root]# useradd -g cvs -s /sbin/nologin cvsroot
  [root@terry root]# chown -R cvsroot /home/cvsroot

  接下来进行初始化:

  [root@terry root]# cvs -d /home/cvsroot init

  这样在/home/cvsroot目录中就产生了CVSROOT目录,其中存放了一些配置文件,如config等,然后设置权限:

  [root@terry root]# chown -R cvsroot.cvs /home/cvsroot
  [root@terry root]# chmod -R ug+rwx /home/cvsroot
  [root@terry root]# chmod 644 /home/cvsroot/CVSROOT/config

  为了CVS系统的安全,我们要修改/home/cvsroot/CVSROOT/config文件,将"#SystemAuth =no"的前而的注释号#去掉,即改为“SystemAuth =no”,然后给开发者们逐一建立账号,新建的不要分配用户目录,因为它将作为一个虚拟用户帐号来使用,具体命令如:

  [root@terry root]# useradd -g cvs -M bogus
  [root@terry root]# passwd bogus

  上面的命令就创建了一个并没有Home目录的用户bogus,接着将系统的shadow文件复制到CVSROOT, 并重命名为passwd:

  [root@terry root]# cp /etc/shadow /home/cvsroot/CVSROOT/passwd
  [root@terry root]# chmod 0644 /home/cvsroot/CVSROOT/passwd

  然后修改passwd文件,将除刚才设定的可使用CVS的用户bogus之外的所有行删除,然后去掉每行第二个冒号以后的所有内容,并添上字符串cvsroot, 改为如下格式:

  bogus:ND5$J8N9BW5DKV.nPdxfdsh:cvsroot

  然后,删除掉刚刚在系统中添加的那个用户bogus:

  [root@terry root]# userdel -f bogus

  好了,做到这里,CVS的服务器端就已经安装设置好了,这样你的CVS用户就只能用passwd中规定的用户来登陆你的CVS服务器了,要注意 的是:本文介绍的添加用户的方法适用于小数量的用户,如果是有大规模的开发人员,推荐采用连接LDAP或者数据库来进行用户的认证服务。

======================================================

架设CVS服务器

我们将讨论如何利用OpenSSH作为远程访问手段来假设CVS服务器。 其他的访问手段,包括:pserver:和:server:不能用来对CVS仓库进行写访问。 :pserver:通过网络发送密码明文,而CVS的所有端口都不支持:server:。 在这节末尾介绍了如何用:pserver:对CVS进行匿名只读访问。

配置我们的CVS服务器包括以下四个步骤:

1. 创建仓库。

以root身份登录,用下面的命令创建一个新的CVS仓库:

mkdir /cvsroot &&
chmod 1777 /cvsroot &&
export CVSROOT=/cvsroot &&
cvs init

2. 将原代码导入仓库。

用CVS仓库本机上的用户账号执行下面的命令,将源码模块导入仓库:

export CVSROOT=/cvsroot &&
cd sourcedir &&
cvs import -m "repository test" cvstest vendortag releasetag

3. 检查仓库的本地访问权限。

用下面的命令测试对CVS仓库的访问,这里使用与第二步中相同的用户账号:


cvs co cvstest

4. 检查仓库的远程访问权限。

用下面的命令测试远程机器对CVS仓库的访问,这里使用能通过ssh访问CVS服务器的用户账号:

注: 用放置CVS仓库的机器的IP地址或主机名替换命令中的"servername"。 在CVS执行checkout之前会提示你输入用户shell账号的密码。

export CVS_RSH=/usr/bin/ssh &&
cvs -d:ext:servername:/cvsroot co cvstest

配置CVS以使用匿名只读访问。

用root登录并执行下面的命令可以设置CVS允许通过:pserver:进行匿名只读访问:

(grep anonymous /etc/passwd || useradd anonymous -s /bin/false) &&
echo anonymous: > /cvsroot/CVSROOT/passwd &&
echo anonymous > /cvsroot/CVSROOT/readers

如果你使用了inetd,下面的命令将在/etc/inetd.conf中添加pserver条目:

echo "2401  stream  tcp  nowait  root  /usr/bin/cvs cvs -f \
--allow-root=/cvsroot pserver" >> /etc/inetd.conf

执行killall -HUP inetd命令,重新读入修改后的inetd.conf文件。

如果你使用了xinetd,下面的命令将在/etc/xinetd.conf中添加pserver条目:

cat >> /etc/xinetd.conf << "EOF"
service cvspserver
{
port = 2401
socket_type = stream
protocol = tcp
wait = no
user = root
passenv = PATH
server = /usr/bin/cvs
server_args = -f --allow-root=/cvsroot pserver
}
EOF

执行killall -HUP xinetd命令,重新读入修改后的xinetd.conf文件。

要测试对新的仓库的匿名访问,需要一个能从另一台机器通过网络访问 CVS服务器的账号。我们不需要CVS仓库的账号。用非特权用户登录到另外一台机器并执行下面 的命令以完成对CVS仓库匿名访问的测试:

cvs -d:pserver:anonymous@servername:/cvsroot co cvstest

注: 用CVS服务器的IP地址或主机名替换命令中的"servername"。

命令解释

mkdir /cvsroot : 建立CVS仓库目录。

chmod 1777 /cvsroot : 为CVSROOT修改访问权限标志位。

export CVSROOT=/cvsroot : 为所有的cvs命令指定新的CVSROOT变量。

cvs init : 初始化新的CVS仓库。

cvs import -m "repository test" cvstest vendortag releasetag : 所有的源码模块在使用前必须用cvs import命令导入CVS仓库中。 标志-m为新的模块指定初始的描述。参数"cvstest"是此模块的名字,其他的cvs命令将用此名字来操作 该模块。参数"vendortag"和"releasetag"用于区分每一个CVS模块的不同版本。这两个是强制性使用的。

(grep anonymous /etc/passwd || useradd anonymous -s /bin/false) : 检查anonymous用户是否已存在,如果没有则创建该用户。

echo anonymous: > /cvsroot/CVSROOT/passwd : 将anonymous用户加入CVS的passwd文件。在配置过程中这个文件只有这里用到。

echo anonymous > /cvsroot/CVSROOT/readers : 将anonymous用户加入CVS的readers文件。 这个文件包含了对仓库拥有只读访问权限的用户列表。

作者:本站综合   更新日期:2005-10-04
来源:upsdn.net   浏览次数:

相关文章

相关评论   发表评论