DDR爱好者之家 Design By 杰米

本人家里有好几台运行Debian GNU/Linux testing的计算机,共处于一个小局域网内。因为Debian testing是滚动更新的,所以我每隔几天就要把它们全部更新一遍。但是一来中国家庭的网速还是说不上很快,每台机器都要从上游软件源的服务器上下载成百上千兆字节的软件包要花不少时间;二来这样操作也给软件源的服务器造成不小的负担。
apt-p2p,顾名思义,就是用户与用户之间直接进行 deb 软件包的传递。

后来我想起Debian曾开发过一个叫apt-p2p的软件,它的设计初衷是缓存已下载的软件包提供给其他同样运行着apt-p2p的peers,作为从软件源下载的补充。那么是否可以用这个软件在局域网内搭建一个Debian软件包缓存呢?

apt-p2p拥有着 P2P 技术的优势:
# * 即能从用户节点中获取软件包,同时又能从官方源中下载
# * 使用 apt-p2p 的人越多,软件包的传递效率就越高、速度越快
# * 低 CPU 和内存资源消耗
# *先进行哈希校验,之后才进行软件包的传递,最大限度地确保安全、避免下载到损坏的包

但同样,它也存在着 P2P 的弊端:
# * 如果使用 apt-p2p 的人不多,速度可能还不及原装的 apt-get。
# * 尽管机率非常小,但仍可能遭遇到潜在的哈希欺骗,进而引发系统安全隐患

目前,在天朝境内使用 apt-p2p 的人的确不多,这一情况可能是制约 apt-p2p 在天朝推广的最主要原因。
但如果人人都不去支持 apt-p2p,那 apt-p2p 又如何发展得起来呢?我们又如何才能获得 apt-p2p 的便利呢?
所以,鄙人在此号召大家一起来使用 apt-p2p!


安装步骤方法

1、准备依赖环境

复制代码代码如下:
sudo apt-get install python python-apt python-twisted python-twisted-web2

2、安装 apt-p2p

复制代码代码如下:
sudo apt-get install apt-p2p

3、修改软件源列表(注:第三方源不用也不必修改)

复制代码代码如下:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
sudo sed -i 's%http://%http://localhost:9977/%g' /etc/apt/sources.list

4、根据需要配置apt-p2p

复制代码代码如下:
sudo gedit /etc/apt-p2p/apt-p2p.conf

其中
“PORT = ”指定 apt-p2p 使用的端口,默认为“9977”。当然,你也可以指定它为“9527”,只是要确保与《/etc/apt/sources.list》中的修改值一致
“UPLOAD_LIMIT = ”指定最大上传速度,默认为“0”即不限速,建议设置为“10~50”(KB/秒)
“MIN_DOWNLOAD_PEERS = ”是指定当可用的 prees 节点少于多少时,才开始从官方源下载,建议使用默认值“3”
“CACHE_DIR = ”是指定 apt-p2p 的软件包缓存目录,建议使用默认值
“OTHER_DIRS = ”是指定额外的软件包目录。注意:一旦指定,在该目录下的所有文件都会被上传
“UPLOAD_LIMIT = ”指定是否进行软件包下载数据列表统计并公布。默认为“yes”即进行公布,若你的电脑对保密等级要求特别高,那请设置为“no”
“DHT-ONLY = ”是否仅只使用分布式散列表提供的资源,建议使用默认值“no”

5、若是装有防火墙,须将“9967”、“9977”端口开放;若是使用路由器,还需要进行映射设置

6、重新启动 apt-p2p,以应用新配置

