update-alternatives 命令详解

1. 介绍

update-alternatives 命令在 Linux 系统中具有重要的作用。它主要用于维护符号链接,这些符号链接确定了各种任务或实用工具的默认命令或应用程序。update-alternatives 允许系统管理员或用户选择在其系统上使用哪个版本的特定命令或应用程序。

当一个软件在系统上安装了多个版本时,update-alternatives 命令变得非常有用。例如,当系统上同时安装了 gcc 4.8.5 和 gcc 7.2.0 版本时,可以使用 update-alternatives 命令来选择执行哪个版本。通过创建指向替代程序的符号链接组,并通过更新链接以指向所需程序,用户可以在不手动更新每个符号链接的情况下在不同版本的相同程序之间轻松切换。

2. 一个软件多版本管理的例子

2.1. 向 alternatives 注册多个版本

假设我们系统中安装了多个版本的 python, 分别是 python2.7,python3.5,python3.12

/usr/local/python2.7

/usr/local/python3.5

/usr/local/python3.12

我们可以将这三个版本使用 alternatives 来管理

1
2
3
4
5

update-alternatives --install /usr/bin/python python /usr/bin/python2.7 100
update-alternatives --install /usr/bin/python python /usr/bin/python3.5 200
update-alternatives --install /usr/bin/python python /usr/bin/python3.12 300

  • 第一个参数: –install 表示向 update-alternatives 注册服务名。
  • 第二个参数: link,成功后将会把命令在这个固定的目的地址做真实命令的软链,以后管理就是管理这个软链;
  • 第三个参数: 服务名,以后管理时以它为关联依据。
  • 第四个参数: 被管理的命令绝对路径。
  • 第五个参数: 优先级,数字越大优先级越高。

这里的 install 实际是很令人费解的一个选项,其实这里理解为组成注册一个替代更容易理解一些

这三条指令执行完后,alternatives 会创建一个软连接/usr/bin/python 指向=>/etc/alternatives/python

而/etc/alternatives/python 也是一个软连接指向/usr/bin/python3.12

这里为什么多一层软连接/etc/alternatives/python, 而不直接指向/usr/bin/pythonx.xx? 这与 alternatives 设计和实现方式有关,个人理解可能是方便管理。

为什么软链接会最终指向/usr/bin/python3.12?

因为这一条注册记录的优先级最高

这些注册信息保存在哪里?

alternatives 的数据存储在/var/lib/alternatives/目录下。这个目录下包含了多个子目录和文件,用于存储软链接的配置信息和优先级信息等。

使用如下命令可以查看 python 当前的状态

1
2
3

alternatives --display python

2.2. 如何切换版本

1
2
3
4
5
6
7
8
9
$ update-alternatives --config python
有 2 个候选项可用于替换 python (提供 /usr/bin/python)。
选择 路径 优先级 状态
------------------------------------------------------------
0 /usr/bin/python3.12 300 自动模式
1 /usr/bin/python2.7 100 手动模式
2 /usr/bin/python3.5 200 手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:

2.3. 删除一条注册记录

remove 参数用于删除一个命令的 link 值,其附带的 slave 也将一起删除

1
update-alternatives –remove python /usr/bin/python2.7

3. update-alternatives 的原理

update-alternatives 的工作原理基于软链接管理。在 Linux 系统中,软链接类似于 Windows 中的快捷方式,它是一个指向实际文件或目录的指针。通过使用软链接,update-alternatives 可以创建、删除、修复和显示已存在的软链接信息。

update-alternatives 的工作原理如下:首先,它会检查系统路径下的符号链接,这些符号链接指向了实际的软件目录或可执行文件。符号链接的路径通常在/usr/bin 下,例如/usr/bin/<name>。这些符号链接指向了/etc/alternatives/<name>这个文件,该文件也是一个软链接。最终,这个符号链接指向了实际可执行文件。

通过创建、删除、修复和显示软链接,update-alternatives 允许系统管理员或用户在不同的版本之间切换特定命令或应用程序。这使得在不进行手动更新每个符号链接的情况下,轻松地在不同版本的相同程序之间进行切换。

4. update-alternatives 在切换版本时作了哪些事情?

update-alternatives 在切换版本时主要做了以下几件事情:

  • 检查系统中已存在的符号链接,这些符号链接指向了实际的可执行文件。
  • 根据用户的选择或配置文件中的设置,确定要使用的软链接的路径。
  • 创建、删除、修复或显示软链接,以实现不同版本之间的切换。
  • 更新软链接的优先级信息,以确保系统默认使用正确的版本。

通过这些步骤,update-alternatives 实现了在不进行手动更新每个符号链接的情况下,轻松地在不同版本的相同程序之间进行切换的功能。这有助于提高系统的灵活性和可维护性。

5. update-alternatives 软件版本管理的局限性

我们都知道一个软件基本由以下几个基本部分组成:

  1. 应用程序代码
  2. 配置
  3. 数据
  4. 文档和帮助

另外软件的执行依赖操作系统,系统库,以及其他外部环境,如果不一致则会导致兼容性问题。

update-alternatives 在管理应用程序,以及自身携带的数据与配置方面已经很优秀了,但是在其他方面可能存在不足之处,例如在自动保持环境变量一致性方面。虽然 update-alternatives 可以管理可执行文件的链接,但它并不能直接修改环境变量与系统配置。因此,需要额外的脚本或手动配置来确保环境变量与切换后的应用程序版本的一致性。

另外,对于系统库文件的管理,update-alternatives 主要关注可执行命令的切换,而不是库文件的切换。因此,如果需要管理不同版本依赖的库文件,可能需要采取其他方法,例如使用动态链接器配置或特定的软件包管理工具。

总的来说,update-alternatives 是一个有用的工具,但需要根据具体的需求和场景进行适当的配置和结合其他工具使用。对于系统管理员而言,了解其工作原理和限制,并根据实际情况采取适当的措施来满足多版本管理的需求是非常重要的。

6. 参考文档

update-alternatives 命令