在ubuntu上运行ctorrent 进行p2p文件分享

前言

当有大的文件在一定时间内需要传输到很多接收端时, 采用ftp的中心化传输并不是明智的方案,比较高效的方法是采用p2p的分享模式。图形界面的程序需要人手工操作,若是命令行程序则灵活得多,可以自动化处理一些任务。若是在Linux系统下,支持命令行的p2p客户端不多,ctorrent是其中一个。
由此引出了如下的DIY操作步骤。

0. 编译源码

0.1 源码直接下载并编译

wget http://www.rahul.net/dholmes/ctorrent/ctorrent-dnh3.3.2.tar.gz

tar -zxvf ctorrent-dnh3.3.2.tar.gz

0.2 ubuntu 下下载源码并制作安装包

  1. 增加源代码的源
    /etc/apt/sources.list中添加了deb-src
  2. 查看是否有源码
    sudo apt-cache showsrc ctorrent
  3. 下载源码
    sudo apt-get source ctorrent
  4. 下载依赖
    sudo apt-get build-dep ctorrent
  5. 进入源码目录 cd ctorrent-1.3.4.dnh3.3.2
  6. 修改源码
  7. 提交源码修改
    dpkg-source --commit
  8. 编译更新的代码
    sudo dpkg-buildpackage
  9. 回到父目录
    cd ..
  10. 安装 sudo dpkg -i ctorrent_1.3.4.dnh3.3.2-4_amd64.deb

0.3 源码中的torrent大小限制修改.

vi btconfig.h 修改meta文件大小限制以便支持超大文件传输.

#define MAX_METAINFO_FILESIZ    (48*1024*1024)
slice 
piece length

0.4 可以从此下载

wget http://39.106.122.67/ctorrent-1.3.4.dnh3.3.2.largefile.tgz
wget http://39.106.122.67/ctorrent_1.3.4.dnh3.3.2-4_amd64.deb

1. 环境准备

1.1 系统环境

服务器或者客户端都可以设置为 ubuntu 16.04 ,方便快速安装。

sudo apt install cvs git
sudo apt install sshpass
sudo apt-get install zlib1g-dev
sudo apt-get install nethogs

1.2 防火墙的设置

如果Tracker服务器是在内网,那么需要在路由器或者防火墙上提供公网ip到内网ip的映射,并且添加对外提供服务的端口:

service port
tracker: 80, 6969
ctorrent: 2706 -- 2106
ctorrent control server: 2780
ssh: 22

需要确保运行相应程序的服务器上的端口没有被占用,或者不冲突。

为了排查问题可以清理防火墙策略

iptables -F

1.3 搭建Tracker索引服务器

下载OpenTracker依赖库及源码,编译。

cvs -d :pserver:cvs@cvs.fefe.de:/cvs -z9 co libowfat
cd libowfat
make
cd ..
# LEGACY: cvs -d:pserver:anoncvs@cvs.erdgeist.org:/home/cvsroot co opentracker
git clone git://erdgeist.org/opentracker
cd opentracker
make

1.3.1 Tracker服务器具有内网ip

执行, 同时通过80,6969对外提供服务

./opentracker  -i 172.16.252.249 -p 6969 -P 6969

或者不指定ip

./opentracker  -p 6969 -P 6969

其中 172.16.252.249 是内网ip,
对外公开的tracker地址则替换为外网ip
如果对外的外网ip是 39.106.199.67那么announce地址为:

任选其一即可:

http://39.106.199.67:6969/announce
udp://39.106.199.67:6969/announce

1.3.2 Tracker服务器本身有公网IP

无需做防火墙或者路由器上的映射,直接运行即可。若有防火墙,只开放对外服务的端口即可。

1.4 安装 CTorrent Control Server

wget http://www.rahul.net/dholmes/ctorrent/ctcs-1.4.1.tar.gz
tar -zxvf ctcs-1.4.1.tar.gz

1.5 加入服务器启动项

可以编辑 /etc/rc.local
加入
以便每次启动后自动运行

/dir_where_install/opentracker  -p 6969 -P 6969

#download & upload limit 100Mbps
/dir_where_install/ctcs  -d 12500 -u 12500

2. 运行ctorrent 制作种子与文件分享

