Debian alternatives system: update-alternatives

    一言以蔽之,工具 update-alternatives 的作用是管理系统下相似功能程序的符号链接,采取的方式是对具有相似功能的程序,不是直接调用该程序,而是用一个统一符号链接来调用,至于该符号链接

指向相似功能程序中的哪一个,则由工具update-alternatives来配置和管理。

    说的很抽象,我们来举个例子,看过后自然就明白了。Ubuntu系统内置了一个阉割版的vim编辑器,

这时我们又安装了一个功能完全的vim编辑器,这时系统上就有了2个功能相似的vim编辑器,但注意,它

们不是同一个程序。那这和我们的工具update-alternatives又有什么关系呢?原来,Ubuntu系统对系统

内置vim的调用是通过名为vi的符号链接来完成的,而不是直接调用vim。

wKiom1dyGIPT-sA7AACBWFf57Jo865.png

从上面的输出可知,vi最终链接到/usr/bin/vim.tiny,也就是vim的Ubuntu阉割版。

    是的,update-alternatives机制是通过2级跳来完成了实际的程序调用。我想,大家一定很好奇这个

update-alternatives是怎么知道哪些程序具有相似功能呢?又怎么管理它们的呢?让我们通过vi的例子

来试着回答这些问题。我是不知道怎么回答这两个问题的,所以只有求助于帮助系统man,通过man的帮

助,发现了有两个update-alternatives的相关目录:

/etc/alternatives:目录下存放有第二级符号链接,指向实际的程序。还有实际程序关联的文件(如帮

助文档)的符号链接。

/var/lib/dpkg/alternatives:目录下存放的大概就是相似程序及其相关联文件(如帮助文档)的管理

文件。

    对于上面两个目录的说明,是我的推断,我们还需要证明推断的正确性。目录/etc/alternatives的

作用很明显,可以通过ls -l命令看到如下输出:

wKioL1dyKLaBYopxAAG-_-Fuk-4610.png

上图中用红线框中的文件除了一个是对vim.tiny的链接外,其他是vim相关的帮助文档的符号链接。

    接着,我们来验证我们对/var/lib/dpkg/alternatives作用的推断,并更进一步的了解该目录的作

用。在安装完整版的vim之前,先来看一下文件/var/lib/dpkg/alternatives/vi这个可能的管理文件:

wKioL1dyKnHiqJWEAABmh3sEMC4783.png

对上面的文件,我稍微编辑了一下,基于我的理解添加了两个空行,按空行我们把文件分为4部分。第一

部分的auto从帮助文档可知是update-alternatives的运行模式;第二部分的/usr/bin/vi是第一级接;

第3部分的每两行为一个整体,而且发现每两行的第一行都和/etc/alternatives目录下的一个vim帮助文

档符号连接同名,而第二行则对应到实际链接的帮助文档;第4部分的第一行是最终被链接的程序,第二

行数字从帮助文档可知是一个优先级,当有多个类似程序可选时,该优先级决定了程序显示在

update-alternatives给出的可选程序列表的位置,优先级越高的程序显示在越前面。好,再看一下我们

通过 update-alternatives --query vi 命令得到的vi链接的信息:

wKiom1dyLkGxROreAADqARrRuQM228.png

应该可以断定,至少update-alternatives --query vi命令是在查询/var/lib/dpkg/alternatives/vi文

件得到信息的。

    接下来我们安装完整版的来观察后update-alternatives相关目录和文件的变化。用命令:

sudo apt-get install vim

来安装vim完整版。安装完成后,先来观察一下/usr/bin/vi的链接指向:

wKiom1dyMszSRn0sAABaPaGvVRc253.png

vi的链接已经被更新了,并最终指向了/usr/bin/vim.basic,也就是我们新安装的完整版的vim程序。再来

看一下/etc/alternatives和/usr/bin目录:

wKioL1dyM1zhWP01AANbAwi5gZk304.png

随着完整版的vim安装也生成了新的符号链接文件和新的程序文件。最后来看一下文件

/var/lib/dpkg/alternatives/vi的变化:

wKioL1dyNIbDDznFAAC6BnDLlT8589.png

看工具比较的结果,红色部分是安装完整版vim后新增加的内容,作用是增加了一个新的可选择程序,从符

号链接可以看出,现在默认选择了/usr/bin/vim.basic程序,即vim完整版。从上面也可以看出vim完整版的

优先级30高于阉割版vim的10。看来我们的推断应该是正确的了。实际上update-alternatives是不知道哪些

程序功能相似的,如果要做到这点,程序自己要通过update-alternatives提供的配置接口来告诉

update-alternatives,即更新/var/lib/dpkg/alternatives目录下的文件或在该目录下创建下新的文件。

你会发现下生成了一个新的文件/var/lib/dpkg/alternatives/vim。

    我们可以来一下运行vi命令到底是不是启动了我们完整的vim程序/usr/bin/vim.basic。在命令行敲入

vi命令。然后通过ps命令获取vi的pid(进程id),如下:

wKiom1dyPRvS4w6JAAHK7a_EEUA325.png

可以看到vi程序的pid是4971。接着我们可以利用proc文件系统来查看pid=4971对应的可执行程序文件完整

路径,如下图:

wKiom1dyPZ-RKLFOAAAzNfFzRpc488.png

从图中得知,确实是运行的我们新安装的vim完整版。

    最后,如果你想更改vi对应的程序入口,可以用update-alternatives --config/--set命令来更改。至

于新生成的/var/lib/dpkg/alternatives/vim文件应该是update-alternatives --install命令来完成的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章