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命令來完成的。

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