Linux 系统搭建离线软件源

为运行 Linux 操作系统的计算机安装程序时,处理软件包的之间依赖关系是一个苦恼的问题。幸好主流的 Linux 发行版都有自己的解决方案:比如红帽系(CentOS、RHEL 和 Fedora)有 yum,Debian 系(Debian、Ubuntu 和 Deepin 等)有 dpkg,可以通过网络上的软件源来解决依赖问题。但是,如果你遭遇到龟速的网络甚至离线情况下,如何解决较大型软件的安装问题呢?搭建一个离线的软件源是一个好办法!

本文以 RHEL 和 Ubuntu 两种发行版为例,介绍主流 Linux 系统离线软件源的搭建方法。因为软件源搭建属于权限较高的操作,所以文中的操作最好在 root 账户下执行。

RHEL 系统搭建方法

首先说明,尽管这里以 RHEL(Red Hat Enterprise Linux)为例,但是这里的方法也适用于 CentOS 和 Fedora 等同样使用 yum 包管理器的 Linux 发行版。

获取所需程序包

软件源实际是就是一个软件包的仓库,通过为仓库中的软件包建立一个索引,使系统在遇到软件包依赖问题时可以按照索引自动安装所需的程序包,这样来达到解决依赖问题的目的。所以,在搭建软件源之前,你要有创建软件源所需的软件包。

一般情况下,所搭建的离线软件源应该至少包含你想要安装的程序以及最常用的一些程序包。需要安装的程序可以去项目的官网下载,而 RHEL 系统的安装光盘里包含了最常用的软件包,通常有这两样就够了。

创建本地软件源

把系统安装盘放到光驱里,使用下面的命令挂载光盘:

1
$ mount /dev/cdrom

挂载成功后,把你准备的 .rpm 格式软件包以及系统安装盘的 /Packages 目录下的软件包拷贝到本机的一个文件夹下(例如 /mnt/cdrom,本文即以这个文件夹为例)。

接下来使用 createrepo 命令为 /mnt/cdrom/ 目录创建索引信息:

1
$ createrepo -v /mnt/cdrom/

然后新建一个 repo 文件(以 local.repo 为例)并编辑:

1
$ vi /etc/yum.repos.d/local.repo

在其中添加以下内容:

1
2
3
4
5
[local_server]               # 库名称
name=This is a local repo # 名称描述
baseurl=file:///mnt/cdrom # 程序包所在目录
enabled=1 # 是否启用该软件源,0为禁用
gpgcheck=0 # 是否检查 GPG-KEY,0为不检查,1为检查

之后保存,退出。

应用配置

最后就是应用我们的配置,这需要清理现有的 yum 缓存并建立新缓存:

1
2
$ yum clean all
$ yum makecache

现在,可以使用离线软件源来安装一个程序试试了,比如安装 FTP 客户端:

1
$ yum install ftp

若能够安装成功,说明我们搭建得没有问题。但是在离线环境下,执行 yum makecache 时,可能会出现类似如下的错误提示:

One of the configured repositories failed (Unknown)

这是因为系统访问其他的软件源失败导致的,禁用其他软件源即可解决该问题:

1
2
$ mkdir /etc/yum.repos.d/repo_bak
$ mv /etc/yum.repos.d/CentOS-*repo /etc/yum.repos.d/repo_bak

Ubuntu 系统搭建方法

现在介绍 Ubuntu 系统搭建离线软件源的方法,但该方法也适用于 Debian、Deepin 等发行版。我实际操作使用的是基于 Ubuntu 的发行版 elementary OS Loki 0.4.1 或 elementary OS Juno 5.0。目前 elementary OS 和 Ubuntu 非常相近,配置过程可以相互参考。

获取所需程序包

Ubuntu 系统的安装光盘仅包含很少量的程序包,这些程序包位于光盘的 /pool 文件夹内。但 Ubuntu 有一个特性:安装或更新过的程序,其安装包会缓存在 /var/cache/apt/archives 目录下。如果你还有一台能够联网的 Ubuntu 系统计算机(可使用虚拟机代替),并且你要安装的程序已经包含在网络上的软件源内,你可以利用这个特性来方便地获取所需的程序安装包。在 Ubuntu 操作系统上,你可以使用如下命令通过软件源下载程序:

1
$ apt-get -d install <software>

这个命令中的 <software> 代表你要安装的程序名。该命令将下载你需要的程序及其所需要的依赖程序的安装包,将其放在 /var/cache/apt/archives 目录下。拷贝该目录下的所有文件即可获取到所需的安装包了。

为 Ubuntu 制作离线软件源需要使用一个程序 “dpkg-dev”,Ubuntu 系统默认通常不会安装它(elementary OS Loki 0.4.1 中已经安装了)。但是其安装方法非常简单,只需要在联网的计算机上执行:

1
$ sudo apt-get install dpkg-dev

创建本地软件源

在联网的计算机上,将你准备好的程序包拷贝到某个文件夹下,例如 /mnt/localpacks,我们将为该文件夹内的所有安装包创建索引以作为本地的软件源。在终端中执行以下命令来创建索引:

1
2
cd /mnt/localpacks
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

程序扫描所有的软件包后,将会在 /mnt/localpacks 目录中生成一个名为 Packages.gz 的文件,存放这个文件夹中的软件包的信息及其依赖关系。

现在这个文件夹就可以作为一个离线的软件仓库来使用了。你可以利用这个文件夹直接为本机创建离线的软件源,当然也可以将其拷贝到其它的计算机上使用。

应用配置

要应用上文生成的文件夹作为离线软件源,需要编辑文件 /etc/apt/sources.list,该文件保存了 Ubuntu 操作系统可用的软件源列表。编辑前切记备份以前的文件:

1
$ cp /etc/apt/sources.list /etc/apt/sources.list.bak

然后编辑 /etc/apt/sources.list,添加离线软件仓库的目录,此处依然假设离线软件源位于 /mnt/localpacks 文件夹。如果你使用的是 Ubuntu 16.04 LTS,在 sources.list 文件中添加以下内容:

1
deb file:/mnt/localpacks ./

在较新的操作系统版本中(如 Ubuntu 18.04 LTS),系统默认将拒绝使用未认证过的软件源。因此在配置 sources.list 文件时,需要同时设置对我们搭建的软件源不做安全校验:

1
deb [ allow-insecure=yes ] file:/mnt/localpacks ./

保存,退出。最后,更新系统软件源以应用配置:

1
$ apt-get update

至此,离线软件源配置完成,你可以安装程序试试了。比如安装 dos2unix 程序:

1
$ apt-get install dos2unix