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

發表于:2007-05-26來源:作者:點擊數: 標簽:
傳統的文件下載服務都是基于客戶機/ 服務器 模型,被下載的文件放在服務器上,用戶登錄服務器,將該文件下載到本地。在文件下載的過程中,被傳輸文件的來源和目的端并不對等,服務器只是單向地將文件傳送給客戶端。 這種傳統軟件下載模式的缺點是顯而易見的
傳統的文件下載服務都是基于客戶機/服務器模型,被下載的文件放在服務器上,用戶登錄服務器,將該文件下載到本地。在文件下載的過程中,被傳輸文件的來源和目的端并不對等,服務器只是單向地將文件傳送給客戶端。

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

隨著互聯網技術的不斷發展,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 =<>;chop($Input);
            if ($Input eq ""){print "Error:NO INPUT \n";exit 0;}
            ##########################
            `clear`;
            $path="$basedir$user[$Input-1]";
            @mulu=`ls $path |grep -v .tgz`;
            print $line;
            foreach(@mulu){$mulu_count++;chop($_);  print"$mulu_count. $_\n";}
            print $line;
            print"select path number(5):";
            $Input =<>;chop($Input);
            if ($Input eq ""){print "Error:NO INPUT \n";exit 0;}
            $dir="$path/$mulu[$Input-1]";
            ##########################
            @a=`ls $dir|grep -v torrent`;
            $total=$#a+1;
            print $line;
            print"total:$total\n"if(@a ne "");
            print $line;
            foreach(@a){
            $count++;print"$count-";
            chop($_);
            if(-d "$dir/$_"){print"DIR :"}else{print"FILE:"}
            print"$_\n";
            print"   doing...";
            if(-e "$seeddir/$_.torrent"){$b="exsit...";}
            else{$b=`$command "$dir/$_"  $announce`;}
            print"$b ok\n";
            if($b ne"exsit..."){
            print"   linking...";
            `ln -s  "$dir/$_" "$seeddir/$_"`;
            print" ok\n";
            }
            }
            print $line;
            #########################
            print"zip to download path...($path/$mulu[$Input-1].tgz)\n";
            $x="$path/$mulu[$Input-1].tgz";
            if(-e "$x"){print"Error! zip is exsit\n";}
            else{`tar czf $x $dir/*.torrent`;}
            $x="/root/$mulu[$Input-1].tgz";
            if(-e "$x"){print"Error! root'zip is exsit\n";}
            else{`tar czf $x $dir/*.torrent`;}
            print"ok\n";
            print"Moving to seed path...(seed is moved)";
            `mv $dir/*.torrent $seeddir`;
            print"ok\n";
            print"End\n";

應用中可以根據實際情況修改該腳本,以符合服務器的目錄設置。

4.啟動多個“種子

作為管理員,目標可能是共享更多的文件給用戶下載,如果對于每個“種子”都要啟動一個Downloader,不但非常煩瑣,可能還會大大影響服務器效率。

為了解決這個問題,BitTorrent提供了另外兩個Downloader程序—btlaunchmany.py和btlaunchmanycurses.py。這兩個程序會定時檢查指定目錄,對其中的所有“種子”啟動Downloader,并根據目錄內容增加和刪除Downloader。btlaunchmanycurses.py是一個圖形控制臺界面,而btlaunchmany.py則更適合于后臺運行程序。

BT資源

互聯網上有很多BT“種子”收集網站,例如:

◆ 滿分BT http://www.manfen.net/forum/btsubsystem.php

◆ BT中國 http://bt86.com/

這些網站都只是“種子”管理平臺,用于為用戶提供基于Web的“種子”訪問。

互聯網上還有很多類似的開放源代碼工具,如BTAdmin。需要的用戶可以從lixiang.cn/lixiang/btadmin.tar.gz下載,并根據自己的需要對PHP代碼進行修改。

BTAdmin使用了MySQL數據庫,其中需要修改配置的地方包括兩個文件:include目錄下的secret.php,該文件是數據庫鏈接配置;include/bittorent.php文件,需要修改該文件中上載種子的存放目錄。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97