天天看點

《UNIX/Linux 系統管理技術手冊(第四版)》——1.12 查找和安裝軟體的途徑

本節書摘來自異步社群《unix/linux 系統管理技術手冊(第四版)》一書中的第1章,第1.12節,作者:【美】evi nemeth , garth snyder , trent r.hein , ben whaley著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

unix/linux 系統管理技術手冊(第四版)

第12章詳細講述了軟體方面的知識。但是對于沒有耐性的讀者來說,這一節是個初級速成教材,教給讀者怎樣知道自己系統上已經安裝好的軟體有哪些,以及怎樣獲得和安裝新軟體。

現代作業系統把自己分成多個軟體包,軟體包可以逐個獨立安裝。預設安裝的隻包括一定範圍的起步軟體包,使用者可以根據需要再擴充。

附加軟體常常也以預先編譯好的軟體包形式提供,這是一種主流的方式,各個系統間的差別僅僅在于程度的不同。大多數軟體都是由獨立的小組開發,且以源代碼的形式釋出出來。接下來,軟體庫收集這些源代碼,然後根據軟體庫為之服務的系統上的使用習慣,對其進行編譯,再把編譯結果打成軟體包。安裝針對特定系統的二進制軟體包通常要比取得并編譯原來的源代碼更容易。不過,打包軟體有時候要比目前版本落後一兩個版本号。

兩種系統使用相同的軟體打包系統不一定意味着兩個系統的軟體包能夠互換使用。例如,red hat和suse都使用rpm,但是它們的檔案系統布局卻稍有不同。如果能找到專為自己系統做的軟體包,那就用它們,這是最好的做法。

主流的linux發行版本都提供優異的軟體包管理體系,裡面包括能夠通路和搜尋internet上軟體庫的工具。發行商替社群積極維護這些軟體庫,是以linux系統管理者很少需要跳出自己系統上的預設軟體包管理器。生活真美好。

unix系統在軟體包管理方面顯得畏手畏尾。solaris、hp-ux和aix都提供打包軟體,在單機的層次上使用沒問題。但是,這些系統的廠商卻沒有維護開源軟體庫,而讓使用者群大多進行自我維護1。遺憾的是,維系一個打包軟體環境所依賴的紐帶之一,是有一條途徑可以讓軟體包可靠地檢索其他軟體包,進而掌握依賴性和相容性方面的資訊。沒有某種中心作為協調,整個體系就會很快分崩離析。

在現實世界裡,情形則各不相同。solaris有一套附加系統(blastwave.org的pkgutil),可以友善地從internet軟體庫安裝軟體,這和linux發行版本上自帶的系統很像。hp-ux有一個不錯的internet軟體庫,它采用了hp-ux移植和存檔中心(hp-ux porting and archiving centre)的形式,位址為hpux.connect.org.uk,但是必須手工逐個下載下傳軟體包。在這個領域内做得較差的典型,就是aix,給它預先打包好的軟體找起來很分散。

系統管理者沒找到打好包的二進制軟體,就必須采用老辦法安裝軟體:下載下傳一個tar源代碼包,手工配置、編譯和安裝它。這個過程可長可短,取決于具體軟體和作業系統。

在本書裡,我們一般認為可選軟體都已經裝好了,并不折磨讀者按生搬硬套的步驟去安裝每個軟體包。如果有可能發生混淆,我們有時候也會給出完成某個特定項目所需軟體包的确切名稱。但是,對于大部分内容來說,我們都不會重複講述安裝步驟,因為前後軟體包的安裝都很類似。

1.12.1 判斷軟體是否已經安裝

出于各種原因,要判斷實際需要的東西在哪個軟體包裡,需要有點兒小技巧。除了在軟體包的級别上查找之外,更簡單的做法是使用shell的which指令找出相關的二進制程式是否已經在搜尋路徑中。例如,下面的指令就揭示出已經在機器上安裝了gnu的c編譯器。

如果which沒有找到要找的指令,那麼試試whereis;該指令搜尋更大範圍的系統目錄,與shell的搜尋路徑無關。

另一種方法是采取作用非凡的locate指令,它參照預先編譯好的一個檔案系統索引,以此确定與特定模式相比對的檔案名。locate指令是gnu的findutils軟體包裡的一個程式,這個軟體包在大多數linux系統上都是預設包含的,但在unix系統上必須手工安裝。