复制代码代码如下:
sudo rm -rf /var/cache/apt-p2p/cache/*
sudo /etc/init.d/apt-p2p restart

7、开始更新、升级系统或安装软件包

复制代码代码如下:
sudo apt-get update

sudo apt-get upgrade

说明:有的教程说要禁用第三方源,但就鄙人实际使用下来的情况,就算不禁用第三方源也没有什么影响

检视 apt-p2p 运行情况的方法:
在浏览器地址栏中输入 http://localhost:9977/,即可察看相关信息

本地软件包缓存搭建方法:

apt-p2p由Python写成,安装好后默认监听于TCP和UDP的9977端口,可通过/etc/apt-p2p/apt-p2p.conf改变其行为。TCP端口同时用于本机apt下载软件包,而UDP端口用于组建在p2p文件共享工具中常见的DHT网络。只需要在/etc/apt/sources.list文件中软件源的url,例如http://mirror.server/debian/的服务器域名前面插入localhost:9977,即成为http://localhost:9977/mirror.server/debian/,具体从互联网上获取软件包的工作便交给apt-p2p负责了:

当收到来自本机apt的文件下载请求时,apt-p2p会先检测文件是否已经存在于缓存的目录树中
如果已存在,则还要检查是否为最新(通过向软件源服务器发出HEAD请求来实现)
如果是,则直接返回缓存的文件
否则从互联网上下载文件供给apt,同时存入缓存并记录其散列值
下载文件会首先尝试从peer处下载,不成再到软件源服务器处下载
缓存下来的文件和散列值可供其他peer使用。可以通过apt-p2p的日志文件/var/log/apt-p2p.log深入观测这一过程。

以下是我安装了apt-p2p的主机mycastle的sources.list:

复制代码代码如下:
deb http://localhost:9977/mirrors.ustc.edu.cn/debian/ testing main
deb-src http://localhost:9977/mirrors.ustc.edu.cn/debian/ testing main
deb http://localhost:9977/mirrors.ustc.edu.cn/debian-security/ testing/updates main
deb-src http://localhost:9977/mirrors.ustc.edu.cn/debian-security testing/updates main
deb http://localhost:9977/mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
deb-src http://localhost:9977/mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
deb http://localhost:9977/mirrors.ustc.edu.cn/debian/ unstable main
deb-src http://localhost:9977/mirrors.ustc.edu.cn/debian/ unstable main

然而apt-p2p的缓存只能给本机使用,其他主机若试图直接访问9977端口只会得到404错误。因此还需要在安装apt-p2p的主机上架设一个http反向代理,使得在apt-p2p看来,所有的请求均来自本机。

我使用的反向代理是Pound,它在安装好后默认是禁用的。在/etc/pound/pound.cfg中配置好服务器后再到/etc/default/pound中启用它,然后使用service启动服务器即可。

我使用的配置如下:

复制代码代码如下:
...(keep default)
ListenHTTP
Address 0.0.0.0
Port 9978
## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
xHTTP 0
Service
BackEnd
Address 127.0.0.1
Port 9977
End
End
End

监听于9978端口,后台服务器在本机的9977端口。

这样一来,其他主机便也可以通过9978端口使用apt-p2p的缓存了。我的做法是在打算使用缓存的其他主机上将/etc/apt/sources.list移动到/etc/apt/sources.list.d/50_main.list,然后仿照缓存主机的软件源列表建立/etc/apt/sources.list.d/10_apt-p2p-home.list,只是要把url中的localhost:9977换成<hostname-of-cache-server>.local:9978即可,当然最好保持软件源服务器相同。这样apt会优先通过反向代理使用apt-p2p的缓存,当缓存不可用时仍可直接连接软件源服务器获取软件包:

复制代码代码如下:
10_apt-p2p-home.list:</p> <p>deb http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ testing main
deb-src http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ testing main
deb http://mycastle.local:9978/mirrors.ustc.edu.cn/debian-security/ testing/updates main
deb-src http://mycastle.local:9978/mirrors.ustc.edu.cn/debian-security testing/updates main
deb http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
deb-src http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
deb http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ unstable main
deb-src http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ unstable main
50_main.list:</p> <p>deb http://mirrors.ustc.edu.cn/debian/ testing main
deb-src http://mirrors.ustc.edu.cn/debian/ testing main
deb http://mirrors.ustc.edu.cn/debian-security/ testing/updates main
deb-src http://mirrors.ustc.edu.cn/debian-security testing/updates main
deb http://mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
deb-src http://mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
deb http://mirrors.ustc.edu.cn/debian/ unstable main
deb-src http://mirrors.ustc.edu.cn/debian/ unstable main

如安装了apt-transport-https,可以将50_main.list中的http换成https。

这种以主机名加“.local”的域名格式是mDNS/DNS-SD协议提供的一种在广播域内定位主机和发布服务的方法,主要实现有Avahi和Mac OS X的Bonjour。

这样一来,在局域网内,任何一台主机都优先通过apt-p2p获取软件包,一台更新可以惠及全家;即使短时间内更新多台主机,也只需要向软件源索取一次;而且大规模的数据流动发生在带宽很高的局域网内,更缩短了更新时间,提高了效率。

只是这样一来相当于在非缓存主机上配置了两个软件源,而当这两个软件源重复部分的信息不同步时(如笔记本计算机在局域网外更新了直连软件源服务器的软件包列表),apt-get source是无法使用的,因为apt对源码包的检查更严格。

DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。