把路由器改裝成git服務器(OpenWRT環境的GIT服務器搭建)



在單位中,通常都標配了git服務器用來管理代碼。
對於家庭或者小辦公室,這種方式有點不經濟。當然如果是開源項目就簡單了,剛剛被微軟收購的github是理想選擇。但如果沒有打算開源,我今天的話題可能對你有用。
我就屬於喜歡在家中干活的那一類,以前常年開着一台電腦做下載,最近改了這個壞習慣。但是沒有了長期開機的設備,也就沒有了git server。
趁着周末,把一台老的路由器改了改,當成git server來用,感覺效果爆棚,不能不安利給大家。

硬件

  • 一台能夠安裝OpenWRT(或者Linux系統的)路由器,我用的是一台老設備,Netgear WND3700V1。
  • 視你日常工作量大小,准備一個空間足夠的U盤,最好是高速的,當然這個高速是指能匹配路由器USB口的標准就足夠。

系統軟件

成文時,OpenWRT的版本是18.06.0,其它版本應當也可以,OpenWRT挺早就支持git軟件包了。下載地址在:http://downloads.openwrt.org/。也可能是我的問題,但至少看起來,這樣一個純技術網站,不翻牆已經下載不到了。
因為各家路由設備的硬件復雜性,雖然都是同樣的OpenWRT,不同的路由器仍然要下載自己硬件對應的版本。如果之前沒有安裝過OpenWRT的話,建議你在https://openwrt.org/toh/views/toh_fwdownload查詢OpenWRT支持的設備列表,確認自己應當使用的版本。
OpenWRT的安裝這里不講,請參考官方相關文檔。通常都是在自己路由器的管理界面使用軟件更新功能,選擇下載的固件文件,上傳隨后升級。
接着請根據自己家里網絡的情況,配置上網設置各項目,保證基本路由功能工作正常。

管理路由器

OpenWRT18.06.0的默認管理方式是使用ssh,方法:ssh root@[IP地址]。根據路由器的FLASH大小,比較小的FLASH是默認沒有WEB GUI界面的,比如我用的這台。所幸大多情況下使用命令行配置路由器效率更高,而且有些工作是使用GUI界面做不到的。
OpenWRT的默認賬戶用戶名是root,沒有密碼,正常情況下第一次登陸會要求你修改密碼。在一個連接公網的環境中,請盡早登陸修改密碼。

配置鏡像源

如果你不用翻牆就能訪問官方的源服務器的話,請跳過這一節內容。

OpenWRT使用opkg工具來管理擴展包。因為前面所說的原因,需要配置使用鏡像源來保證所需軟件包的安裝。
中間碰到一個小麻煩是國外的鏡像服務器,基本都使用了https協議,OpenWRT不能直接支持。國內的鏡像大多倒是http協議,但鏡像中又缺乏一些驅動包,無法驅動U盤。
所以如果找不到更好的完整源的話,只好把變更源這樣一件小事分成兩步來做。
opkg的源配置文件路徑為:/etc/opkg/distfeeds.conf,首先做一個備份,然后你可以使用你喜歡的編輯工具修改,我通常都是vi。
把distfeeds.conf文件的內容修改為:

src/gz openwrt_core http://openwrt.proxy.ustclug.org/releases/18.06.0/targets/ar71xx/generic/packages
src/gz openwrt_kmods https://downloads.lede-project.urown.net/snapshots/targets/ar71xx/generic/kmods/4.9.117-1-e017c397f3c6ba06dc921b136a63fb36
src/gz openwrt_base http://openwrt.proxy.ustclug.org/releases/18.06.0/packages/mips_24kc/base
src/gz openwrt_luci http://openwrt.proxy.ustclug.org/releases/18.06.0/packages/mips_24kc/luci
src/gz openwrt_packages http://openwrt.proxy.ustclug.org/releases/18.06.0/packages/mips_24kc/packages
src/gz openwrt_routing http://openwrt.proxy.ustclug.org/releases/18.06.0/packages/mips_24kc/routing
src/gz openwrt_telephony http://openwrt.proxy.ustclug.org/releases/18.06.0/packages/mips_24kc/telephony

這里面使用了兩個源,分別是:http://openwrt.proxy.ustclug.org和https😕/downloads.lede-project.urown.net。
接着在OpenWRT命令使用opkg update命令,只要網絡沒有問題,可以完成源目錄包的更新,當然在https的那個源會報錯,先不用管。

通常的情況下,每次進行包安裝工作之前進行一次opkg update就夠了,這是下載軟件源中的所有目錄索引到本地。路由器關機、或者雲端的源內容發生了變化才需要重新執行。

隨后安裝https協議所需的軟件包:

opkg install libustream-openssl  ca-bundle ca-certificates 

接着再做一次opkg update,這一次,應當所有的源都可以拿到目錄包了。
如果你有更好的http源,配置https訪問這一步可以省略。

至此,opkg包管理工具算配置完成。喜歡使用GUI界面的話,這時候可以使用下面命令安裝:

opkg update
opkg install luci

安裝U盤並設置自動加載

如果只是當做私有雲盤使用,U盤的格式可以隨意。但如果打算用作git倉庫以及用以彌補路由器可憐的FLASH存儲,則必須使用Linux專有格式,比如EXT4。所以准備用在路由器上的U盤你要提前做好備份,因為后面的安裝會重新格式化U盤。
首先是安裝加載U盤所需的各項驅動和相關支持工具:

