<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ubuntu | 伪架构师</title>
    <link>/tags/ubuntu/</link>
      <atom:link href="/tags/ubuntu/index.xml" rel="self" type="application/rss+xml" />
    <description>ubuntu</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Sun, 07 Feb 2016 04:18:00 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>ubuntu</title>
      <link>/tags/ubuntu/</link>
    </image>
    
    <item>
      <title>使用 apt-mirror 和 apt-cacher 创建本地 Ubuntu 仓库</title>
      <link>/post/build-ubuntu-repository-with-apt-mirror-and-apt-cacher/</link>
      <pubDate>Sun, 07 Feb 2016 04:18:00 +0800</pubDate>
      <guid>/post/build-ubuntu-repository-with-apt-mirror-and-apt-cacher/</guid>
      <description>

&lt;p&gt;原文：&lt;a href=&#34;https://hub.packtpub.com/create-local-ubuntu-repository-using-apt-mirror-and-apt-cacher/&#34; target=&#34;_blank&#34;&gt;Create a Local Ubuntu Repository using Apt-Mirror and Apt-Cacher&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&#34;背景&#34;&gt;背景&lt;/h2&gt;

&lt;p&gt;在开始之前，让我先介绍一下促使我们形成这套方案的一些背景因素。&lt;/p&gt;

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

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

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

&lt;h2 id=&#34;apt-mirror&#34;&gt;Apt-Mirror&lt;/h2&gt;

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

&lt;p&gt;要配置 apt-mirror 需要如下条件：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;apt-mirror 包（&lt;code&gt;sudo aptitude install apt-mirror&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;apache2 包（&lt;code&gt;sudo aptitude install apache2&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;针对每个（硬件）架构的每个版本大概各需要 15G 的空间。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果上面的需求你可以达成，那么你就可以配置 apt-mirror 工具了，主要内容包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;存储位置（base_path）&lt;/li&gt;
&lt;li&gt;下载的线程数（nthreads）&lt;/li&gt;
&lt;li&gt;需要下载的版本和架构&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;# 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 &amp;lt;running host architecture&amp;gt;
set nthreads 20
## 8.04 &amp;quot;hardy&amp;quot; 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 &amp;quot;hardy&amp;quot; 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/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;值得注意的是，上面每一行都需要以 &lt;code&gt;deb-i386&lt;/code&gt; 或者 &lt;code&gt;deb-amd64&lt;/code&gt; 开始。&lt;/p&gt;

&lt;p&gt;配置完成之后，就可以开始用下面的命令来开始镜像过程了：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apt-mirror&lt;/code&gt;&lt;/p&gt;

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

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

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

&lt;pre&gt;&lt;code&gt;cd /var/www/
sudo ln -s /media/STORAGE/mirror/us.archive.ubuntu.com/ubuntu/ ubuntu
&lt;/code&gt;&lt;/pre&gt;

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

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

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

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

&lt;pre&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;现在局域网里面就有了私有的（可移动）Ubuntu 仓库了，能够大量节省你的时间和带宽。&lt;/p&gt;

&lt;p&gt;（这里还有更多的 &lt;a href=&#34;https://www.packtpub.com/books/content/create-local-ubuntu-repository-using-apt-mirror-and-apt-cacher#more&#34; target=&#34;_blank&#34;&gt;Ubutnu 资源&lt;/a&gt;）&lt;/p&gt;

&lt;h2 id=&#34;apt-cacher&#34;&gt;Apt-Cacher&lt;/h2&gt;

&lt;p&gt;第二个镜像 Ubuntu 仓库的方法就是使用 &lt;strong&gt;Apt-Cacher&lt;/strong&gt;。&lt;/p&gt;

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

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

&lt;p&gt;这个办法很适合需要最小化存储消耗，或只是想更方便的获取更新的场景。&lt;/p&gt;

&lt;p&gt;要配置这个方法需要如下准备：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;apt-cacher 包（&lt;code&gt;sudo aptitude install apt-cacher&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;apache2 包（&lt;code&gt;sudo aptitude install apache2&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;可用存储（基于存储请求包的个数决定）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;安装好需要的包之后，就需要激活这个服务了。激活服务只要编辑 &lt;code&gt;/etc/default/apt-cacher&lt;/code&gt; 文件，设置 &lt;strong&gt;AUTOSTART&lt;/strong&gt; 的值：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;quot;AUTOSTART=0&amp;quot; 改为 &amp;quot;AUTOSTART=1&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

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

&lt;p&gt;&lt;code&gt;sudo /etc/init.d/apt-cacher restart&lt;/code&gt;&lt;/p&gt;

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

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

&lt;p&gt;&lt;code&gt;Acquire::http::Proxy &amp;quot;http://repository-cache:3142&amp;quot;;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;注意把上面的 &amp;ldquo;repository-cache&amp;rdquo; 替换为你自己的 apt-cache 服务器地址。&lt;/p&gt;

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

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

&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;

&lt;p&gt;上面的方法，不管是完整镜像还是请求缓存，都能够极大的降低带宽需求，两个工具都非常容易配置，几乎无需维护。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
