/etc/alternatives

西北偏北_609發表於2020-06-04

如何安裝一個可執行程式

一般來說我們一個可執行程式,可能在多個路徑下,比如在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

參考連結

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

相關文章