Skip to main content

Command Palette

Search for a command to run...

使用 apt-mirror 和 apt-cacher 创建本地 Ubuntu 仓库

Updated
2 min read

原文:Create a Local Ubuntu Repository using Apt-Mirror and Apt-Cacher

背景

在开始之前,让我先介绍一下促使我们形成这套方案的一些背景因素。

我以前是本地一间大学用户组的志愿者,我乐于为 Linux 新手提供支持并分享经验。这其中我帮助部署的大多数都是 Ubuntu。Ubuntu 的母公司 Canonical 提供的光盘用处不大,尽管有很多光盘,我们还是要面临同一个问题:带宽。获取软件更新和安全补丁始终是一个导致部署缓慢的瓶颈。

想象一下,你和一群 Linux 用户在同一个会议室里,每个用户都在尝试利用互联网来获取更新,想象一下这个过程会有多么缓慢和拥挤。随着人群的增长,这一问题会愈发显著。

在经过这些折磨之后,我开始寻求解决这一问题的方法。我知道所有的机器都在下载同样的更新和补丁,这一切都是重复工作。这实在太没效率了。这里一定有更好的办法。最后我找到了两个方案,下面我会简要介绍。

Apt-Mirror

第一个方法来自于一个工具——“apt-mirror”。这是一个 Perl 开发的工具,用来从一个公开仓库中下载并镜像全部内容。这样就会包含公共仓库中所有的内容,其中自然也会包含你不需要的包。