#假設你已經做過opkg udpate
opkg install block-mount e2fsprogs kmod-fs-ext4 kmod-usb3 kmod-usb2 kmod-usb-storage 

隨后使用ext4格式,重新初始化U盤:

#注意這一步會清掉U盤上現有的所有內容
mkfs.ext4 /dev/sda1

接着將U盤設置為路由器啟動后自動加載:

block detect > /etc/config/fstab 
uci set fstab.@mount[0].enabled='1' && uci set fstab.@global[0].check_fs='1' && uci commit 
/sbin/block mount && service fstab enable

這時候可以使用mount命令檢查一下U盤是否加載成功(不需要重啟),如果輸出信息中,通常是在最后一行,如果有類似下面信息表示U盤加載成功了:

/dev/sda1 on /mnt/sda1 type ext4 (rw,relatime,data=ordered)

在我實驗的時候,有一個U盤無論如何無法自動加載成功,猜測同U盤型號或者具體硬件及OpenWRT版本的支持有關系。就不去深究原因了,碰到這種情況可以使用啟動腳本的方式解決,首先執行一次mkdir /mnt/sda1,然后在/etc/rc.local文件最后一行增加:

mount /dev/sda1 /mnt/sda1

以后重啟將會自動加載U盤。

安裝git工具包

這一步對於新款路由器實在不是事兒,使用opkg一條命令就搞定:

opkg install git

對於我這款老路由器來講是個大麻煩,因為這款WND3700這款路由器只有4M的FLASH,相當於硬盤的存儲空間。而git軟件包壓縮之后是4.3M,完全盛不下。
這時候剛才安裝的EXT4格式的U盤就起作用了,我使用手工安裝的方式把git安裝到U盤上,這樣多大的軟件包都不算問題了。
首先下載git軟件包:

cd /mnt/sda1/
wget http://openwrt.proxy.ustclug.org/releases/18.06.0/packages/mips_24kc/packages/git_2.16.3-1_mips_24kc.ipk

注意下載路徑是跟你所使用的路由器版本有關的,比如上面的下載地址表示OpernWRT18.06.0版本,跑在mips_24kc的芯片上。根據這些信息,你要尋找自己路由器可用的軟件包,平常這件事情是由opkg幫你做的。
下載完成后,手工解壓取出文件:

tar xzvf git_2.16.3-1_mips_24kc.ipk
#上面的解壓完成通常會出來3個文件,我們只使用其中的data.tar.gz文件。
mkdir ipks
cd ipks
tar xzvf ../data.tar.gz
cd ..
# 刪除3個解壓出的臨時文件
rm control.tar.gz data.tar.gz  debian-binary

所有的文件都保存在/mnt/sda1/ipks/usr路徑下,我們還需要手工完成安裝,才能夠運行:

ln -s /mnt/sda1/ipks/usr/bin/git /usr/bin/
ln -s /mnt/sda1/ipks/usr/bin/git-receive-pack /usr/bin/
ln -s /mnt/sda1/ipks/usr/bin/git-upload-archive /usr/bin/
ln -s /mnt/sda1/ipks/usr/bin/git-shell /usr/bin/
ln -s /mnt/sda1/ipks/usr/bin/git-upload-pack /usr/bin/
ln -s /mnt/sda1/ipks/usr/lib/git-core/ /usr/lib/
ln -s /mnt/sda1/ipks/usr/share/git-core/ /usr/share/

此時git已經可以使用了。接下來我們建立工作目錄:

mkdir /mnt/sda1/prjs
ln -s /mnt/sda1/prjs/ /

/prjs目錄是我們的主要存儲目錄。因為路由器只有一個root賬號,也就不用考慮額外的權限問題。
今后所有的git倉庫,都可以在/prjs路徑下另外建目錄來保存。我們來建立一個測試倉庫來驗證工作是否正常:

mkdir /prjs/test
cd /prjs/test
git init --bare

好了,至此路由器上的所有准備都已經完成。今后增加新的git倉庫,使用新的倉庫名稱,重復上面最后一個建立test倉庫的操作就可以。

測試路由器上的git倉庫

回到我們的工作電腦上,隨意建立一個工作目錄,測試路由器上的git倉庫是否工作正常,下面假設我們路由器的IP地址為192.168.1.1,請修改成自己路由器的正確地址。

mkdir testgit
cd testgit
git init .
echo "test information" > abc.txt
echo "測試信息" > abc1.txt
git add .
git commit -m "something new"
git remote add origin root@192.168.1.1:/prjs/test/
git push --set-upstream origin master

最后的git push執行后,需要輸入路由器root賬號密碼,隨后如果顯示類似下面信息,就表示成功了:

Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 231 bytes | 231.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To root@192.168.1.1:/prjs/test/
   570db28..5ab2627  master -> master

自動驗證

如果不希望每次git push都輸入路由器密碼,可以把自己電腦的公鑰存儲到路由器備案,以后就不需要輸入密碼了,首先拷貝公鑰到路由器:

scp ~/.ssh/id_rsa.pub root@192.168.1.1:~/

接着在路由器上執行:

cat id_rsa.pub >> /etc/dropbear/authorized_keys

可以使用ssh來測試是否生效,ssh root@192.168.1.1之后,如果不再要求輸入密碼直接登錄了路由器,表示自動驗證生效了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM