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到底是什麼東東,自己先問下“度娘”或者“Google”,要先有個簡單的瞭解。也可以參考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運行了沒有:
先看看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訊號
至此,你就可以通過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有沒有有運行:
如果沒有運行,可以通過以下命令來啟動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 |