專題:Windows 到 Linux 之旅:第 9 部分. 安裝軟體

來源:互聯網
上載者:User
使用先行編譯的 RPM 以及從原始碼編譯應用程式

層級:初級

Chris Walden (cmwalden-at-us.ibm.com)
電子商務架構師,IBM Developer Relations
2004 年 1 月

IBM 電子商務架構師 Chris Walden 將通過他在 developerWorks 上發表的九篇系列文章來指導您如何在 Linux 環境中運用您的 Windows 操作技巧。在這最後一部分中,我們將下載和編譯一個軟體包,討論自動化包管理的優點和缺點,同時瞭解 RPM 系統。

安裝 Linux 時首先注意到的事情之一,就是 Linux 發行版本中有如此多可用的包。大多數發行版本都附帶了 Linux 作業系統、安裝工具和管理工具。它們還包括 Internet 工具、開發工具、辦公工具、遊戲,以及一些您不曾聽說過的程式。Linux 發行版本附帶數千個 可用包的情況並不鮮見。如果您沒有選擇“完整安裝”,則只會安裝這些包的一個子集。

現在您可能想知道“如何刪除不想要的包?如何安裝遺漏了的包?是否能夠使用不是該發行版本附帶的軟體?”

RPM
在安裝 Linux 時,您或許會注意到關於正在安裝的 RPM 的許多資訊。RPM 代表 RedHat Package Manager(Redhat 包管理器),這是 RedHat 的貢獻,現在已成為管理 RedHat 和 UnitedLinux 以及其他許多發行版本上的軟體的標準。

RPM 本質上就是一個包,包含可以立即在特定機器體繫結構上安裝和啟動並執行 Linux 軟體。例如,在“第 3 部分. Webmin 簡介”中,我們通過一個 RPM 安裝了 Webmin 包。最初載入到發行版本中的所有軟體都是通過一個 RPM 來安裝的。

RPM 剖析
RPM 是檔案包。它包括的 .spec 檔案提供了關於包及其功能和依賴關係(即在該包能夠運行之前必須安裝其他哪些包)的資訊。.spec 還包含包中的檔案清單,指定這些檔案必須載入到系統中的何處,以及它們的初始許可權如何。RPM 還包含安裝前指令碼,這是由包開發人員編寫的。RPM 其次還包含編譯的二進位檔案。最後,RPM 包含了安裝後指令碼。

RPM 結構

.spec 安裝前指令碼 二進位檔案 二進位檔案 ... 二進位檔案 安裝後指令碼

在安裝 RPM 時,系統首先檢查該包的依賴關係是否得到滿足。如果不滿足, 安裝過程就會終止,除非您指定了迫使安裝無論如何都要繼續的選項。

如果一切順利,安裝前指令碼就會運行。這個指令碼可以做任何事情。它通常建立使用者和目錄。然而,它可以做許多類型的動態配置,甚至以自訂的方式編譯運行系統的原始碼。

瞭解 RPM 來自何處
RPM 在安裝時將檔案複製到您的系統上,並執行指令碼。由於 RPM 是以 root 身份啟動並執行,因此所有這些功能都以 root 身份執行。因而在將某個 RPM 安裝到系統之前,知道它的由來是很重要的。就像許多 Windows 軟體一樣,惡意的代碼可以像包含在其他包中一樣容易地包含在 RPM 中。來自廠商的 RPM 一般都是安全的,但是要對從未知來源隨機下載和安裝的內容保持警惕。

如果安裝前指令碼成功完成,二進位檔案將依照清單被複製到系統上。在複製完所有的檔案和設定了它們的許可權之後,安裝後指令碼就會運行。同樣,這個指令碼幾乎能夠做任何事情。

一旦完成所有這些步驟,關於包的資訊就被添加到 RPM 資料庫,安裝過程就完成了。使用這種簡單的機制,您能夠執行通過更完善的商業安裝程式所能執行的所有功能。

