使用 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.

相关文章
|
3月前
|
缓存 Linux
软件包管理工具 - yum
【1月更文挑战第17天】
55 0
|
3月前
|
缓存 Ubuntu Linux
apt-get 软件包管理工具
【1月更文挑战第1天】
69 0
|
6月前
|
Cloud Native Ubuntu Linux
Linux软件包管理:yum和apt比较
Linux软件包管理:yum和apt比较
145 0
|
8月前
|
缓存 Ubuntu Linux
Linux软件包管理工具-apt
前言 Linux系统中,常用的软件包管理工具之一是apt(Advanced Package Tool)。它主要用于安装、更新和删除软件包,特别适用于基于Debian/Ubuntu的发行版。 1、更新软件包列表 这个命令会更新本地的软件包索引,其中包含可用软件包及其版本信息。 sudo apt update 2、升级已安装的软件包 这个命令将已安装的软件包升级到它们的最新版本。 sudo apt upgrade 3、安装软件包 将软件包名称替换为你要安装的软件包的名称。 sudo apt install 软件包名称 4、删除软件包 将软件包名称替换为你要删除的软件包的名称。这个命令会删除软件包,
131 0
|
9月前
|
存储 缓存 Ubuntu
Ubuntu 包管理的 20 个“apt-get”命令
Ubuntu 包管理的 20 个“apt-get”命令
140 0
|
Ubuntu
ubuntu apt-get 安装软件时自动yes
ubuntu apt-get 安装软件时自动yes
117 0
apt安装 出现问题 E:无法定位软件包 yum
apt安装 出现问题 E:无法定位软件包 yum
apt安装 出现问题 E:无法定位软件包 yum
|
缓存 安全 Linux
通过yum更新软件包已经常见yum源推荐| 学习笔记
快速学习通过yum更新软件包已经常见yum源推荐。
234 0
通过yum更新软件包已经常见yum源推荐| 学习笔记
|
缓存 安全 数据库
通过yum更新软件包已经常见yum源推荐
一.更新yum源以及软件版本 二.调整服务器时间NTP设置
通过yum更新软件包已经常见yum源推荐
|
域名解析 Ubuntu 应用服务中间件
Ubuntu 系统实例 Apt-get 安装软件及问题处理
本文介绍主要介绍 Ubuntu 系统的实例 Apt-get 在线安装软件使用方法及常见问题处理。
1827 0
Ubuntu 系统实例 Apt-get 安装软件及问题处理