在 Linux 上用 update-alternatives 配置多版本切换

摘要:在Linux环境中,update-alternatives工具允许开发者在系统上同时安装和切换不同版本的可执行文件或动态库,如GCC和G++。它通过软链接创建不带版本号的通用名称,并根据优先级或手动选择切换版本。该工具有install、list、display、query、config和auto等命令,方便管理和配置多个版本的程序。

基本原理

  1. 二进制程序名/路径带版本号,例如:gcc-7,gcc-8,
  2. 通过软连接,创建不带版本号的名称/路径,例如:/usr/bin/gcc
  3. 默认使用 不带版本号的名称使用命令,例如:
  4. update-alternatives 命令通过修改连接指向不同的实际程序或者动态库,实现多版本共存,动态切换的效果

命令格式

update-alternatives [option...] command

install 命令

update-alternatives --install link name path priority

link 不带版本号的链接名,例如:/usr/bin/gcc
name update-alternatives 数据库中的名称,创建后可以通过这个名称来管理软件。用户自定义
path 实际可执行程序的 path,例如:/usr/bin/gcc-7,/usr/lib/linux-tools/6.8.0-59-generic/usbipd
priority 优先级。update-alternatives 有2种模式:手动(manual)和自动(auto),前者是用户明确指定使用那个版本,auto模式,会使用高优先级(数值大)的程序版本

示例1:创建 usbip 的链接

$ sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20

$ ll /usr/local/bin/usbip
lrwxrwxrwx 1 root root 23 Apr 12 04:44 /usr/local/bin/usbip -> /etc/alternatives/usbip*
$ ll /etc/alternatives/usbip
lrwxrwxrwx 1 root root 43 Apr 12 04:44 /etc/alternatives/usbip -> /usr/lib/linux-tools/6.8.0-59-generic/usbip

示例2:分别创建 gcc 的链接,并设置 gcc-8 为最高优先级

设置 gcc-8 优先级(20)较高
$ sudo upadte-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 20
设置 gcc-7 优先级(10)较低
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 10

list 命令

$ update-alternatives --list usbip
/usr/lib/linux-tools/6.8.0-59-generic/usbip
$ update-alternatives --list gcc
/usr/bin/gcc-7
/usr/bin/gcc-8

display 命令

查看链接对应的详情信息

$ update-alternatives --display usbip
usbip - auto mode
  link best version is /usr/lib/linux-tools/6.8.0-59-generic/usbip
  link currently points to /usr/lib/linux-tools/6.8.0-59-generic/usbip
  link usbip is /usr/local/bin/usbip
/usr/lib/linux-tools/6.8.0-59-generic/usbip - priority 20

query 命令

查看链接对应的详细信息。
和 display 命令的差别,对信息进行了格式化处理

$ update-alternatives --query usbip
Name: usbip
Link: /usr/local/bin/usbip
Status: auto
Best: /usr/lib/linux-tools/6.8.0-59-generic/usbip
Value: /usr/lib/linux-tools/6.8.0-59-generic/usbip

Alternative: /usr/lib/linux-tools/6.8.0-59-generic/usbip
Priority: 20

all 命令

这个名字有点奇怪,不是动作。但帮助文档 man page 中确实是做为命令进行说明的。
功能是逐条显示各个链接

$ update-alternatives --all
There is 1 choice for the alternative usbip (providing /usr/local/bin/usbip).

  Selection    Path                                         Priority   Status
------------------------------------------------------------
* 0            /usr/lib/linux-tools/6.8.0-59-generic/usbip   20        auto mode
  1            /usr/lib/linux-tools/6.8.0-59-generic/usbip   20        manual mode

Press <enter> to keep the current choice[*], or type selection number:
There are 2 choices for the alternative vi (providing /usr/bin/vi).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/vim.basic   30        auto mode
  1            /usr/bin/vim.basic   30        manual mode
  2            /usr/bin/vim.tiny    15        manual mode

Press <enter> to keep the current choice[*], or type selection number:

config 命令切换版本

目前 gcc->gcc-7,使用 config 命令,让 gcc->gcc-8
config 命令显示链接所对应程序的各个版本的一个列表,通过数字进行选择。

$ sudo update-alternatives --config usbip
There is 1 choice for the alternative usbip (providing /usr/local/bin/usbip).

  Selection    Path                                         Priority   Status
------------------------------------------------------------
* 0            /usr/lib/linux-tools/6.8.0-59-generic/usbip   20        auto mode
  1            /usr/lib/linux-tools/6.8.0-59-generic/usbip   20        manual mode

Press <enter> to keep the current choice[*], or type selection number: 1

$ update-alternatives --display usbip
usbip - manual mode
  link best version is /usr/lib/linux-tools/6.8.0-59-generic/usbip
  link currently points to /usr/lib/linux-tools/6.8.0-59-generic/usbip
  link usbip is /usr/local/bin/usbip
/usr/lib/linux-tools/6.8.0-59-generic/usbip - priority 20

auto 命令

上面 config 命令可以指定某个版本,auto 命令可以还原成自动模式,选择优先级高的版本

set to auto
$ sudo update-alternatives --auto usbip

$ update-alternatives --display usbip
usbip - manual mode
  link best version is /usr/lib/linux-tools/6.8.0-59-generic/usbip
  link currently points to /usr/lib/linux-tools/6.8.0-59-generic/usbip
  link usbip is /usr/local/bin/usbip
/usr/lib/linux-tools/6.8.0-59-generic/usbip - priority 20

remove 命令

$ update-alternative --list gcc
/usr/bin/gcc-7
/usr/bin/gcc-8

$ sudo update-alternative --remove gcc /usr/bin/gcc-7

$ update-alternative --list gcc
/usr/bin/gcc-8

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注