/etc/alternatives

如何安裝一個可執行程式

一般來說我們一個可執行程式,可能在多個路徑下,比如在opt路徑下,或者在自己的home下。

當要達到在系統的任意路徑下敲擊該命令,都可執行的話,一般要將該可執行命令的路徑加入到環境變數PATH中。

加入PATH可以是直接到/etc/profile.d/中定義一個sh文件,在其中將該可執行程式的路徑加入其中,比如

JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
export JAVA_HOME

當然還可以將可執行文件,以軟連接的形式,放入到一般系統會找尋的目錄中。比如一般linux系統的PATH,默認都有這幾個路徑

  • /bin 系統啟動載入階段需要使用的命令,比如cat,ls
  • /sbin 系統啟動載入階段需要使用,並且需要root許可權才能執行的命令
  • /usr/bin 整個系統範圍內都能使用的命令
  • /usr/sbin 整個系統範圍內都能使用的命令,但需要管理員許可權

比如我們裝一個java,如果想在任意路徑敲擊java後,都啟動java(不考慮JAVA_HOME這個環境變數),我們可以在/usr/bin下創建一個軟連接文件java , 將其鏈接到我們java的具體路徑,比如

/usr/bin/java -> /usr/java/jdk1.8.0_221-amd64/jre/bin/java

這樣做的好處是,其它程式需要使用java時,它直接去/usr/bin中找就好,無論java實際路徑怎麼存放,使用java的程式,不需要修改。

當一個可執行程式有多個版本怎麼辦 , alternatives

上述只介紹了一個可執行程式的全局安裝方式。但如果一個程式,有好幾個版本的實現。系統怎麼判斷該使用哪一個版本?

比如我們即安裝了java8,又安裝了java10。 這就是alternatives機制要解決的。

alternatives機制,能夠自動選擇高版本程式作為默認程式,或者使用管理員指定的版本作為默認的程式。

一個alternatives機制,涉及如下術語

  • Generic name 不考慮版本,這個程式對應的名字,比如不考慮java的版本,我們一般同一使用java作為啟動命令,其generic name 為:/usr/bin/java
  • Alternatives directory Alternatives 機制,默認使用軟連接的方式,去鏈接實際的程式版本。該路徑下展示了所有的軟連接
  • Link group 而一般一個可執行程式,除了自己之外,還需要依賴一些其他的庫文件,或與之對應的配置文件。這些需要一併連接。所以跟這個程式相關的一組連接叫做link group
  • Master link 連接組中程式主體的鏈接
  • Slave link 鏈接中程式依賴相關的文件鏈接

alternatives管理的命令為update-alternatives

版本選擇的兩種模式

當安裝的alternatives有多個版本時。作業系統默認選擇哪個版本,有兩種模式

  • 自動模式,基於權重自動判斷,高權重為自動啟用版本。並且新安裝的版本由於權重高,自動成為默認版本
  • 手動模式,系統管理員通過命令sudo update-alternatives --config command手動指定一個版本為默認版本,即便後來又裝了更新的版本,默認版本都不會變。

管理手動指定版本後,該alternative即進入手動模式。如果要回滾到自動模式,使用命令

手動安裝一個alternatives

安裝一個alternatives

  1. 表示在/usr/local/bin/下創建的genericname。當然,用戶側程式,一般創建在/usr/bin下,而不是截圖中的/usr/local/bin中。generic name一般沒有版本
  2. 整個Link group的名稱,一般跟generic name一致
  3. 鏈接的執行程式實際版本的路徑
  4. 當前安裝版本對應的權重。alternatives 如果是自動模式的話,會基選權重高的版本做為默認程式

上述程式的兩個版本的實際路徑是

  • /usr/local/bin/foo-2
  • /usr/local/bin/foo-3

帶slave links的安裝

跟上述安裝類似,只是附加指定了主程式依賴的相關配置作為slave link

總結

默認情況下,上述步驟不需要我們手動來做。一般在安裝一個linux的安裝包時,會自動完成上述步驟。並且安裝好的alternatives都是auto模式,即自動決定程式版本

alternatives的一些命令

如何查看一個程式的alterntives 整體情況

sudo update-alternatives --display commandname

手動指定一個版本

列出多個版本,以交互的方式讓用戶選擇指定版本

sudo update-alternatives --config commandname

直接將默認程式設置到某個具體版本的路徑上

sudo update-alternatives --set commandname path

如何回退到自動模式

sudo update-alternatives  --auto commandname

從alternatives中移除指定版本

sudo update-alternatives  --remove commandnamepath

舉例

sudo update-alternatives --remove foo /usr/local/bin/foo-2

移除指定程式的所有alternatives

sudo update-alternatives  --remove-all commandname

參考鏈接

//linux.die.net/man/8/alternatives
//documentation.suse.com/sles/15-SP1/html/SLES-all/cha-update-alternative.html