从apt-get出抓取binary-i386/Packages.gz失败的错误说开去

起因

服务器上用 apt-mirror 来拉取某些软件官方的 apt 仓并本地建仓,用于本地服务器的软件安装和更新,这个大概也是众多运维工程师曾经做过的事情吧。

今天我在某一台服务器上做 apt-get update 时出错了,系统报 “http://xxx.xx.xx.xx/xxxxxxxxxxxxxxxxxxx/binary-i386/Packages.gz” 抓取失败。xxx.xx.xx.xx 是我自己建的 apt 仓,用来服务于内部服务器的,xxxxxxxxxxxxxxxxxxx 正是自建仓的路径,这下面当然没有 binary-i386 目录,因为服务器都是 x86_64 架构的,应该使用的是目录 binary-amd64 才对。

环境介绍

出错的服务器的操作系统是:Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-13-generic x86_64)

  1. apt 的配置文件里没有关于 i386 的设置
  2. source 里也没有关于 i386 的设置

原因简介

Ubuntuamd64 系统中,i386 是作为额外的体系结构被支持的。证据如下:

1
dpkg --print-architecture;dpkg --print-foreign-architectures

会输出“amd64”和”i386”。

所以 apt 缺省是希望 apt 仓也同时能提供 i386 的软件包。而我用 apt-mirror 建仓时,没有指定同步抓取 i386 的软件包,故而当服务器来抓取 i386 相关数据时会出错(因为的确没有哇)。

解决方法

知道原因了以后解决起来相对就简单了,在 apt-mirror 的配置文件 /etc/apt/mirror.list 中将想要同步抓取的软件多写一行,用 deb-i386 替换 deb,然后再跑下

1
apt-mirror

就会同时同步 i386 的软件包下来,这样客户端 apt-get 时就不会有错了。

进阶阅读

可以让 x86_64 系统架构的服务器仅安装 amd64 的软件吗?这样 apt-get 时也不会去抓群 i386 相关的东西了,这样的话也可以避免上面的错误。

回答是:当然可以!

首先,干掉系统现有的所有 i386 的软件包

1
apt-get purge ".*:i386"

接着,将 i386 从支持的体系结构里删掉

1
dpkg --remove-architecture i386

这样也可以达到目的!