使用 apt-p2p 搭建本地 Debian 软件包缓存

简介:

使用 apt-p2p 搭建本地 Debian 软件包缓存


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

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

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:


  
  
  1. deb http://localhost:9977/mirrors.ustc.edu.cn/debian/ testing main
  2. deb-src http://localhost:9977/mirrors.ustc.edu.cn/debian/ testing main
  3. deb http://localhost:9977/mirrors.ustc.edu.cn/debian-security/ testing/updates main
  4. deb-src http://localhost:9977/mirrors.ustc.edu.cn/debian-security testing/updates main
  5. deb http://localhost:9977/mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
  6. deb-src http://localhost:9977/mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
  7. deb http://localhost:9977/mirrors.ustc.edu.cn/debian/ unstable main
  8. 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启动服务器即可。

我使用的配置如下:


  
  
  1. ...(keep default)
  2. ListenHTTP
  3. Address 0.0.0.0
  4. Port 9978
  5. ## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
  6. xHTTP 0
  7. Service
  8. BackEnd
  9. Address 127.0.0.1
  10. Port 9977
  11. End
  12. End
  13. 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:


  
  
  1. deb http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ testing main
  2. deb-src http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ testing main
  3. deb http://mycastle.local:9978/mirrors.ustc.edu.cn/debian-security/ testing/updates main
  4. deb-src http://mycastle.local:9978/mirrors.ustc.edu.cn/debian-security testing/updates main
  5. deb http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
  6. deb-src http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
  7. deb http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ unstable main
  8. deb-src http://mycastle.local:9978/mirrors.ustc.edu.cn/debian/ unstable main

50_main.list:


  
  
  1. deb http://mirrors.ustc.edu.cn/debian/ testing main
  2. deb-src http://mirrors.ustc.edu.cn/debian/ testing main
  3. deb http://mirrors.ustc.edu.cn/debian-security/ testing/updates main
  4. deb-src http://mirrors.ustc.edu.cn/debian-security testing/updates main
  5. deb http://mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
  6. deb-src http://mirrors.ustc.edu.cn/debian/ testing-proposed-updates main
  7. deb http://mirrors.ustc.edu.cn/debian/ unstable main
  8. 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对源码包的检查更严格。



本文来自云栖社区合作伙伴“Linux中国”

原文发布时间为:2013-04-02.

相关文章
|
4月前
|
Linux 开发工具
Linux查看已经安装软件的版本,安装软件的路径,以及dpkg、aptitude、apt-get、apt工具的使用
Linux查看已经安装软件的版本,安装软件的路径,以及dpkg、aptitude、apt-get、apt工具的使用
177 2
Linux查看已经安装软件的版本,安装软件的路径,以及dpkg、aptitude、apt-get、apt工具的使用
|
4月前
|
Ubuntu Linux 索引
在Linux中,APT和YUM软件包管理器的何区别?
在Linux中,APT和YUM软件包管理器的何区别?
|
5月前
|
缓存 Ubuntu Linux
|
7月前
|
缓存 Ubuntu 数据库
ubuntu无法使用apt命令时怎么安装库
无论哪种方法,一旦成功安装了所需的库文件,你应该能够在Ubuntu系统上正常使用它们。如果问题仍然存在,可能需要进一步检查系统的包管理配置和依赖关系问题。
318 0
|
7月前
|
缓存 Ubuntu Linux
apt-get 软件包管理工具
【1月更文挑战第1天】
224 0
|
Cloud Native Ubuntu Linux
Linux软件包管理:yum和apt比较
Linux软件包管理:yum和apt比较
301 0
|
存储 缓存 Ubuntu
Ubuntu 包管理的 20 个“apt-get”命令
Ubuntu 包管理的 20 个“apt-get”命令
220 0
|
缓存 Linux 开发工具
Linux软件包管理器yum的使用和更新
Linux软件包管理器yum的使用和更新
315 0
Linux软件包管理器yum的使用和更新
apt安装 出现问题 E:无法定位软件包 yum
apt安装 出现问题 E:无法定位软件包 yum
apt安装 出现问题 E:无法定位软件包 yum
|
缓存 安全 Linux
通过yum更新软件包已经常见yum源推荐| 学习笔记
快速学习通过yum更新软件包已经常见yum源推荐。
通过yum更新软件包已经常见yum源推荐| 学习笔记