要配置 apt-mirror 需要如下条件:

  • apt-mirror 包(sudo aptitude install apt-mirror

  • apache2 包(sudo aptitude install apache2

  • 针对每个(硬件)架构的每个版本大概各需要 15G 的空间。

如果上面的需求你可以达成,那么你就可以配置 apt-mirror 工具了,主要内容包括:

  • 存储位置(base_path)

  • 下载的线程数(nthreads)

  • 需要下载的版本和架构

上述配置在 /etc/apt/mirror.list文件中完成。在安装这一工具的过程中,就会生成一个缺省版本,我们需要在这基础上对上述参数进行调整。

下面我列出一个完整的配置文件,他将会镜像 Ubuntu 8.04 LTS 的 32 和 64 位版本。这需要接近 30G 的存储空间。我会把这些内容放到一个加载到 /media/STORAGE/ 的移动盘上。

# apt-mirror configuration file##
## The default configuration options (uncomment and change to override)
##
#
set base_path /media/STORAGE/
# set mirror_path $base_path/mirror
# set skel_path $base_path/skel
# set var_path $base_path/var
#
# set defaultarch <running host architecture>
set nthreads 20
## 8.04 "hardy" i386 mirror
deb-i386 http://us.archive.ubuntu.com/ubuntu hardy main restricted universe 
multiverse
deb-i386 http://us.archive.ubuntu.com/ubuntu hardy-updates main restricted 
universe multiverse
deb-i386 http://us.archive.ubuntu.com/ubuntu hardy-security main restricted 
universe multiverse
deb-i386 http://us.archive.ubuntu.com/ubuntu hardy-backports main restricted 
universe multiverse
deb-i386 http://us.archive.ubuntu.com/ubuntu hardy-proposed main restricted 
universe multiversedeb-i386 http://us.archive.ubuntu.com/ubuntu hardy main/debian-installer 
restricted/debian-installer universe/debian-installer multiverse/debian-installer
deb-i386 http://packages.medibuntu.org/ hardy free non-free# 8.04 "hardy" amd64 mirror
deb-amd64 http://us.archive.ubuntu.com/ubuntu hardy main restricted universe 
multiverse
deb-amd64 http://us.archive.ubuntu.com/ubuntu hardy-updates main restricted 
universe multiverse
deb-amd64 http://us.archive.ubuntu.com/ubuntu hardy-security main restricted 
universe multiverse
deb-amd64 http://us.archive.ubuntu.com/ubuntu hardy-backports main restricted 
universe multiverse
deb-amd64 http://us.archive.ubuntu.com/ubuntu hardy-proposed main restricted 
universe multiversedeb-amd64 http://us.archive.ubuntu.com/ubuntu hardy main/debian-installer 
restricted/debian-installer universe/debian-installer multiverse/debian-installer
deb-amd64 http://packages.medibuntu.org/ hardy free non-free# Cleaning section
clean http://us.archive.ubuntu.com/
clean http://packages.medibuntu.org/

值得注意的是,上面每一行都需要以 deb-i386 或者 deb-amd64 开始。

配置完成之后,就可以开始用下面的命令来开始镜像过程了:

apt-mirror

根据你的互联网连接速度,这可能需要很长的时间。首次运行会初始化这 30G 的内容,而在这之后,运行这一命令只会下载增长部分,就会快速很多了。

读者可能要问,是否可以在完成之前取消传输过程,然后再继续运行呢?是的,我做了很多次这样的操作,目前没有出现任何问题。

现在你有了一个公开仓库的本地镜像了。为了让其他客户能够访问你的仓库,就需要通过 http 的方式来共享这些内容。在我上面的例子中,我把仓库内容存储在了移动盘上,加载点是 /media/STORAGE。接下来要做的事情就是让这些内容能够通过 web 进行访问。简单的做一个符号链接就能达到目的了:

cd /var/www/
sudo ln -s /media/STORAGE/mirror/us.archive.ubuntu.com/ubuntu/ ubuntu

上面的命令会告诉文件系统,所有对 ubuntu 的请求都转到移动盘上,然后就能找到镜像内容了。如果这一过程出现了问题,请仔细检查路径问题,确认正确的连接到了 ubuntu 目录上。连接错误会导致用户无法找到需要的内容。

还有一个附加的需求就是让这一镜像保持更新,这一点可以通过 cron job 来实现。激活定时任务会自动运行 apt-mirror 命令,保持镜像始终最新。

要激活自动的定时任务,我们创建一个文件 /etc/cron.d/apt-mirror。这里提供一个示例内容,只要取消这一行的注释,并把 4 替换成一个你认为合适的时间即可。如果没有修改时间,他会在每天早上 4 点运行 apt-mirror 命令,进行同步。

现在已经建立了自己的仓库,并且通过 http 进行了共享,还设置了自动的更新,那么最后一步就是配置客户来使用它了。Ubuntu 用户使用 /etc/apt/sources.list 文件来定义更新源。这个文件通常会指向官方源。因此需要注释原有内容,加入我们的镜像源。例如把下面的内容加入到配置文件:

deb http://192.168.0.10/ubuntu hardy main restricted universe multiverse deb http://192.168.0.10/ubuntu hardy-updates main restricted universe multiverse deb http://192.168.0.10/ubuntu hardy-security main restricted universe multiverse

基本上完成这些步骤之后,你的镜像仓库就可以通过 http 提供服务了,如果出现了问题,可以查看 apache 日志来进行除错。

现在局域网里面就有了私有的(可移动)Ubuntu 仓库了,能够大量节省你的时间和带宽。

(这里还有更多的 Ubutnu 资源

Apt-Cacher

第二个镜像 Ubuntu 仓库的方法就是使用 Apt-Cacher

Apt-Cacher 不同于 apt-mirror 的地方是,他不会镜像整个仓库的内容,而只是简单的缓存客户请求的包。换句话说,他扮演了局域网客户端和公共仓库之间的中间人,在内网中分享曾经下载过的包内容。

每次有客户端请求一个包,不管是一个应用还是安全更新,apt-cache 服务器会从公众仓库请求这个包,保存起来并发送给请求的客户。这样这个包就对内网中的任何用户都是可用的了。

这个办法很适合需要最小化存储消耗,或只是想更方便的获取更新的场景。

要配置这个方法需要如下准备:

  • apt-cacher 包(sudo aptitude install apt-cacher

  • apache2 包(sudo aptitude install apache2

  • 可用存储(基于存储请求包的个数决定)

安装好需要的包之后,就需要激活这个服务了。激活服务只要编辑 /etc/default/apt-cacher 文件,设置 AUTOSTART 的值:

"AUTOSTART=0" 改为 "AUTOSTART=1"

还可以在 /etc/apt-cacher/apt-cacher.conf 文件中进行访问限制。更新 allowed_hosts 来设置允许的主机或者子网。完成这些配置之后,就可以启动这个缓存系统了:

sudo /etc/init.d/apt-cacher restart

最后一步就是配置客户端了。每个网络内的客户端都需要配置来使用这一缓存系统。

我推荐的方式是在 /etc/apt/apt.conf.d/ 目录中定义一个 apt 代理服务器。只要新建一个名为 90-apt-proxy.conf 的文件,并加入下面的内容:

Acquire::http::Proxy "http://repository-cache:3142";

注意把上面的 "repository-cache" 替换为你自己的 apt-cache 服务器地址。

这样,客户端每次访问这一 URL(repository-cache:3142)就会用到缓存,如果这个网址不可用,客户端缺省会返回使用 /etc/apt/sources.list,可以注释掉上面的代理服务器设置内容来恢复正常工作。

这些步骤可以重复应用在所有需要访问缓存的客户机上。可以借此节约部分带宽。apt-cache 没有对机器数量进行限制的途径。

总结

上面的方法,不管是完整镜像还是请求缓存,都能够极大的降低带宽需求,两个工具都非常容易配置,几乎无需维护。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts