1. 前言
最近在服务器上搭建支持git协议的版本库,遇到了些麻烦(主要是因为对linux系统不太熟悉导致),在此小做笔记,以供自己和他人参阅。
我的环境如下表所示,我通过另一台机器克隆版本库来验证:git clone git://192.168.1.101/path/to/repos/mygit.git mygit
linux服务器系统 | Ip地址 | 版本库路径 |
debian | 192.168.1.101 | /path/to/repos/mygit.git |
2. Git协议概要
Git协议是提供git版本库只读服务的常用协议(匿名读取),该协议的缺点就是不能提供身份认证,也真是因为写操作没有授权控制,因此一般不用来提供写操作。
对于提供公共的,非授权的只读访问,Git协议在性能和速度上远比HTTP协议高效,所以对于提供只读的版本库,我们常用git协议,而不用http协议。
3. Git协议部署
3.1. 部署原理
从原理上来讲,Git 协议的配置很简单。基本上,只要以守护进程的形式运行git-daemon服务软件即可,即以守护进程的形式运行以下参数(参数何意,后面会讲):
git daemon --inetd --verbose --export-all /path/to/repos |
以守护进程的形式运行该进程的方法有很多,我前后用过两种方式实现:inetd和xinetd,其实xinetd是inetd的升级版(大家用xinetd就好,我是抱着学习的态度才试着用inetd的),你可以到xinetd的官网看看它介绍就知道了:http://www.xinetd.org/,有关inetd和xinetd的细节不在本本文讨论范围内。
3.2. 部署inetd
inetd到底是什么东东,自己先问下“度娘”或者“谷歌”,要先有个简单的了解。也可以参考man inetd帮助文档(特别是学习完后再回过头来看更有效果)。
3.2.1. 安装
sudo aptitude install netkit-inetd |
发现可找到,但无论如何也安装不对。提示了一个信息要指定一个确定安装软件,有一个是openbsd-inetd。继续查找:netkit-inetd已经由openbsd-inetd所替代。于是安装openbsd-inetd:
sudo aptitude install openbsd-inetd |
注意:不同的linux系统,情况估计跟我的不一样。
安装成功后,先用以下命令看看inetd运行了没有:
ps ax |grep inetd |
先看看openbsd-inetd支持的参数有哪些,输入/etc/init.d/openbsd-inetd –help看帮助:
# /etc/init.d/openbsd-inetd --help Usage: /etc/init.d/openbsd-inetd {start|stop|reload|force-reload|restart|status} |
常用的命令:
/etc/init.d/openbsd-inetd start | 启动inetd |
/etc/init.d/openbsd-inetd stop | 停止inetd |
/etc/init.d/openbsd-inetd restart | 重启inetd |
/etc/init.d/openbsd-inetd reload | 修改了配置文件inetd.conf,可以通过该命令使配置立刻生效 |
3.2.2. 修改配置文件
注意:可以通过man inetd.conf来查看详细的参数说明。
在配置文件/etc/inetd.conf中添加如下设置:
git stream tcp nowait nobody /usr/lib/git-core/git git daemon --inetd --verbose --export-all /path/to/repos |
说明:
◇在配置文件中,以上只是一行
◇/usr/lib/git-core/git是我git程序所在位置,git daemon后面是运行git的参数。
◇默认git-daemon只对包含文件git-daemon-export-ok的版本库提供服务。使用--export-all后,无论版本库是否存在标识文件git-daemon-export-ok,都对版本库提供git访问服务。
◇其中/path/to/repos是我在linux服务器上git版本库的存放目录。
◇git daemon的参数很多,这里只列出了简单的用法,有兴趣的可以通过git daemon –help或者man inetd.conf帮助慢慢研究。
3.2.3. 使配置立刻生效
修改了配置文件后,可以通过/etc/init.d/openbsd-inetd restart或者/etc/init.d/openbsd-inetd reload来使配置马上生效。我这里介绍另一种方法。
git-daemon运行时,inetd会读取它的配置文件,默认为/etc/inetd.conf。如果修改了该配置文件,给inetd进程发一个SIGHUP信号,inetd在接收到SIGHUP挂起信号后会重新读取其配置文件。按如下步骤给inetd进程发送一个SIGHUP信号:
◇找出inetd进程的process number
ps ax | grep inetd 230 ?? Ss 0:00.01 inetd 20392 std S+ 0:00.01 grep inetd |
从上面可以看出,我这里的process number是'230'。
◇发送SIGHUP信号
sudo kill - SIGHUP 230 |
至此,你就可以通过git协议克隆版本库了。
3.3. 部署xinetd
既然xinetd是inetd的替代版,建议大家都使用xinetd,需要给你一个替代的理由?去官网看:http://www.xinetd.org/,你可以通过man xinetd来看下帮助手册。
3.3.1. 安装
sudo aptitude install xinetd |
或者去官网下载最新源码进行安装。安装成功后,你可以搜索下xinetd文件,发现可执行的文件有两个:/etc/init.d/xinetd和/usr/sbin/xinetd,其他的要么是文件夹要么没有可执行的权限。(注意:不同的linux系统可能路径不太一样)。
# find / -name xinetd –exec ls -idl {} \; 665609 -rwxr-xr-x 1 root root 2063 3月 27 2008 /etc/init.d/xinetd 665608 -rw-r--r-- 1 root root 316 3月 27 2008 /etc/default/xinetd 263351 -rwxr-xr-x 1 root root 133908 3月 27 2008 /usr/sbin/xinetd 269429 drwxr-xr-x 3 root root 4096 10月 24 11:01 /usr/share/doc/xinetd 3281001 -rw-r--r-- 1 root root 28 10月 24 11:01 /var/lib/update-rc.d/xinetd |
我一度没弄明白要用哪个路径下的xinetd来启动,好像两个都可以启动xinetd服务。后来才发现/usr/sbin/xinetd才是真正的执行程序,而/etc/init.d/xinetd文件是shell脚本(最终也是调用/usr/sbin/xinetd来执行)。
如果要看/usr/sbin/xinetd程序支持哪些参数,可以manxinetd查看帮助。如果要看/etc/init.d/xinetd脚本支持哪些参数,可以/etc/init.d/xinetd –help查看。是不是有点乱,不要搞混了,你可以打开/etc/init.d/xinetd脚本文件看看里面的内容应该就明白了。
可以通过以下命令查看下xinetd有没有有运行:
ps ax | grep xinetd |
如果没有运行,可以通过以下命令来启动xinetd:
/etc/init.d/xinetd start | 启动xinetd |
/etc/init.d/xinetd stop | 停止xinetd |
/etc/init.d/xinetd restart | 重启xinetd |
另外,如果你想看xinetd运行过程中的log信息(如果你配置文件写错了,从log中就能发现错误,有助于排查问题),可以用以下命令,其中/xinetdlog.txt就是log文件。
/usr/sbin/xinetd -filelog /xinetdlog.txt |
3.3.2. 修改配置文件
注意:可以通过man xinetd.conf来查看详细的参数说明。
成功安装后,可以看到/etc/xinetd.conf配置文件,这跟inetd不同,你不能在这里直接修改,你需要在/etc/xinetd.d/目录下创建一个git-daemon文件,文件内容如下:
# default: off # description: The git server offers access to git repositories service git { disable = no type = UNLISTED port = 9418 socket_type = stream wait = no user = nobody server = /usr/local/bin/git server_args = daemon --inetd --verbose --export-all /path/to/repos log_on_failure += USERID } |
3.3.3. 使配置立刻生效
在/etc/xinetd.d/目录里新加/修改配置文件,重启xinetd即可生效:
/etc/rc.d/init.d/xinetd restart |
4. 提供简短的URL地址
我们上面使用的URL是git://192.168.1.101/path/to/repos/mygit.git,如果版本库的路径比较深,有什么办法能在用户访问时提供短一些的URL地址呢?可以为git daemon使用--base-path参数建立版本库根目录映射,如inetd.conf配置文件写成这样:
git stream tcp nowait nobody /usr/lib/git-core/git git daemon --inetd --verbose --export-all --base-path=/path/to/repos /path/to/repos |
那么我们就可以用git://192.168.1.101/mygit.git来访问版本库。
5. 其他
Git协议的默认端口是9418,通过以下命令可以验证,当然你也可以不用默认端口。
# grep 9418 /etc/services git 9418/tcp # git pack transfer service git 9418/udp # git pack transfer service |