思考一个问题(Ubuntu14能使用Ubuntu16的源升级软件吗())

最近在 CentOS 系统中折腾了 LAMP 相关软件的升级,写了两篇文章。就顺带研究 Ubuntu 操作系统升级软件的相关细节,并和 CentOS 软件升级做了一些比较。
我平时学习、测试、写一些代码都是在 Ubuntu 14 系统中运行的(阿里云 ECS),每天到公司第一件事情就是 ssh 连接 ECS。
Ubuntu 升级是比较频繁的,每年二个大版本的更新,而 CentOS 更新频率小了很多,主要就是 CentOS 6 和 CentOS 7。在 CentOS 中,CentOS 6/7 主流的源地址都是隔离的,那 Ubuntu 呢?
Ubuntu 官方的源包含的软件都非常丰富,不同操作系统版本使用的源地址也是不一样的,为了升级一个软件,配置较高版本的源(相对操作系统版本来说)是否就行呢?
从我遇到的情况来看,Ubuntu 14 系统如果配置 Ubuntu 16 系统的源,也不一定能够升级软件,这篇文章以 redis-server 举例。
sources.list
当安装一个 Ubuntu 系统后,所有默认的源会配置在 /etc/apt/sources.list 文件中,先了解下 sources.list 文件的内容。

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse

(1)包含四种类型的软件
  • main:包括 Ubuntu 官方免费、主流的软件。
  • universe:包括 Ubuntu 社区免费、主流的软件。
  • restricted、multiverse:包括非免费的软件。
(2)特定操作系统版本的源
  • trusty:ubuntu 14
  • xenial:ubuntu 16
  • artful:ubuntu 17
  • bionic:ubuntu 18 04
  • cosmic:ubuntu 18 10
其中 trusty、trusty-security、trusty-updates 可以同等理解。
(3)源镜像
某个源为了加速使用,在各地有多份镜像,比如我的 ECS 使用的镜像就是阿里云提供的(http://mirrors.aliyun.com/ubuntu/),所有的镜像列表地址
Ubuntu 官方源
基本上每一个软件都能在 Ubuntu 官方找到,比如搜索redis-server 可以看到多个版本,如下图:
思考一个问题(Ubuntu14能使用Ubuntu16的源升级软件吗())
文章图片
图1 现在假设我要将 redis-server 更新到 xenial 系统下的最新版本(2:3.0.6-1)。
在 /etc/apt/sources.list 文件中加入下一行:
deb http://mirrors.aliyuncs.com/ubuntu/ xenial main main restricted universe multiverse

注意:添加这个源并不代表只是为了升级 redis-server,是全局配置了一个 xenial 系统源。
然后更新源:
$ apt-get update

现在配置了一个 Ubuntu 16 的源,就能够升级 redis-server 了吗?事情并没有那么简单。
升级 redis-server
(1)先看系统目前可以安装的 redis-server 版本:
$ apt-cache policy redis-server

输出如下图:
思考一个问题(Ubuntu14能使用Ubuntu16的源升级软件吗())
文章图片
图2 从图中可以看出,在 xenial 版本中,redis-server 可以安装的版本是 2:3.0.6-1。
(2)输入下列命令升级
$ apt-get install redis-server=2:3.0.6-1

输出如下图:
思考一个问题(Ubuntu14能使用Ubuntu16的源升级软件吗())
文章图片
图3 但没有升级成功,提示是 redis-tools 版本过低。
(3)输入下列的命令查看 redis-server 依赖的包
$ apt-cache depends redis-server=2:3.0.6-1

输出如下图:
思考一个问题(Ubuntu14能使用Ubuntu16的源升级软件吗())
文章图片
图4 依赖的包主要是 redis-tools。
【思考一个问题(Ubuntu14能使用Ubuntu16的源升级软件吗())】(4)查看 redis-tools 可以安装的版本:
$ apt-cachepolicy redis-tools

输出如下图:
思考一个问题(Ubuntu14能使用Ubuntu16的源升级软件吗())
文章图片
图5 可以看出,可能需要升级 redis-tools 到 2:3.0.6-1 版本。
(5)升级 redis-tools 版本
$ apt-get installredis-tools=2:3.0.6-1

输出如下图:
思考一个问题(Ubuntu14能使用Ubuntu16的源升级软件吗())
文章图片
图6 从图中可以看出,卸载了已经安装的 redis-server 包。
(6)再一次升级(安装)redis-server
$ apt-get install redis-server=2:3.0.6-1

可最终实际上并没有安装,寻找原因,从图4可以猜测是 init-system-helpers 包版本过低,如果升级了 init-system-helpers,是否可以安装 redis-server 呢?
(7)强制升级 init-system-helpers 包
$ apt-get install init-system-helpers=1.29ubuntu1

实际上并没有升级,原因就在于这个包被太多的软件依赖,APT 无法强制更新,通过下列命令可以看出:
$ apt-cache rdependsinit-system-helpers

最终,redis-server 也没有升级到最新版本(xenial)。
总结:可以看出,一个低版本的 Ubuntu 操作系统即使配置了一个高版本的 Ubuntu 操作系统源,也不一定能够升级,那么如何解决呢?
  • 升级操作系统。
  • 使用 PPA,这是我后面一篇文章要介绍的。

    推荐阅读