1. 程式人生 > >突破傳統:Linux下如何架設BT伺服器

突破傳統:Linux下如何架設BT伺服器

傳統的檔案下載服務都是基於客戶機/伺服器模型,被下載的檔案放在伺服器上,使用者登入伺服器,將該檔案下載到本地。在檔案下載的過程中,被傳輸檔案的來源和目的端並不對等,伺服器只是單向地將檔案傳送給客戶端。

        這種傳統軟體下載模式的缺點是顯而易見的,整個系統的瓶頸位於伺服器。由於受到伺服器處理能力、網際網路接入鏈路頻寬等多種環境的制約,當下載量非常大時,伺服器往往不堪重負。而使用者下載完畢後就和伺服器沒有任何聯絡,其它使用者也無法從以前使用者下載的版本得到任何幫助。

隨著網際網路技術的不斷髮展,P2P(Peer To Peer,點到點)技術逐漸成為檔案交換和下載的成熟技術。P2P技術將網際網路“自由、平等、互助、共享”的精神發揚光大。

最早的P2P技術是音樂交換軟體Napster,目前最流行的P2P檔案交換技術則是BT(BitTorrent,位元流)。越來越多的人使用BT共享和 下載軟體,網際網路上提供“種子”的網站及BT客戶端軟體隨處可見,但是網際網路上有關架設BT伺服器的文章大多針對Windows平臺,而且往往沒有涉及 BT原理,這使得希望使用Unix/Linux平臺架設BT伺服器,並提供“種子”下載的管理員們無從下手。本文從應用者角度討論BT原理,並詳細說明如 何在Unix/Linux平臺下架設一臺BT伺服器,並提供“種子”下載服務。

BT原理

BT是BitTorrent(位元流)的簡稱,BT的特點是使用者下載的同時,也在為其它使用者提供上傳,所以不會像FTP伺服器那樣隨著使用者數的增加而導致下載速度降低。恰恰相反,對於BT下載而言,下載的人越多速度越快。



傳統的檔案共享服務,如FTP、HTTP等工作原理如圖1所示。這種方式隨著使用者數的增多,對頻寬的要求也隨之增多,使用者過多就會造成瓶頸,所以很多下載網站都有併發使用者數的限制及下載速度的限制等。

而BT下載採用一種共享的方式來傳輸檔案,其工作原理如圖2所示。



BT下載首先在第一個共享端(或稱為Downloader)把一個檔案分成N個部分,A使用者可以從Downloader上隨機下載第M個部分,B使用者可以 在Downloader伺服器隨機下載第K個部分。而A使用者的BT客戶端下載程式會根據情況從B使用者下載第K個部分,同樣的,B使用者也可以從A使用者下載第 M個部分,通過這種方式減輕伺服器端負荷,加快使用者的下載速度。

例如,C使用者直接從伺服器下載,速度可能只有幾Kbps,而從A、B使用者處下載,速度將快很多。使用者在下載的同時,也在上傳檔案,在享受別人提供下載服務 的同時,每個使用者也同時在上載並貢獻自己的頻寬,所以造成使用BT下載服務的人越多,大家的速度就越快。BT下載的優越性就在這裡體現。

從構建BT伺服器的角度來看,整個BT系統由四個部分組成。

1.BT客戶端