2.1 文件分享端制作种子提供下载

可以使用官方的包安装,也可以使用前面提供的网址。

sudo apt install ctorrent

在需要分享种子并且对外提供下载的客户端上,可以执行如下命令:

ctorrent -t -u "http://39.106.199.67:6969/announce"  -s file15G.dat.torrent file15G.dat 

2.2 文件下载端下载种子并下载

ctorrent  file15G.dat.torrent

3. 运行流程与测试脚本

3.0 整个过程:

  1. 在具有公网IP的服务器上运行tracker server
  2. 运行CTorrent Control Server
  3. 生成或者得到原始文件.
  4. 在具有原始文件的服务器上制作种子文件并进行scp或者web分发
  5. 在接收文件的客户端运行ctorrent,具有原始文件的服务器上运行ctorrent

备注:

  • 为了方便关闭ssh终端,可以后台运行脚本

3.1 Server Tracker运行

nohup ./opentracker  -i 172.16.252.249 -p 6969 -P 6969 &

访问
http://39.106.199.67:6969/stats
进行验证

或者运行lsof -i
查看是否有6969端口监听

opentrack 21947 nobody    3u  IPv4  9350721      0t0  TCP 172.16.252.249:6969 (LISTEN)
opentrack 21947 nobody    5u  IPv4  9350722      0t0  UDP 172.16.252.249:6969 

3.2 运行CTorrent Control Server

cd ctcs-1.4.1
nohup ./ctcs > /dev/null &

访问
http://124.193.192.168:2780/
进行验证

3.3 构造测试用文件

cat makefile.sh

#!/bin/bash

# This script create a xM or xG file by parameter
# which added a 1M random head

if [ ! $# == 1 ]; then
  echo "Usage: $0 filesize "
  echo "          filesize example: 100M, 10G "
  exit 1
fi

size=$1
fn=file${size}.dat
## add random head
dd if=/dev/urandom of=$fn count=1024 bs=1024
truncate -s +$size $fn
./makefile.sh  150G

3.4 制作种子并分发到接收端

注意: 使用sshpass之前需要先建立两个主机之间的公私钥存储.避免运行后没有反应。 可以直接手工ssh 链接,回答yes存储即可。

cat seedp2p.sh

if [ ! $# == 1 ]; then
  echo "Usage: $0 filename/dirname "
  echo "      if dirname, please copy to current dirtory."
  exit 1
fi

fn=$1
#md5sum $fn > $fn.md5

# make seed.
rm -f $fn.torrent
ctorrent -t -u "http://39.106.199.67:6969/announce"  -s $fn.torrent $fn

# transfer seed to all clients.

## server passowd
server=10.1.36.100
user=root
passwd=XXX
storedir=/data

sshpass -p $passwd  scp $fn.torrent $user@$server:/data/
sshpass -p $passwd  scp $fn.md5 $user@$server:/data/

# after clean file , reomte to call daemon to p2p file transfer, when finished, all client will exit without seeding with -e0 parameter.
sshpass -p $passwd ssh $user@$server "cd $storedir; rm -rf $fn; ctorrent -d -e0 $fn.torrent"

# start p2p transfer in daemon
ctorrent -d -U 100000  -S localhost:2780  $fn.torrent

举例:

#filename
./seedp2p.sh file150G.dat

# dirname
cp /home/test .
./seedp2p.sh test

3.5 查看最后文件校验结果

可以用md5sum 或者 sha256 校验
或者  
ctorrent -c xx.torrent

References

CTorrent: Command-line Based Simple BitTorrent Client for Ubuntu Linux
https://www.hecticgeek.com/2012/02/command-line-bittorrent-ubuntu-linux/

OpenTracker:
http://erdgeist.org/arts/software/opentracker/

CTorrent
https://sourceforge.net/projects/ctorrent/

Enhanced CTorrent
http://www.rahul.net/dholmes/ctorrent/
https://sourceforge.net/projects/dtorrent/files/

在linux下安装ctorrent & Enhanced CTorrent下载种子文件
https://blog.phpgao.com/ctorrent.html

Thread: BitTorrent optimization and troubleshooting guide
https://ubuntuforums.org/showthread.php?t=1259923

https://torrentfreak.com/how-to-make-the-best-torrents-081121/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容