突破传统: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.ltesting.net