RPM 資料庫
RPM 的優雅之處是 RPM 資料庫。這個資料庫通常位於 /var/lib/rpm 目錄,它包含關於系統上已安裝的每個 RPM 的資訊。這個資料庫知道包之間的依賴關係,當刪除某個包將導致其他包無法工作時,它將發出警告。這個資料庫知道最初隨某個包安裝的每個檔案以及這些檔案在系統上的最初狀態。它還知道每個包的文檔和設定檔的位置。這聽起來好像是大量的資訊,事實上確實如此。但它並不是過多而龐大的。在一個包含 1,066 個包、由 203,272 個檔案組成的系統上,資料庫檔案僅有 45 MB!在載入和卸載包時,RPM 使用這個資料庫來檢查依賴關係。使用者還可以在這個資料庫中查詢關於包的資訊。

使用 RPM
配合 RPM 包使用的程式被相應地命名為 rpmrpm 以多種不同的模式運行,不過最常見的任務是安裝、升級、查詢、驗證和刪除。

rpm -i (裝)
在第一次安裝某個包時,您要使用 -i 或安裝模式。只需將 rpm 指向某個二進位包並執行它, rpm 就會把該包安裝到您的系統上。安裝過程一般只需幾秒鐘。我經常會在安裝包時使用 -v(詳細)開關來提供關於該過程的更多資訊,以及使用 -h(雜湊線)開關來通過輸出在控制台上的雜湊(#)符號提供安裝進度更新。下面是安裝某個包的例子:

清單 1. 安裝 MyPackage

$ rpm -ivh MyPackage-1.0.0.i386.rpmPreparing...                ########################################### [100%]   1:MyPackage              ########################################### [100%]

就是這個樣子!MyPackage 現在已經安裝完成,可供使用了。

rpm 必須以 root 身份運行
必須以 root 身份執行 rpm 安裝和刪除,因為需要訪問檔案系統和 rpm 資料庫。

rpm -e (刪除)
要刪除已安裝的包,可使用 -e 開關。rpm 將使用資料庫來刪除該包的所有檔案。如果有已安裝的其他包依賴正在刪除的包,rpm 將會異常退出。您必須使用 nodeps 開關來執行強制移除(nodeps 還可以用於強制安裝)。在使用這個開關來強制安裝或刪除時,務必 非常 小心。刪除其他包所依賴的包,可能會導致災難性的結果。下面這個命令刪除我們在上面安裝的包:

$ rpm -e MyPackage

注意,包的刪除並不一定需要它的完整名稱(包括版本號碼)。安裝時需要完整名稱,因為我們是在引用一個檔案名稱。已安裝的包僅通過它們的名稱來引用。包的名稱是版本號碼之前的所有內容。

rpm -V(驗證)
驗證開關非常有用。它將包檔案的目前狀態與它們在安裝時的原始狀態作比較。兩種狀態之間的區別將用一個代碼來顯示:

檔案驗證結果

S 檔案大小不一致
M 模式不一致(包括許可權和檔案類型)
5 MD5 校正和不一致
D 裝置主要/次要編號不匹配
L readLink(2) 路徑不匹配
U 使用者擁有關係不一致
G 群組擁有關係不一致
T mTime 不一致

如果您對某個包運行 rpm -V,並且發現某個可執行檔的大小發生了變化,那可能就是安全性漏洞的徵兆。

rpm -U(升級)
一旦某個包已經安裝,嘗試安裝具有相同名稱的包將產生一條訊息,指出該包已經安裝。 如果想要將某個包升級到更新的版本,可使用 -U 開關來升級。升級還具有另一個影響。當對多個包名稱運行升級時,它將設法按依賴關係的順序放置包。換句話說,必需的包將首先安裝。不管某個包是否已經安裝,都可以對它使用升級開關,許多人使用它而不是使用 -i 開關來執行安裝和升級。下面是使用升級開關來載入多個 rpm 包的例子:

清單 2. 互動式升級

$ rpm -Uvh My*.rpmPreparing...                ########################################### [100%]   1:bMyPackageDep          ########################################### [ 50%]   1:aMyPackageNew          ########################################### [100%]

在上面的例子中,bMyPackageDep 是 aMyPackageNew 的前提條件,因此儘管檔案名稱以相反的順序排列,rpm 也會對它們正確排序。

rpm -q(查詢)
可以從 rpm 資料庫中查詢多種有用的資訊。對 rpm 資料庫擁有讀存取權限的任何使用者都能夠執行查詢。預設情況下,全部使用者都擁有讀存取權限。要運行一個查詢,可使用 -q 開關帶上要查詢的包的名稱。這樣將返回該包的版本。

$ rpm -q MyPackage
MyPackage-1.0.0

包的名稱必須精確匹配,不允許使用萬用字元。然而,如果記不住包的完整名稱,您可以使用 grep 工具來協助找到它。可以使用 -qa 開關來查詢所有已安裝的包,並用 grep 來管道輸出您能記住的資訊。例如:

grep 之樂
grep 是一個具有廣泛用途的文本搜尋工具。預設情況下,grep 將搜尋檔案以顯示您指定的行。在這裡的例子中,它搜尋單詞“IBM”。grep 是指令碼編寫和控制台工作方面的一個強大工具。

$ rpm -qa | grep IBM
IBMWSAppDev-Product-5.0-0
IBMWSSiteDevExp-Core-5.0-0
IBMWSSiteDev-Core-5.0-0
IBMWSTools-WAS-BASE-V5-5.0-0
IBMJava118-SDK-1.1.8-5.0
IBMWSWB-samples-5.0-0
IBMWSWB-5.0-0
IBMWSAppDev-Core-5.0-0
IBMWSAppDev-5.0-0
IBMWSTools-5.0-0

除了版本號碼外,rpm -q 還可以提供關於包的其他有用資訊。下面就是這樣一些例子:

使用 rpm 查詢擷取資訊

rpm -q changelog 顯示包的開發變更記錄
rpm -qc 顯示包的設定檔
rpm -qd 顯示包的文檔檔案
rpm -qi 顯示包描述
rpm -ql 顯示包的檔案的列表
rpm -qR 顯示包的依賴關係

還有另一個有趣的查詢命令,它針對檔案而不是針對包運行。

rpm -q whatprovides <filename>

上面這個命令將識別與給定的 filename(檔案名稱)相關聯的包。filename 必須包括檔案的絕對路徑,因為資訊就是以這種方式儲存在 rpm 資料庫中的。

RPM 前端
從控制台操作 rpm 很容易,但有時使用圖形化使用者介面會更方便。在典型的 Linux 風格中,有一些前端程式為 rpm 程式提供介面。每種發行版本都有一個前端,但是它們各不相同。請參考您的發行版本文擋,以瞭解關於所提供的包管理工具的資訊。

Webmin 軟體包
Webmin 也為處理 RPM 包提供了一個基於 Web 的簡單前端。

圖 1. Webmin RPM 介面

軟體可以從這個介面容易地安裝、刪除和查詢。還可以直接從 URL 網站安裝軟體。如果安裝了諸如 apt 或 RedHat Network 之類的 rpm 增強工具,Webmin 將識別它們並為它們提供一個介面。

原始碼
由於 Linux 是開放原始碼的作業系統,它附帶了編譯軟體所需的所有開發工具。雖然您使用的大多數包將以二進位 RPM 的形式提供,但是您並不僅限於使用那些包。如果願意,您可以為您的系統下載原始原始碼,並以自訂的方式進行編譯。

應該對在生產系統上編譯原始碼保持謹慎,因為這樣可能導致問題,或者不再支援系統上正在使用的商業軟體(比如 IBM DB2)。然而,熟悉從原始碼編譯軟體的過程將使您能夠對軟體應用補丁,以及使用從其他環境移植過來的包。一旦成功地編譯代碼,建立您自己的 RPM 也是可以做到的!

Corewars 原始碼示範
為示範從原始碼編譯軟體有多簡單,我們將編譯一個名為 Corewars 的類比遊戲(請參閱 參考資料)。下面是來自他們 Web 網站的關於 Corewars 的說明:“Corewars 是一款類比遊戲,其中許多武士在虛擬電腦中奔跑時竭力相互攻擊對方。可以採用兩種類似組譯工具的語言中的一種來編寫武士程式,這兩種語言分別叫做 Corewars 和 Redcode。Corewars 是預設語言,更易於學習和理解。Redcode 提供更進階和更強大的指令,但是需要更多的時間來學習。”

編譯原始碼的第一步是從 Web 網站下載原始碼包:

  • http://download.sourceforge.net/corewars/corewars-0.9.13.tar.gz

在代碼下載完成之後,需要展開這個包。

tar -xvzf corewars-0.9.13.tar.gz

檔案將展開到目前的目錄。標準的做法是將原始碼包含在一個與產品名稱匹配的目錄中。在此例中,原始碼位於一個名為 corewars-0.9.13 的目錄。

首先進入該目錄,找到原始碼和一些文檔、配置指令碼和 README 檔案。大多數原始碼包都帶有一個名為 INSTALL 和一個名為 README 的檔案。您應該在編譯軟體之前首先閱讀這些材料。它們在問題出現之前識別問題,並為您建議正確的編譯和安裝步驟,這樣通常可以讓您少走許多彎路。我在編譯原始碼時遇到的大多數問題都是因為我沒有遵循那些指導。

通常執行的下一步是運行 configure 指令碼。configure 是 Autoconf 包的一部分,包括在 Linux 發行版本的開發工具中。這裡引用一段 Autoconf 的包描述:“GNU 的 Autoconf 是一個用於配置原始碼和 Makefile 的工具。通過使用 Autoconf,程式員能夠建立可移植和可配置的包,因為建立包的人可以指定各種配置選項。”

configure 指令碼在系統上運行一系列測試,以確定為您的發行版本和系統體繫結構編譯包的最佳方式。然後它為您的系統建立一個定製的 Makefile。如果在您的系統上編譯時間遇到問題,configure 將會告訴您。configure 通常允許您自訂將要在編譯中包括的特性,或允許您提供關於庫或者其他必需檔案的位置參數,以便能夠成功地編譯包。下面我們將不帶參數執行 configure

./configure

在系統上多執行幾次測試,最終就會編譯成功。下面使用如下命令來產生程式:

make

如果編譯有錯誤,就需要確定問題並修複它們。這可能是一件繁瑣的任務,也許需要關於環境和程式設計的大量一般知識。如果一切順利,我們一般會使用以下命令來安裝軟體:

make install

檔案將被複製到系統中的正確位置,檔案許可權會被更新,設定檔將被複製,文檔也會被添加到手冊頁。

現在通過執行該程式來測試我們的勞動成果。它是一個圖形化的程式,因此要在啟動它前運行 X 系統。上面執行的 make install 命令應該已將程式放到了可執行檔路徑中。

corewars

作為對我們的獎賞,一個圖形化的螢幕應該會出現。

圖 2. 大功告成!

corewars 規則的主題超出了本文的討論範圍,不過您會在手冊頁(man corewars)中找到關於這款有趣的類比遊戲的文檔。

corewars 的編譯是一個典型的情境。可能會有其他許多種變化形式,包括在 configure 指令碼上使用開關來調整要編譯到程式中的特性,以及從 Makefile 使用不同的命令來調整編譯方式,等等。

由於這個程式不是使用 rpm 來安裝的,因此 rpm 資料庫中沒有相應的條目。如果某個程式在安裝後沒有按預期運行,大多數 Makefile 都包括了一個卸載參數來刪除軟體:

make uninstall

務必牢記,使用原始原始碼不會在 RPM 資料庫中添加任何內容。以這種方式安裝的軟體是非託管的(unmanaged),因此應該小心進行。

原始碼 RPM
當 RPM 被建立時,還有一個稱作原始碼 RPM 的產物。這是一個與原始碼組合在一起的 SPEC 檔案,設計它的目的是為了在一個或多個體繫結構上產生程式。這對原始碼和二進位這兩個世界來說是最佳的!對於原始碼 RPM,您可以在系統上定製編譯軟體,但是完成的產品將是一個可安裝的 RPM,而不是原始的二進位。以先行編譯 RPM 的形式可用的大多數包還以 SRPM 的形式可用。這也許是在 Linux 中軟體跨平台轉移的簡單途徑。當您在一個不同的平台上成功地重新編譯時間,可考慮與整個開發社區共用完成的 RPM。

也許原始碼更適合您
如果您是 Linux 新手,安裝軟體的方法與您過去習慣使用的方法不同。然而,RPM 安裝方法是優雅的,同時提供了您很快就會欣賞的新能力。

您應該熟悉從控制台使用 rpm 的選項,不過對於日常使用,有一些前端介面選項使得 rpm 更易於管理。您的發行版本提供了這樣一個介面,也有其他類似的介面可供使用,比如 Webmin 中的那一個介面。

您並不僅限於使用先行編譯的 rpm,還可以利用 Linux 的開放原始碼性質,直接從原始碼編譯應用程式。對於成熟的項目,編譯通常是很容易的。記住,從原始碼安裝的代碼在 rpm 資料庫中沒有相應的條目。在使用原始碼時,可考慮使用原始碼 rpm,它組合了已編譯原始碼的強大能力和 rpm 的可管理性。

參考資料

  • 閱讀 Windows 到 Linux 之旅系列文章 的其他部分(developerWorks,2003 年 11 月)。

  • IBM developerWorks 教程 LPI certification 102 exam prep, Part 1: Compiling sources and managing packages 介紹了 Red Hat 和 Debian 包管理器,以及從原始碼編譯器和管理共用庫。
  • IBM developerWorks 教程 Compiling and installing software from sources 深入討論瞭解包、檢查、配置和從原始碼安裝軟體包。
  • IBM developerWorks 教程 LPI認證102考試準備,第 2 部分:配置與編譯核心 介紹了重要的核心配置和核心中的 PCI 和 USB 支援。
  • 通過 IBM developerWorks 特輯 Compiling and installing software from sources ,學習關於 Linux 上的原始碼編譯和安裝的更多知識。
  • 通過 IBM developerWorks 特輯 建立 Debian Linux 軟體包 和 用 RPM 打包軟體 學習如何建立您自己的包。
  • 在 IBM developerWorks 特輯 使用 Stow 管理軟體包 中瞭解 RPM 和 Debian 的包管理解決方案的替代方案。
  • 經常升級軟體是保證安全的重要部分。通過 IBM developerWorks 關於技巧:從原始碼開始升級應用程式的技巧,瞭解如何方便快捷地保持系統處於最新。
  • 在此 IBM developerWorks 特輯中瞭解關於 United Linux 的更多資訊。
  • SourceForge 是開放原始碼項目的優秀參考資料;您也可以添加自己的項目。
  • Corewars project 只是 SourceForge 上公布的許多項目中的一個。
  • developerWorks 開放原始碼專區 託管了 IBM 的一個開放原始碼項目。
  • IBM 的 alphaWorks 允許方便地訪問新興的 IBM 技術,包括諸如 Web 服務和網格工具箱之類的內容。
  • IBM 提供 Toolbox 訂閱 ,突出了訪問核心 IBM 工具、中介軟體和技術的單使用者、低成本許可證特色。
  • IBM 為您的 Linux 應用開發加油提速 計劃提供免費的 Linux 軟體評估包(SEK),其中包括 DB2 Universal Database、WebSphere Application Server、WebSphere Studio Site Developer、WebSphere MQ、Lotus Domino、Tivoli Access Manager……,等等!
關於作者
Chris Walden 是位於德克薩斯州奧斯汀的 IBM Developer Relations Technical Consulting(也稱為 dragonslayers)的一名電子商務架構師,該公司為 IBM 商業夥伴提供教育、實現和諮詢。他致力於 Linux 相關工作,一有機會就向身邊的人宣傳 Linux 的種種好處。除了完成他的架構師的職責之外,他還精通 Linux 基礎設施伺服器的各個領域,包括混合平台使用者環境下的檔案、列印以及其他應用服務等。Chris 有 10 年的電腦行業經驗,從現場支援到 Web 應用程式開發和顧問,各個領域他都曾涉足。您可以通過 cmwalden-at-us.ibm.com 與 Chris 聯絡。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.