BT客戶端是安裝在使用者PC機上的客戶端軟體,目前有很多BT客戶端可用,這裡推薦BitComet(http://www.bitcomet.com/index-zh.htm)。它是一個類似FlashGet介面的BT下載客戶端軟體,簡潔易用。

BitComet在下載的同時,還負責將下載的內容共享給其它使用者,這個過程完全不需要使用者參與。如果不知道如何使用BT客戶端下載,那麼安裝BitComet後去訪問BT中國網站,試一試就知道如何使用了。

2.BT“種子”檔案

BT“種子”檔案是一個名為.torrent的檔案,它是由第一個釋出共享檔案者根據原始檔製作出來的原始檔的指紋資訊。“種子”檔案很小,一般在幾十 KB到幾百KB之間,其中包含檔案所在的BT端地址資訊及目標檔案的校驗碼。當BT使用者獲得“種子”後,直接在BT客戶端軟體中執行“種子”檔案,BT軟 件將根據“種子”檔案包含的資訊,自動查詢到該檔案所有可用的下載源,並進行下載。

3.Tracker

使用BT服務不需要指定伺服器,雖然在BT服務裡面仍然有伺服器的概念,但使用BT服務的人並不需要關心伺服器在哪裡。BT伺服器稱為Tracker,準 確地說,Tracker是指運行於伺服器上的一個程式,這個程式能夠追蹤到底有多少人同時在下載同一個檔案。BT客戶端連線上Tracker伺服器,就會 獲得一個下載人員的名單,根據這個名單,BT客戶端會自動連線網路中其它節點進行下載。

4.種子

BT服務把提供完整檔案的使用者節點稱為“種子”(Seed),正在下載的使用者稱為客戶(Client)。某一個檔案現在有多少“種子”、多少“客戶”是可以看到的。只要有一個“種子”就可以放心地下載。當然,種子越多、客戶越多的檔案下載的速度會越快。

如果發現“種子”數為0,那麼就不需要去嘗試了。當某個使用者下載完成後,如沒有選擇關閉,其它人就可以從該使用者處繼續下載檔案。所以當下載的人多起來,通常做“種子”的人也會隨之增加,下載速度也會加快。

安裝手記



1.下載BT

BitTorrent是一個開源免費軟體,它使用Python語言編寫。Python是一種指令碼語言,這意味著BitTorrent具有出色的跨平臺特 性。使用者不僅可以在Windows中使用BT,也可以方便地在Linux/Unix平臺下使用。BitTorrent的官方網站地址為http: //sourceforge.net/projects/bittorrent/,當前最新版本為3.4.2。

2.安裝BT

在安裝BitTorrent以前,首先要確保系統已經安裝有Python版本:

# rpm -qa|grep python
python-2.2.2-26

若系統沒有安裝Python,則需要從rpmfind.net下載Python,並加以安裝。下載得到BitTorrent-3.4.2.tar.gz以後,將其解壓縮:

# tar xvfz BitTorrent-3.4.2.tar.gz

然後安裝BitTorrent:

# python setup.py install

安裝完畢以後,BitTorrent軟體包的命令工具均安裝在/usr/loca/bin目錄下。

3.配置、啟動BT

前面提到,BT系統的核心是Tracker,因此架設一臺BT伺服器的第一步就是要啟動一個Tracker:

# /usr/local/bin/ bttrack.py --port 6969 --dfile dstate >/dev/null 2>&1 &

這樣便在後臺啟動了一個Tracker供自己使用。

第二步,需要對希望提供下載的檔案製作“種子”,這裡假設對檔案/btdata/dahuaxiyou.avi製作“種子”:

# btmakemetafile.py /btdata/dahuaxiyou.avi http://www.mydomain.com:6969/announce

該命令對/btdata/dahuaxiyou.avi檔案製作“種子”,“種子”名為 dahuaxiyou.avi.torrent,其中www.mydomain.com是Linux伺服器的域名。而btmakemetafile.py 也可以對目錄製作“種子”,命令與對檔案製作“種子”完全一樣。

第三步,需要配置Web伺服器,將.torrent檔案和application/x-bittorrent相關聯。編輯Apache的配置檔案httpd.conf,新增如下內容:

AddType application/x-bittorrent .torrent

然後重新啟動Web伺服器,並將剛剛製作的“種子”放置在Web伺服器的文件目錄中,讓使用者可以訪問。

最後一步,啟動一個Downloader(最原始的共享源),使以後的使用者可以獲得最初的拷貝:

# btdownloadheadless.py --url http://
www.mydomain.com/dahuaxiyou.avi.torrent --saveas dahuaxiyou.avi

其中http: //www.mydomain.com/dahuaxiyou.avi.torrent為製作“種子”的URL地址。這樣,使用者通過Web訪問 dahuaxiyou.avi.torrent就能實現Web下載檔案。但需要注意,提供使用者訪問的“種子” dahuaxiyou.avi.torrent應該跟原始檔案存放在同一個目錄下,也就是http: //www.mydomain.com/dahuaxiyou.avi.torrent所在目錄應該存有原始檔案或到原始檔案的連結,否則 Downloader會自動拷貝一份原始檔到“種子”所在目錄下。

為了簡化“種子”製作,筆者編寫了一個Perl指令碼,以實現“種子”製作的自動化。指令碼檔案如下:

$basedir="/data2/btftp/";
$seeddir="/data2/btseed";
$downdir="/usr/local/www/data-dist/btmanage/";
$command="/usr/local/bin/btmakemetafile.py";
$announce="http://bt1.beareyes.com.cn:6969/announce";
$line="------------------------------/n";
$|=1;
##########################
`clear`;
@user=`ls $basedir`;
print $line;
foreach(@user){$user_count++;chop($_); print"$user_count. $_/n";}
print $line;
print"select user number(1):";
$Input =<>;chope="font-size:9pt">
myfile=/usr/meng/ff/m1.c

注意,在賦值語句中,賦值號“=”的兩邊沒有空格,否則在執行時會引起錯誤。

變數的值可以改變,只須利用賦值語句重新給它賦值即可。一個未明確賦過值的變數僅含一個空字串。

在程式中使用變數的值時,要在變數名前面加上一個符號“$”。例如,

$ dir=/usr/meng/ff
$ echo $dir
/usr/meng/ff ←——— 顯示結果
$ echo dir
dir ←——— 顯示結果

如果在賦給變數的值中要含有空格、製表符或換行符,那麼,就應該用雙引號把這個字串括起來。例如,

names="Zhangsan  Lisi  Wangwu"

可以將一個命令的執行結果賦值給變數。有兩種形式的命令替換:一種是使用倒引號引用命令,其一般形式是: `命令表`。

例如:將當前工作目錄的全路徑名存放到變數dir中,輸入以下命令列:

$ dir=`pwd`

另一種形式是:$(命令表)。上面的命令列也可以改寫為:

$ dir=$(pwd)