update-alternatives
語法
update-alternatives [option...] command
想像一下在某個情境底下,一次有多種相同屬性的軟體被安裝在同一個系統裡。舉個例子來說,某些系統底下都會有很多套的文字編輯器(text editors),每個使用者都有自己喜好的文字編輯器,但是有時候其他的程式可能會有預定的文字編輯器。甚至有時候可能會有不同版本的需求,舉個最常遇到的例子來說,在你的環境裡面,常常Java的版本需要切來切去,所以會讓這樣子的管理變得有點麻煩
於是Debian的alternatives system就推出了,主要是用來解決以上的問題,概念就是在檔案系統上的一般檔案名稱(generic name)都是由可交換功能(interchangeable functionality)的所有檔案共享的,所以這個檔案會由系統管理者和alternatives system來共同決定會參考到哪個真實的檔案。
舉個例子,像是底下這個檔案:
hugh@host:~/$ whereis editor
editor: /usr/bin/editor /usr/share/man/man1/editor.1.gz
hugh@host:~/$ file /usr/bin/editor
/usr/bin/editor: symbolic link to /etc/alternatives/editor
hugh@host:~/$ file /etc/alternatives/editor
/etc/alternatives/editor: symbolic link to /bin/nano
可以看到有一個軟體叫做『editor』,位置在『/usr/bin/editor』,這個檔案又連結到『/etc/alternatives/editor』,然後在次連結到『/bin/nano』,所以代表的是『editor』這個軟體(也就是所謂的generic name)其實本質上是一個連結,透過『alternatives』系統連到『nano』上。
所以如果你要將『editor』這個連結給連到其他的編輯軟體,像是『vim』的話,可以透過『alternative』系統來處理,或是你當然也可以直接用系統管理員的角色來直接修改連結,但是就會破壞『alternative』系統。
了解『alternatives』系統之前,先來了解幾個專有名詞:
generic name (或是alternative link) 像是『/usr/bin/editor』之類的名字,這個相關的名字主要會透過alternatives system參考到很多檔案中的其中之一,或是相關的函數。
alternative name 在替代資料夾(alternatives directory)裡面的某個symbolic link的名字。
alternative (或是alternative path) 在filesystem裡面某個檔案的名字,而這個名字可以經由使用alternatives system的一般名字來存取。
alternatives directory 包含了一堆symlinks的資料夾,通常預設是『/etc/alternatives』。
administrative directory 這個資料夾包含了update-alternatives狀態資訊,預設的話是『/var/lib/dpkg/alternatives』。
link group 一系列的相關symlinks,用來群組更新。
master link 在link group裡面的alternative link,主要用來決定在群組裡面的其他links如何組態。
slave link 在link group裡面的alternative link,主要會被master link的設定控制。
automatic mode 如果一個link group是在這個模式的話,代表alternatives system會幫你將這個群組裡的連結給連到高優先權的alternative上。
manual mode 如果一個link group是在這個模式的話,alternatives system將不會幫你改變任何系統管理員的設定。
當每個套件安裝了以後,檔案系統通常會有一些特定的檔案,當套件有改變還是被移除時,update-alternative都會被呼叫,然後更新在alternative 系統裡這個檔案的資訊,通常update-alternatives是在post-inst(也就是設定組態時),或是pre-rm(也就是移除和解除組態)的script上被呼叫的。
而且通常同樣性質的軟體會被設定成一個link group,這樣才可以被同步的改變,舉個例子來說,當有很多版本的『vi』套件被安裝時,由man page - 『/usr/share/man/man1/vi.1』將會被『/usr/bin/vi』所參考到。update-alternatives處理link group的同步將會使用『master』和『slave』的概念,一個『master』會與其他的『slaves』組成一個link group,當『master』被改變了,相關的『slave』也將會被改變。
每個link group在一個時間點都會有兩種模式 - 『automatic』或是『manual』,當模式是『automatic』的話,alternative系統將會在套件安裝或移除時自動的幫你決定接下來的連結要連結到哪個版本/套件上。而在『manual mode』時,alternatives 系統將會幫你保留系統管理者的決定,不會自動幫你修改,除非有哪個環節壞掉了。
通常在剛安裝這個alternative系統時,link groups一開始的設定是在『automatic mode』,除非系統管理者有手動的去改動到這些設定,這樣alternative系統將會自動的切換到『manual mode』。至於系統要怎麼知道要切換到一個套件呢?因為alternative系統有一個優先權的表,所以如果你是在『automatic mode』時,系統會自己指到高優先權的軟體上。
先看一下底下的圖:
解釋如下,并參考一下上面的『名詞解釋』:
- 有一個Link group叫做『editor』,看起來就知道是編輯器相關。
- generic name叫做『editor』,path是『/usr/bin/editor』。
- alternative name為『/etc/alternatives/editor』。
- mode為『manual 』。
- 裡面有四個『alternative』,分別是『ed』,『nano』,『vim.basic』和『vim.tiny』。
- 每一個『alternative』裡面都各有『master link』和『slave link』,可以看到的是每個『master link』都是主要的執行檔名稱跟路徑,『slave link』基本上都是man files。
- 因為優先權是『nano』最高=40,所以最上面有一段是說『link best version is /bin/nano』,從這邊你可以看到優先權和系統automatic mode自動選擇的關聯。
- 『link currently points to /usr/bin/vim.tiny』這一行主要就是說目前的『alternative』是指到『/usr/bin/vim.tiny』。
以架構來看如底下:
如果將『editor』帶入上面的概觀就會變成如下: