如何安裝一個可執行程式
一般來說我們一個可執行程式,可能在多個路徑下,比如在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
- 表示在/usr/local/bin/下建立的genericname。當然,使用者側程式,一般建立在/usr/bin下,而不是截圖中的/usr/local/bin中。generic name一般沒有版本
- 整個Link group的名稱,一般跟generic name一致
- 連結的執行程式實際版本的路徑
- 當前安裝版本對應的權重。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