locate的搜尋并不隻針對指令或者軟體包,而是能夠找到任何類型的檔案。例如,如果讀者不能确定在哪兒能找到頭檔案signal.h,可以試試:

locate的資料庫通常由updatedb指令定期更新,這條指令由cron來運作。是以,執行一次locate的結果不是總能夠反映出檔案系統新近的變化。

如果使用者知道正在查找的軟體包的名字,那麼也可以使用系統上的軟體包工具來直接檢查是否有該軟體包出現(以及已裝軟體的版本)。例如,在red hat或者suse系統上,下面的指令可以檢查是否有python腳本語言:

參考第12章,了解有關軟體包管理的更多知識。

1.12.2 增加新軟體

如果需要安裝額外的軟體,首先要确定相關軟體包的标準名稱。例如,需要把“我想裝locate”轉換為“我需要安裝findutils軟體包”,或者把“我要named”轉換為“我必須安裝bind”。在網上各種針對特定系統的索引能夠幫助做轉換,但是google通常更有效。例如,搜尋“locate指令”,就能直接找到若幹與之相關的讨論。如果是在unix上,那麼還需要輸入作業系統的名字。

一旦知道了相關軟體的确切名稱,就可以下載下傳并安裝它。在linux和安裝了pkgutil的solaris系統上,整個安裝過程通常用一條指令就夠了。對于hp-ux和aix而言,則要麼下載下傳預編譯好的二進制軟體包,要麼下載下傳項目的源代碼。如果是後者,需要通過google定位該項目的正式網站,然後從項目的鏡像站點之一下載下傳源代碼。

下面的例子展示了在我們的每一種示例系統上安裝wget指令。它是一個很棒的gnu工具,能夠把http和ftp下載下傳變成單條指令——對于腳本程式設計來說非常有用。我們所舉的每種linux系統預設都安裝了wget,但是下面給出的指令用于初始化安裝和後續更新。

ubuntu使用apt(debian advanced package tool,debian進階軟體包工具):

suse版的操作:

suse# yast --install wget <在一個基于終端的ui裡運作>

red hat版的操作:

在已經裝有pkgutil的solaris系統上(參考blastwave.org來了解配置說明):

對于hp-ux,我們在hpux.connect.org.uk上找到了一個适用的二進制軟體包,把它下載下傳到/tmp目錄下。解壓縮和安裝的指令如下:

在swinstall指令行裡出現的depot軟體包必須用/開頭的完整路徑;否則,swinstall就會到網絡上找檔案。最後的wget告訴swinstall從depot檔案裡安裝哪個軟體包。 遺憾的是,這個安裝過程沒有乍看上去那麼簡單。裝好的wget版本實際上無法運作,因為沒有裝它所依賴的幾個庫。

swinstall内置有依賴關系的管理機制,但是遺憾的是,它的這種功能不能延伸到internet上的軟體庫裡。使用者不得不根據提示安裝所有要求預裝的軟體包(本例中有6個之多)以達到最終目标。

1.12.3 從源代碼編譯軟體

實際上,wget至少存在一種可用于aix的二進制軟體包,它是rpm格式的。用google搜尋“aix wget rpm”應該就能找到一些不錯的線索。下載下傳下來之後,安裝指令很簡單

但為了示範,我們從源代碼開始編譯aix版本的wget。

我們的第一項任務是找到代碼,這很容易:用google搜尋“wget”得到的第一個結果就正好把我們指向gnu的wget項目,再點一下就能找到源代碼的tar包。把目前版本的代碼下載下傳到/tmp目錄裡,再解開、配置和安裝:

對于大多數unix和linux軟體來說,都可以依次執行configure/make/make install三條指令,隻要已經安裝了開發環境以及預先要求有的軟體包,就會得到結果。不過,最好檢視軟體包的install或者readme檔案,了解該軟體的特别之處。

在這個例子裡,configure指令的兩個選項--disable-ssl和--disable-nls省略了wget的一些特性,這些特性要依賴其他一些還沒有安裝的庫。在實際中,使用者可能想還是安裝要求預裝的那些庫。使用configure--help檢視所有的配置選項。另一個有用的配置選項是--prefix=directory,這個選項可以把軟體安裝到/usr/local之外的其他目錄裡。