本人家里有好几台运行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换成
复制代码代码如下:
10_apt-p2p-home.list:
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:
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对源码包的检查更严格。