鳥哥的 Linux 私房菜
<<

第二十二章、軟體安裝 RPM, SRPM 與 YUM

最近更新日期:2015/10/16

雖然使用原始碼進行軟體編譯可以具有客製化的設定,但對於 Linux distribution 的發佈商來說,則有軟體管理不易的問題, 畢竟不是每個人都會進行原始碼編譯的。如果能夠將軟體預先在相同的硬體與作業系統上面編譯好才發佈的話, 不就能夠讓相同的 distribution 具有完全一致的軟體版本嗎?如果再加上簡易的安裝/移除/管理等機制的話, 對於軟體控管就會簡易的多。有這種東西嗎?有的,那就是 RPM 與 YUM 這兩個好用的咚咚。 既然這麼好用,我們當然不能錯過學習機會囉!趕緊來參詳參詳!

22.1 軟體管理員簡介

在前一章我們提到以原始碼的方式來安裝軟體,也就是利用廠商釋出的 Tarball 來進行軟體的安裝。不過,你應該很容易發現,那就是每次安裝軟體都需要偵測作業系統與環境、設定編譯參數、實際的編譯、 最後還要依據個人喜好的方式來安裝軟體到定位。這過程是真的很麻煩的,而且對於不熟整個系統的朋友來說,還真是累人啊!

那有沒有想過,如果我的 Linux 系統與廠商的系統一模一樣,那麼在廠商的系統上面編譯出來的執行檔, 自然也就可以在我的系統上面跑囉!也就是說,廠商先在他們的系統上面編譯好了我們使用者所需要的軟體, 然後將這個編譯好的可執行的軟體直接釋出給使用者來安裝,如此一來,由於我們本來就使用廠商的 Linux distribution ,所以當然系統 (硬體與作業系統) 是一樣的,那麼使用廠商提供的編譯過的可執行檔就沒有問題啦! 說的比較白話一些,那就是利用類似 Windows 的安裝方式,由程式開發者直接在已知的系統上面編譯好,再將該程式直接給使用者來安裝,如此而已。

那麼如果在安裝的時候還可以加上一些與這些程式相關的資訊,將他建立成為資料庫,那不就可以進行安裝、反安裝、 升級與驗證等等的相關功能囉 (類似 Windows 底下的『新增移除程式』)?確實如此,在 Linux 上面至少就有兩種常見的這方面的軟體管理員,分別是 RPM 與 Debian 的 dpkg 。我們的 CentOS 主要是以 RPM 為主,但也不能不知道 dpkg 啦!所以底下就來約略介紹一下這兩個玩意兒。

22.1.1 Linux 界的兩大主流: RPM 與 DPKG

由於自由軟體的蓬勃發展,加上大型 Unix-Like 主機的強大效能,讓很多軟體開發者將他們的軟體使用 Tarball 來釋出。 後來 Linux 發展起來後,由一些企業或社群將這些軟體收集起來製作成為 distributions 以發佈這好用的 Linux 作業系統。但後來發現到,這些 distribution 的軟體管理實在傷腦筋, 如果軟體有漏洞時,又該如何修補呢?使用 tarball 的方式來管理嗎?又常常不曉得到底我們安裝過了哪些程式? 因此,一些社群與企業就開始思考 Linux 的軟體管理方式。

如同剛剛談過的方式,Linux 開發商先在固定的硬體平台與作業系統平台上面將需要安裝或升級的軟體編譯好, 然後將這個軟體的所有相關檔案打包成為一個特殊格式的檔案,在這個軟體檔案內還包含了預先偵測系統與相依軟體的腳本, 並提供記載該軟體提供的所有檔案資訊等。最終將這個軟體檔案釋出。用戶端取得這個檔案後,只要透過特定的指令來安裝, 那麼該軟體檔案就會依照內部的腳本來偵測相依的前驅軟體是否存在,若安裝的環境符合需求,那就會開始安裝, 安裝完成後還會將該軟體的資訊寫入軟體管理機制中,以達成未來可以進行升級、移除等動作呢。

目前在 Linux 界軟體安裝方式最常見的有兩種,分別是:

  • dpkg
    這個機制最早是由 Debian Linux 社群所開發出來的,透過 dpkg 的機制, Debian 提供的軟體就能夠簡單的安裝起來,同時還能提供安裝後的軟體資訊,實在非常不錯。 只要是衍生於 Debian 的其他 Linux distributions 大多使用 dpkg 這個機制來管理軟體的, 包括 B2D, Ubuntu 等等。

  • RPM
    這個機制最早是由 Red Hat 這家公司開發出來的,後來實在很好用,因此很多 distributions 就使用這個機制來作為軟體安裝的管理方式。包括 Fedora, CentOS, SuSE 等等知名的開發商都是用這咚咚。

如前所述,不論 dpkg/rpm 這些機制或多或少都會有軟體屬性相依的問題,那該如何解決呢? 其實前面不是談到過每個軟體檔案都有提供相依屬性的檢查嗎?那麼如果我們將相依屬性的資料做成列表, 等到實際軟體安裝時,若發生有相依屬性的軟體狀況時,例如安裝 A 需要先安裝 B 與 C ,而安裝 B 則需要安裝 D 與 E 時,那麼當你要安裝 A ,透過相依屬性列表,管理機制自動去取得 B, C, D, E 來同時安裝, 不就解決了屬性相依的問題嗎?

沒錯!您真聰明!目前新的 Linux 開發商都有提供這樣的『線上升級』機制,透過這個機制, 原版光碟就只有第一次安裝時需要用到而已,其他時候只要有網路,你就能夠取得原本開發商所提供的任何軟體了呢! 在 dpkg 管理機制上就開發出 APT 的線上升級機制,RPM 則依開發商的不同,有 Red Hat 系統的 yum , SuSE 系統的 Yast Online Update (YOU) 等。

distribution 代表軟體管理機制使用指令線上升級機制(指令)
Red Hat/FedoraRPMrpm, rpmbuildYUM (yum)
Debian/UbuntuDPKGdpkgAPT (apt-get)

我們這裡使用的是 CentOS 系統嘛!所以說:使用的軟體管理機制為 RPM 機制,而用來作為線上升級的方式則為 yum !底下就讓我們來談談 RPM 與 YUM 的相關說明吧!



22.1.2 什麼是 RPM 與 SRPM

RPM 全名是『 RedHat Package Manager 』簡稱則為 RPM 啦!顧名思義,當初這個軟體管理的機制是由 Red Hat 這家公司發展出來的。 RPM 是以一種資料庫記錄的方式來將你所需要的軟體安裝到你的 Linux 系統的一套管理機制。

他最大的特點就是將你要安裝的軟體先編譯過, 並且打包成為 RPM 機制的包裝檔案,透過包裝好的軟體裡頭預設的資料庫記錄, 記錄這個軟體要安裝的時候必須具備的相依屬性軟體,當安裝在你的 Linux 主機時, RPM 會先依照軟體裡頭的資料查詢 Linux 主機的相依屬性軟體是否滿足, 若滿足則予以安裝,若不滿足則不予安裝。那麼安裝的時候就將該軟體的資訊整個寫入 RPM 的資料庫中,以便未來的查詢、驗證與反安裝!這樣一來的優點是:

  1. 由於已經編譯完成並且打包完畢,所以軟體傳輸與安裝上很方便 (不需要再重新編譯);
  2. 由於軟體的資訊都已經記錄在 Linux 主機的資料庫上,很方便查詢、升級與反安裝

但是這也造成些許的困擾。由於 RPM 檔案是已經包裝好的資料,也就是說, 裡面的資料已經都『編譯完成』了!所以,該軟體檔案幾乎只能安裝在原本預設的硬體與作業系統版本中。 也就是說,你的主機系統環境必須要與當初建立這個軟體檔案的主機環境相同才行! 舉例來說,rp-pppoe 這個 ADSL 撥接軟體,他必須要在 ppp 這個軟體存在的環境下才能進行安裝!如果你的主機並沒有 ppp 這個軟體,那麼很抱歉,除非你先安裝 ppp 否則 rp-pppoe 就是不讓你安裝的 (當然你可以強制安裝,但是通常都會有點問題發生就是了!)。

所以,通常不同的 distribution 所釋出的 RPM 檔案,並不能用在其他的 distributions 上。舉例來說,Red Hat 釋出的 RPM 檔案,通常無法直接在 SuSE 上面進行安裝的。更有甚者,相同 distribution 的不同版本之間也無法互通,例如 CentOS 6.x 的 RPM 檔案就無法直接套用在 CentOS 7.x !因此,這樣可以發現這些軟體管理機制的問題是:

  1. 軟體檔案安裝的環境必須與打包時的環境需求一致或相當;
  2. 需要滿足軟體的相依屬性需求;
  3. 反安裝時需要特別小心,最底層的軟體不可先移除,否則可能造成整個系統的問題!

那怎麼辦?如果我真的想要安裝其他 distributions 提供的好用的 RPM 軟體檔案時? 呵呵!還好,還有 SRPM 這個東西!SRPM 是什麼呢?顧名思義,他是 Source RPM 的意思,也就是這個 RPM 檔案裡面含有原始碼哩!特別注意的是,這個 SRPM 所提供的軟體內容『並沒有經過編譯』, 它提供的是原始碼喔!

通常 SRPM 的副檔名是以 ***.src.rpm 這種格式來命名的。不過,既然 SRPM 提供的是原始碼,那麼為什麼我們不使用 Tarball 直接來安裝就好了?這是因為 SRPM 雖然內容是原始碼, 但是他仍然含有該軟體所需要的相依性軟體說明、以及所有 RPM 檔案所提供的資料。同時,他與 RPM 不同的是,他也提供了參數設定檔 (就是 configure 與 makefile)。所以,如果我們下載的是 SRPM ,那麼要安裝該軟體時,你就必須要:

  • 先將該軟體以 RPM 管理的方式編譯,此時 SRPM 會被編譯成為 RPM 檔案;
  • 然後將編譯完成的 RPM 檔案安裝到 Linux 系統當中

怪了,怎麼 SRPM 這麼麻煩吶!還要重新編譯一次,那麼我們直接使用 RPM 來安裝不就好了?通常一個軟體在釋出的時候,都會同時釋出該軟體的 RPM 與 SRPM 。我們現在知道 RPM 檔案必須要在相同的 Linux 環境下才能夠安裝,而 SRPM 既然是原始碼的格式,自然我們就可以透過修改 SRPM 內的參數設定檔,然後重新編譯產生能適合我們 Linux 環境的 RPM 檔案,如此一來,不就可以將該軟體安裝到我們的系統當中,而不必與原作者打包的 Linux 環境相同了?這就是 SRPM 的用處了!

檔案格式檔名格式直接安裝與否內含程式類型可否修改參數並編譯
RPMxxx.rpm已編譯不可
SRPMxxx.src.rpm不可未編譯之原始碼

Tips鳥哥的圖示 為何說 CentOS 是『社群維護的企業版』呢? Red Hat 公司的 RHEL 釋出後,連帶會將 SRPM 釋出。 社群的朋友就將這些 SRPM 收集起來並重新編譯成為所需要的軟體,再重複釋出成為 CentOS,所以才能號稱與 Red Hat 的 RHEL 企業版同步啊!真要感謝 SRPM 哩!如果你想要理解 CentOS 是如何編譯一支程式的, 也能夠透過學習 SRPM 內含的編譯參數,來學習的啊!



22.1.3 什麼是 i386, i586, i686, noarch, x86_64

從上面的說明,現在我們知道 RPM 與 SRPM 的格式分別為:

xxxxxxxxx.rpm   <==RPM 的格式,已經經過編譯且包裝完成的 rpm 檔案;
xxxxx.src.rpm   <==SRPM的格式,包含未編譯的原始碼資訊。

那麼我們怎麼知道這個軟體的版本、適用的平台、編譯釋出的次數呢?只要透過檔名就可以知道了!例如 rp-pppoe-3.11-5.el7.x86_64.rpm 這的檔案的意義為:

rp-pppoe -        3.11   -     5        .el7.x86_64  .rpm
軟體名稱   軟體的版本資訊 釋出的次數 適合的硬體平台 副檔名

除了後面適合的硬體平台與副檔名外,主要是以『-』來隔開各個部分,這樣子可以很清楚的發現該軟體的名稱、 版本資訊、打包次數與操作的硬體平台!好了,來談一談每個不同的地方吧:

  • 軟體名稱
    當然就是每一個軟體的名稱了!上面的範例就是 rp-pppoe 。

  • 版本資訊
    每一次更新版本就需要有一個版本的資訊,否則如何知道這一版是新是舊?這裡通常又分為主版本跟次版本。以上面為例,主版本為 3 ,在主版本的架構下更動部分原始碼內容,而釋出一個新的版本,就是次版本啦!以上面為例,就是 11 囉!所以版本名就為 3.11

  • 釋出版本次數
    通常就是編譯的次數啦!那麼為何需要重複的編譯呢?這是由於同一版的軟體中,可能由於有某些 bug 或者是安全上的顧慮,所以必須要進行小幅度的 patch 或重設一些編譯參數。 設定完成之後重新編譯並打包成 RPM 檔案!因此就有不同的打包數出現了!

  • 操作硬體平台
    這是個很好玩的地方,由於 RPM 可以適用在不同的操作平台上,但是不同的平台設定的參數還是有所差異性! 並且,我們可以針對比較高階的 CPU 來進行最佳化參數的設定,這樣才能夠使用高階 CPU 所帶來的硬體加速功能。 所以就有所謂的 i386, i586, i686, x86_64 與 noarch 等的檔案名稱出現了!

    平台名稱適合平台說明
    i386 幾乎適用於所有的 x86 平台,不論是舊的 Pentium 或者是新的 Intel Core 2 與 K8 系列的 CPU 等等,都可以正常的工作!那個 i 指的是 Intel 相容的 CPU 的意思,至於 386 不用說,就是 CPU 的等級啦!
    i586 就是針對 586 等級的電腦進行最佳化編譯。那是哪些 CPU 呢?包括 Pentium 第一代 MMX CPU, AMD 的 K5, K6 系列 CPU (socket 7 插腳) 等等的 CPU 都算是這個等級;
    i686 在 Pentium II 以後的 Intel 系列 CPU ,及 K7 以後等級的 CPU 都屬於這個 686 等級! 由於目前市面上幾乎僅剩 P-II 以後等級的硬體平台,因此很多 distributions 都直接釋出這種等級的 RPM 檔案。
    x86_64 針對 64 位元的 CPU 進行最佳化編譯設定,包括 Intel 的 Core 2 以上等級 CPU ,以及 AMD 的 Athlon64 以後等級的 CPU ,都屬於這一類型的硬體平台。
    noarch 就是沒有任何硬體等級上的限制。一般來說,這種類型的 RPM 檔案,裡面應該沒有 binary program 存在, 較常出現的就是屬於 shell script 方面的軟體。

    截至目前為止 (2015),就算是舊的個人電腦系統,堪用與能用的設備大概都至少是 Intel Core 2 以上等級的電腦主機,泰半都是 64 位元的系統了! 因此目前 CentOS 7 僅推出 x86_64 的軟體版本,並沒有提供 i686 以下等級的軟體了!如果你的系統還是很老舊的機器, 那才有可能不支援 64 位元的 Linux 系統。此外,目前僅存的軟體版本大概也只剩下 i686 及 x86_64 還有不分版本的 noarch 而已, i386 只有在某些很特別的軟體上才看到的到啦!

    受惠於目前 x86 系統的支援方面,新的 CPU 都能夠執行舊型 CPU 所支援的軟體,也就是說硬體方面都可以向下相容的, 因此最低等級的 i386 軟體可以安裝在所有的 x86 硬體平台上面,不論是 32 位元還是 64 位元。但是反過來說就不行了。舉例來說,目前硬體大多是 64 位元的等級,因此你可以在該硬體上面安裝 x86_64 或 i386 等級的 RPM 軟體。但在你的舊型主機,例如 P-III/P-4 32 位元機器上面,就不能夠安裝 x86_64 的軟體!

根據上面的說明,其實我們只要選擇 i686 版本來安裝在你的 x86 硬體上面就肯定沒問題。但是如果強調效能的話, 還是選擇搭配你的硬體的 RPM 檔案吧!畢竟該軟體才有針對你的 CPU 硬體平台進行過參數最佳化的編譯嘛!



22.1.4 RPM 的優點

由於 RPM 是透過預先編譯並打包成為 RPM 檔案格式後,再加以安裝的一種方式,並且還能夠進行資料庫的記載。 所以 RPM 有以下的優點:

  • RPM 內含已經編譯過的程式與設定檔等資料,可以讓使用者免除重新編譯的困擾;
  • RPM 在被安裝之前,會先檢查系統的硬碟容量、作業系統版本等,可避免檔案被錯誤安裝;
  • RPM 檔案本身提供軟體版本資訊、相依屬性軟體名稱、軟體用途說明、軟體所含檔案等資訊,便於瞭解軟體;
  • RPM 管理的方式使用資料庫記錄 RPM 檔案的相關參數,便於升級、移除、查詢與驗證。

為什麼 RPM 在使用上很方便呢?我們前面提過, RPM 這個軟體管理員所處理的軟體,是由軟體提供者在特定的 Linux 作業平台上面將該軟體編譯完成並且打包好。那使用者只要拿到這個打包好的軟體, 然後將裡頭的檔案放置到應該要擺放的目錄,不就完成安裝囉?對啦!就是這樣!

但是有沒有想過,我們在前一章裡面提過的,有些軟體是有相關性的,例如要安裝網路卡驅動程式,就得要有 kernel source 與 gcc 及 make 等軟體。那麼我們的 RPM 軟體是否一定可以安裝完成呢?如果該軟體安裝之後,卻找不到他相關的前驅軟體, 那不是挺麻煩的嗎?因為安裝好的軟體也無法使用啊!

為了解決這種具有相關性的軟體之間的問題 (就是所謂的軟體相依屬性),RPM 就在提供打包的軟體時,同時加入一些訊息登錄的功能,這些訊息包括軟體的版本、 打包軟體者、相依屬性的其他軟體、本軟體的功能說明、本軟體的所有檔案記錄等等,然後在 Linux 系統上面亦建立一個 RPM 軟體資料庫,如此一來,當你要安裝某個以 RPM 型態提供的軟體時,在安裝的過程中, RPM 會去檢驗一下資料庫裡面是否已經存在相關的軟體了, 如果資料庫顯示不存在,那麼這個 RPM 檔案『預設』就不能安裝。呵呵!沒有錯,這個就是 RPM 類型的檔案最為人所詬病的『軟體的屬性相依』問題啦!



22.1.5 RPM 屬性相依的克服方式: YUM 線上升級

為了重複利用既有的軟體功能,因此很多軟體都會以函式庫的方式釋出部分功能,以方便其他軟體的呼叫應用, 例如 PAM 模組的驗證功能。此外,為了節省使用者的資料量,目前的 distributions 在釋出軟體時, 都會將軟體的內容分為一般使用與開發使用 (development) 兩大類。所以你才會常常看到有類似 pam-x.x.rpm 與 pam-devel-x.x.rpm 之類的檔名啊!而預設情況下,大部分的 software-devel-x.x.rpm 都不會安裝,因為終端用戶大部分不會去開發軟體嘛!

因為有上述的現象,因此 RPM 軟體檔案就會有所謂的屬性相依的問題產生 (其實所有的軟體管理幾乎都有這方面的情況存在)。 那有沒有辦法解決啊?前面不是談到 RPM 軟體檔案內部會記錄相依屬性的資料嗎?那想一想,要是我將這些相依屬性的軟體先列表, 在有要安裝軟體需求的時候,先到這個列表去找,同時與系統內已安裝的軟體相比較,沒安裝到的相依軟體就一口氣同時安裝起來, 那不就解決了相依屬性的問題了嗎?有沒有這種機制啊?有啊!那就是 YUM 機制的由來!

CentOS (1)先將釋出的軟體放置到 YUM 伺服器內,然後(2)分析這些軟體的相依屬性問題,將軟體內的記錄資訊寫下來 (header)。 然後再將這些資訊分析後記錄成軟體相關性的清單列表。這些列表資料與軟體所在的本機或網路位置可以稱呼為容器或軟體倉庫或軟體庫 (repository)。 當用戶端有軟體安裝的需求時,用戶端主機會主動的向網路上面的 yum 伺服器的軟體庫網址下載清單列表, 然後透過清單列表的資料與本機 RPM 資料庫已存在的軟體資料相比較,就能夠一口氣安裝所有需要的具有相依屬性的軟體了。 整個流程可以簡單的如下圖說明:

YUM 使用的流程示意圖
圖22.1.1、YUM 使用的流程示意圖
Tips鳥哥的圖示 所以軟體倉庫內的清單會記載每個檔案的相依屬性關係,以及所有檔案的網路位置 (URL)!由於記錄了詳細的軟體網路位置, 所以有需要的時候,當然就會自動的從網路下載該軟體囉!

當用戶端有升級、安裝的需求時, yum 會向軟體庫要求清單的更新,等到清單更新到本機的 /var/cache/yum 裡面後, 等一下更新時就會用這個本機清單與本機的 RPM 資料庫進行比較,這樣就知道該下載什麼軟體。接下來 yum 會跑到軟體庫伺服器 (yum server) 下載所需要的軟體 (因為有記錄軟體所在的網址),然後再透過 RPM 的機制開始安裝軟體啦!這就是整個流程! 談到最後,還是需要動到 RPM 的啦!所以下個小節就讓我們來談談 RPM 這咚咚吧!

Tips鳥哥的圖示 為什麼要做出『軟體庫』呢?由於 yum 伺服器提供的 RPM 檔案內容可能有所差異,舉例來說,原廠釋出的資料有 (1)原版資料; (2)更新資料 (update); (3)特殊資料 (例如第三方協力軟體,或某些特殊功能的軟體)。 這些軟體檔案基本上不會放置到一起,那如何分辨這些軟體功能呢?就用『軟體庫』的概念來處理的啦! 不同的『軟體庫』網址,可以放置不同的功能的軟體之意!


22.2 RPM 軟體管理程式: rpm

RPM 的使用其實不難,只要使用 rpm 這個指令即可!鳥哥最喜歡的就是 rpm 指令的查詢功能了,可以讓我很輕易的就知道某個系統有沒有安裝鳥哥要的軟體呢!此外, 我們最好還是得要知道一下,到底 RPM 類型的檔案他們是將軟體的相關檔案放置在哪裡呢?還有,我們說的那個 RPM 的資料庫又是放置在哪裡呢?

Tips鳥哥的圖示 事實上,下一小節要講的 yum 就可以直接用來進行安裝的動作,基本上 rpm 這個指令真的就只剩下查詢與檢驗的功能囉! 所以,查詢與檢驗還是要學的,至於安裝,透過 yum 就好了!

22.2.1 RPM 預設安裝的路徑

一般來說,RPM 類型的檔案在安裝的時候,會先去讀取檔案內記載的設定參數內容,然後將該資料用來比對 Linux 系統的環境,以找出是否有屬性相依的軟體尚未安裝的問題。例如 Openssh 這個連線軟體需要透過 Openssl 這個加密軟體的幫忙,所以得先安裝 openssl 才能裝 openssh 的意思。那你的環境如果沒有 openssl , 你就無法安裝 openssh 的意思啦。

若環境檢查合格了,那麼 RPM 檔案就開始被安裝到你的 Linux 系統上。安裝完畢後,該軟體相關的資訊就會被寫入 /var/lib/rpm/ 目錄下的資料庫檔案中了。 上面這個目錄內的資料很重要喔!因為未來如果我們有任何軟體升級的需求,版本之間的比較就是來自於這個資料庫, 而如果你想要查詢系統已經安裝的軟體,也是從這裡查詢的!同時,目前的 RPM 也提供數位簽章資訊, 這些數位簽章也是在這個目錄內記錄的呢!所以說,這個目錄得要注意不要被刪除了啊!

那麼軟體內的檔案到底是放置到哪裡去啊?當然與檔案系統有關對吧!我們在第五章的目錄配置談過每個目錄的意義, 這裡再次的強調囉:

/etc 一些設定檔放置的目錄,例如 /etc/crontab
/usr/bin 一些可執行檔案
/usr/lib 一些程式使用的動態函式庫
/usr/share/doc 一些基本的軟體使用手冊與說明檔
/usr/share/man 一些 man page 檔案

好了,底下我們就來針對每個 RPM 的相關指令來進行說明囉!



22.2.2 RPM 安裝 (install)

因為安裝軟體是 root 的工作,因此你得要是 root 的身份才能夠操作 rpm 這指令的。 用 rpm 來安裝很簡單啦!假設我要安裝一個檔名為 rp-pppoe-3.11-5.el7.x86_64.rpm 的檔案,那麼我可以這樣:(假設原版光碟已經放在 /mnt 底下了)

[root@study ~]# rpm -i /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm

不過,這樣的參數其實無法顯示安裝的進度,所以,通常我們會這樣下達安裝指令:

[root@study ~]# rpm -ivh package_name
選項與參數:
-i :install 的意思
-v :察看更細部的安裝資訊畫面
-h :以安裝資訊列顯示安裝進度

範例一:安裝原版光碟上的 rp-pppoe 軟體
[root@study ~]# rpm -ivh /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:rp-pppoe-3.11-5.el7              ################################# [100%]

範例二、一口氣安裝兩個以上的軟體時:
[root@study ~]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm
# 後面直接接上許多的軟體檔案!

範例三、直接由網路上面的某個檔案安裝,以網址來安裝:
[root@study ~]# rpm -ivh http://website.name/path/pkgname.rpm

另外,如果我們在安裝的過程當中發現問題,或者已經知道會發生的問題, 而還是『執意』要安裝這個軟體時,可以使用如下的參數『強制』安裝上去:

rpm 安裝時常用的選項與參數說明
可下達的選項代表意義
--nodeps 使用時機:當發生軟體屬性相依問題而無法安裝,但你執意安裝時
危險性: 軟體會有相依性的原因是因為彼此會使用到對方的機制或功能,如果強制安裝而不考慮軟體的屬性相依, 則可能會造成該軟體的無法正常使用!
--replacefiles 使用時機: 如果在安裝的過程當中出現了『某個檔案已經被安裝在你的系統上面』的資訊,又或許出現版本不合的訊息 (confilcting files) 時,可以使用這個參數來直接覆蓋檔案。
危險性: 覆蓋的動作是無法復原的!所以,你必須要很清楚的知道被覆蓋的檔案是真的可以被覆蓋喔!否則會欲哭無淚!
--replacepkgs 使用時機: 重新安裝某個已經安裝過的軟體!如果你要安裝一堆 RPM 軟體檔案時,可以使用 rpm -ivh *.rpm ,但若某些軟體已經安裝過了, 此時系統會出現『某軟體已安裝』的資訊,導致無法繼續安裝。此時可使用這個選項來重複安裝喔!
--force 使用時機:這個參數其實就是 --replacefiles 與 --replacepkgs 的綜合體!
--test 使用時機: 想要測試一下該軟體是否可以被安裝到使用者的 Linux 環境當中,可找出是否有屬性相依的問題。範例為:
rpm -ivh pkgname.i386.rpm --test
--justdb 使用時機: 由於 RPM 資料庫破損或者是某些緣故產生錯誤時,可使用這個選項來更新軟體在資料庫內的相關資訊。
--nosignature 使用時機: 想要略過數位簽章的檢查時,可以使用這個選項。
--prefix 新路徑 使用時機: 要將軟體安裝到其他非正規目錄時。舉例來說,你想要將某軟體安裝到 /usr/local 而非正規的 /bin, /etc 等目錄, 就可以使用『 --prefix /usr/local 』來處理了。
--noscripts 使用時機:不想讓該軟體在安裝過程中自行執行某些系統指令。
說明: RPM 的優點除了可以將檔案放置到定位之外,還可以自動執行一些前置作業的指令,例如資料庫的初始化。 如果你不想要讓 RPM 幫你自動執行這一類型的指令,就加上他吧!

一般來說,rpm 的安裝選項與參數大約就是這些了。通常鳥哥建議直接使用 -ivh 就好了, 如果安裝的過程中發現問題,一個一個去將問題找出來,盡量不要使用『 暴力安裝法 』,就是透過 --force 去強制安裝! 因為可能會發生很多不可預期的問題呢!除非你很清楚的知道使用上面的參數後,安裝的結果是你預期的!

例題:
在沒有網路的前提下,你想要安裝一個名為 pam-devel 的軟體,你手邊只有原版光碟,該如何是好?
答:
你可以透過掛載原版光碟來進行資料的查詢與安裝。請將原版光碟放入光碟機,底下我們嘗試將光碟掛載到 /mnt 當中, 並據以處理軟體的下載囉:
  • 掛載光碟,使用: mount /dev/sr0 /mnt
  • 找出檔案的實際路徑:find /mnt -name 'pam-devel*'
  • 測試此軟體是否具有相依性: rpm -ivh pam-devel... --test
  • 直接安裝: rpm -ivh pam-devel...
  • 卸載光碟: umount /mnt
在鳥哥的系統中,剛好這個軟體並沒有屬性相依的問題,因此最後一個步驟可以順利的進行下去呢!



22.2.3 RPM 升級與更新 (upgrade/freshen)

使用 RPM 來升級真是太簡單了!就以 -Uvh 或 -Fvh 來升級即可,而 -Uvh 與 -Fvh 可以用的選項與參數,跟 install 是一樣的。不過, -U 與 -F 的意義還是不太一樣的,基本的差別是這樣的:

-Uvh 後面接的軟體即使沒有安裝過,則系統將予以直接安裝; 若後面接的軟體有安裝過舊版,則系統自動更新至新版;
-Fvh 如果後面接的軟體並未安裝到你的 Linux 系統上,則該軟體不會被安裝;亦即只有已安裝至你 Linux 系統內的軟體會被『升級』!

由上面的說明來看,如果你想要大量的升級系統舊版本的軟體時,使用 -Fvh 則是比較好的作法,因為沒有安裝的軟體才不會被不小心安裝進系統中。但是需要注意的是,如果你使用的是 -Fvh ,偏偏你的機器上尚無這一個軟體,那麼很抱歉,該軟體並不會被安裝在你的 Linux 主機上面,所以請重新以 ivh 來安裝吧!

早期沒有 yum 的環境底下,同時網路頻寬也很糟糕的狀況下,通常有的朋友在進行整個作業系統的舊版軟體修補時,喜歡這麼進行:

  1. 先到各發展商的 errata 網站或者是國內的 FTP 映像站捉下來最新的 RPM 檔案;
  2. 使用 -Fvh 來將你的系統內曾安裝過的軟體進行修補與升級!(真是方便呀!)

所以,在不曉得 yum 功能的情況下,你依舊可以到 CentOS 的映設站台下載 updates 資料,然後利用上述的方法來一口氣升級! 當然囉,升級也是可以利用 --nodeps/--force 等等的參數啦! 不過,現在既然有 yum 的機制在,這個笨方法當然也就不再需要了!



22.2.4 RPM 查詢 (query)

RPM 在查詢的時候,其實查詢的地方是在 /var/lib/rpm/ 這個目錄下的資料庫檔案啦!另外, RPM 也可以查詢未安裝的 RPM 檔案內的資訊喔!那如何去查詢呢? 我們先來談談可用的選項有哪些?

[root@study ~]# rpm -qa                              <==已安裝軟體
[root@study ~]# rpm -q[licdR] 已安裝的軟體名稱       <==已安裝軟體
[root@study ~]# rpm -qf 存在於系統上面的某個檔名     <==已安裝軟體
[root@study ~]# rpm -qp[licdR] 未安裝的某個檔案名稱  <==查閱RPM檔案
選項與參數:
查詢已安裝軟體的資訊:
-q  :僅查詢,後面接的軟體名稱是否有安裝;
-qa :列出所有的,已經安裝在本機 Linux 系統上面的所有軟體名稱;
-qi :列出該軟體的詳細資訊 (information),包含開發商、版本與說明等;
-ql :列出該軟體所有的檔案與目錄所在完整檔名 (list);
-qc :列出該軟體的所有設定檔 (找出在 /etc/ 底下的檔名而已)
-qd :列出該軟體的所有說明檔 (找出與 man 有關的檔案而已)
-qR :列出與該軟體有關的相依軟體所含的檔案 (Required 的意思)
-qf :由後面接的檔案名稱,找出該檔案屬於哪一個已安裝的軟體;
-q --scripts:列出是否含有安裝後需要執行的腳本檔,可用以 debug 喔!
查詢某個 RPM 檔案內含有的資訊:
-qp[icdlR]:注意 -qp 後面接的所有參數以上面的說明一致。但用途僅在於找出
	    某個 RPM 檔案內的資訊,而非已安裝的軟體資訊!注意!

在查詢的部分,所有的參數之前都需要加上 -q 才是所謂的查詢!查詢主要分為兩部分, 一個是查已安裝到系統上面的的軟體資訊,這部份的資訊都是由 /var/lib/rpm/ 所提供。另一個則是查某個 rpm 檔案內容, 等於是由 RPM 檔案內找出一些要寫入資料庫內的資訊就是了,這部份就得要使用 -qp (p 是 package 的意思)。 那就來看看幾個簡單的範例吧!

範例一:找出你的 Linux 是否有安裝 logrotate 這個軟體?
[root@study ~]# rpm -q logrotate
logrotate-3.8.6-4.el7.x86_64
[root@study ~]# rpm -q logrotating
package logrotating is not installed
# 注意到,系統會去找是否有安裝後面接的軟體名稱。注意,不必要加上版本喔!
# 至於顯示的結果,一看就知道有沒有安裝啦!

範例二:列出上題當中,屬於該軟體所提供的所有目錄與檔案:
[root@study ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
....(以下省略)....
# 可以看出該軟體到底提供了多少的檔案與目錄,也可以追蹤軟體的資料。

範例三:列出 logrotate 這個軟體的相關說明資料:
[root@study ~]# rpm -qi logrotate
Name        : logrotate                          # 軟體名稱
Version     : 3.8.6                              # 軟體的版本
Release     : 4.el7                              # 釋出的版本
Architecture: x86_64                             # 編譯時所針對的硬體等級
Install Date: Mon 04 May 2015 05:52:36 PM CST    # 這個軟體安裝到本系統的時間
Group       : System Environment/Base            # 軟體是放再哪一個軟體群組中
Size        : 102451                             # 軟體的大小
License     : GPL+                               # 釋出的授權方式
Signature   : RSA/SHA256, Fri 04 Jul 2014 11:34:56 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : logrotate-3.8.6-4.el7.src.rpm      # 這就是 SRPM 的檔名
Build Date  : Tue 10 Jun 2014 05:58:02 AM CST    # 軟體編譯打包的時間
Build Host  : worker1.bsys.centos.org            # 在哪一部主機上面編譯的
Relocations : (not relocatable)   
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : https://fedorahosted.org/logrotate/
Summary     : Rotates, compresses, removes and mails system log files
Description :                                    # 這個是詳細的描述!
The logrotate utility is designed to simplify the administration of
log files on a system which generates a lot of log files.  Logrotate
allows for the automatic rotation compression, removal and mailing of
log files.  Logrotate can be set to handle a log file daily, weekly,
monthly or when the log file gets to a certain size.  Normally,
logrotate runs as a daily cron job.

Install the logrotate package if you need a utility to deal with the
log files on your system.
# 列出該軟體的 information (資訊),裡面的資訊可多著呢,包括了軟體名稱、
# 版本、開發商、SRPM檔案名稱、打包次數、簡單說明資訊、軟體打包者、
# 安裝日期等等!如果想要詳細的知道該軟體的資料,用這個參數來瞭解一下

範例四:分別僅找出 logrotate 的設定檔與說明檔
[root@study ~]# rpm -qc logrotate
[root@study ~]# rpm -qd logrotate

範例五:若要成功安裝 logrotate ,他還需要什麼檔案的幫忙?
[root@study ~]# rpm -qR logrotate
/bin/sh
config(logrotate) = 3.8.6-4.el7
coreutils >= 5.92
....(以下省略)....
# 由這裡看起來,呵呵~還需要很多檔案的支援才行喔!

範例六:由上面的範例五,找出 /bin/sh 是那個軟體提供的?
[root@study ~]# rpm -qf /bin/sh
bash-4.2.46-12.el7.x86_64
# 這個參數後面接的可是『檔案』吶!不像前面都是接軟體喔!
# 這個功能在查詢系統的某個檔案屬於哪一個軟體所有的。

範例七:假設我有下載一個 RPM 檔案,想要知道該檔案的需求檔案,該如何?
[root@study ~]# rpm -qpR filename.i386.rpm
# 加上 -qpR ,找出該檔案需求的資料!

常見的查詢就是這些了!要特別說明的是,在查詢本機上面的 RPM 軟體相關資訊時, 不需要加上版本的名稱,只要加上軟體名稱即可!因為他會由 /var/lib/rpm 這個資料庫裡面去查詢, 所以我們可以不需要加上版本名稱。但是查詢某個 RPM 檔案就不同了,我們必須要列出整個檔案的完整檔名才行~ 這一點朋友們常常會搞錯。底下我們就來做幾個簡單的練習吧!

例題:
  1. 我想要知道我的系統當中,以 c 開頭的軟體有幾個,如何實做?
  2. 我的 WWW 伺服器為 Apache ,我知道他使用的 RPM 軟體檔名為 httpd 。現在,我想要知道這個軟體的所有設定檔放置在何處,可以怎麼作?
  3. 承上題,如果查出來的設定檔案已經被我改過,但是我忘記了曾經修改過哪些地方,所以想要直接重新安裝一次該軟體,該如何作?
  4. 如果我誤砍了某個重要檔案,例如 /etc/crontab,偏偏不曉得他屬於哪一個軟體,該怎麼辦?
答:
  1. rpm -qa | grep ^c | wc -l
  2. rpm -qc httpd
  3. 假設該軟體在網路上的網址為:
    http://web.site.name/path/httpd-x.x.xx.i386.rpm
    則我可以這樣做:
    rpm -ivh http://web.site.name/path/httpd-x.x.xx.i386.rpm --replacepkgs
  4. 雖然已經沒有這個檔案了,不過沒有關係,因為 RPM 有記錄在 /var/lib/rpm 當中的資料庫啊!所以直接下達:
    rpm -qf /etc/crontab
    就可以知道是那個軟體囉!重新安裝一次該軟體即可!



22.2.5 RPM 驗證與數位簽章 (Verify/signature)

驗證 (Verify) 的功能主要在於提供系統管理員一個有用的管理機制!作用的方式是『使用 /var/lib/rpm 底下的資料庫內容來比對目前 Linux 系統的環境下的所有軟體檔案 』也就是說,當你有資料不小心遺失, 或者是因為你誤殺了某個軟體的檔案,或者是不小心不知道修改到某一個軟體的檔案內容, 就用這個簡單的方法來驗證一下原本的檔案系統吧!好讓你瞭解這一陣子到底是修改到哪些檔案資料了!驗證的方式很簡單:

[root@study ~]# rpm -Va
[root@study ~]# rpm -V  已安裝的軟體名稱
[root@study ~]# rpm -Vp 某個 RPM 檔案的檔名
[root@study ~]# rpm -Vf 在系統上面的某個檔案
選項與參數:
-V  :後面加的是軟體名稱,若該軟體所含的檔案被更動過,才會列出來;
-Va :列出目前系統上面所有可能被更動過的檔案;
-Vp :後面加的是檔案名稱,列出該軟體內可能被更動過的檔案;
-Vf :列出某個檔案是否被更動過~

範例一:列出你的 Linux 內的 logrotate 這個軟體是否被更動過?
[root@study ~]# rpm -V logrotate
# 如果沒有出現任何訊息,恭喜你,該軟體所提供的檔案沒有被更動過。
# 如果有出現任何訊息,才是有出現狀況啊!

範例二:查詢一下,你的 /etc/crontab 是否有被更動過?
[root@study ~]# rpm -Vf /etc/crontab
.......T.  c /etc/crontab
# 瞧!因為有被更動過,所以會列出被更動過的資訊類型!

好了,那麼我怎麼知道到底我的檔案被更動過的內容是什麼?例如上面的範例二。呵呵!簡單的說明一下吧! 例如,我們檢查一下 logrotate 這個軟體:

[root@study ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
# 呵呵!共有 10 個檔案啊!請修改 /etc/logrotate.conf 內的 rotate 變成 5

[root@study ~]# rpm -V logrotate
..5....T.  c /etc/logrotate.conf

你會發現在檔名之前有個 c ,然後就是一堆奇怪的文字了。那個 c 代表的是 configuration , 就是設定檔的意思。至於最前面的幾個資訊是:

  • S :(file Size differs) 檔案的容量大小是否被改變
  • M :(Mode differs) 檔案的類型或檔案的屬性 (rwx) 是否被改變?如是否可執行等參數已被改變
  • 5 :(MD5 sum differs) MD5 這一種指紋碼的內容已經不同
  • D :(Device major/minor number mis-match) 裝置的主/次代碼已經改變
  • L :(readLink(2) path mis-match) Link 路徑已被改變
  • U :(User ownership differs) 檔案的所屬人已被改變
  • G :(Group ownership differs) 檔案的所屬群組已被改變
  • T :(mTime differs) 檔案的建立時間已被改變
  • P :(caPabilities differ) 功能已經被改變

所以,如果當一個設定檔所有的資訊都被更動過,那麼他的顯示就會是:

SM5DLUGTP c filename

至於那個 c 代表的是『 Config file 』的意思,也就是檔案的類型,檔案類型有底下這幾類:

  • c :設定檔 (config file)
  • d :文件資料檔 (documentation)
  • g :鬼檔案~通常是該檔案不被某個軟體所包含,較少發生!(ghost file)
  • l :授權檔案 (license file)
  • r :讀我檔案 (read me)

經過驗證的功能,你就可以知道那個檔案被更動過。那麼如果該檔案的變更是『預期中的』, 那麼就沒有什麼大問題,但是如果該檔案是『非預期的』,那麼是否被入侵了呢?呵呵!得注意注意囉! 一般來說,設定檔 (configure) 被更動過是很正常的,萬一你的 binary program 被更動過呢? 那就得要特別特別小心啊!

Tips鳥哥的圖示 雖說家醜不可外揚,不過有件事情還是跟大家分享一下的好。鳥哥之前的主機曾經由於安裝一套軟體,導致被攻擊成為跳板。 會發現的原因是系統中只要出現 *.patch 的副檔名時,使用 ls -l 就是顯示不出來該檔名 (該檔名確實存在)。 找了好久,用了好多工具都找不出問題,最終利用 rpm -Va 找出來,原來好多 binary program 被更動過,連 init 都被惡搞!此時,趕緊重新安裝 Linux 並移除那套軟體,之後就比較正常了。所以說,這個 rpm -Va 是個好功能喔!

  • 數位簽章 (digital signature)

談完了軟體的驗證後,不知道你有沒有發現一個問題,那就是,驗證只能驗證軟體內的資訊與 /var/lib/rpm/ 裡面的資料庫資訊而已,如果該軟體檔案所提供的資料本身就有問題,那你使用驗證的手段也無法確定該軟體的正確性啊! 那如何解決呢?在 Tarball 與檔案的驗證方面,我們可以使用前一章談到的 md5 指紋碼來檢查, 不過,連指紋碼也可能會被竄改的嘛!那怎辦?沒關係,我們可以透過數位簽章來檢驗軟體的來源的!

就像你自己的簽名一樣,我們的軟體開發商原廠所推出的軟體也會有一個廠商自己的簽章系統! 只是這個簽章被數位化了而已。廠商可以數位簽章系統產生一個專屬於該軟體的簽章,並將該簽章的公鑰 (public key) 釋出。 當你要安裝一個 RPM 檔案時:

  1. 首先你必須要先安裝原廠釋出的公鑰檔案;
  2. 實際安裝原廠的 RPM 軟體時, rpm 指令會去讀取 RPM 檔案的簽章資訊,與本機系統內的簽章資訊比對,
  3. 若簽章相同則予以安裝,若找不到相關的簽章資訊時,則給予警告並且停止安裝喔。

我們 CentOS 使用的數位簽章系統為 GNU 計畫的 GnuPG (GNU Privacy Guard, GPG)(註1)。 GPG 可以透過雜湊運算,算出獨一無二的專屬金鑰系統或者是數位簽章系統,有興趣的朋友可以參考文末的延伸閱讀, 去瞭解一下 GPG 加密的機制喔!這裡我們僅簡單的說明數位簽章在 RPM 檔案上的應用而已。 而根據上面的說明,我們也會知道首先必須要安裝原廠釋出的 GPG 數位簽章的公鑰檔案啊!CentOS 的數位簽章位於:

[root@study ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
-rw-r--r--. 1 root root 1690 Apr  1 06:27 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@study ~]# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 (GNU/Linux)

mQINBFOn/0sBEADLDyZ+DQHkcTHDQSE0a0B2iYAEXwpPvs67cJ4tmhe/iMOyVMh9
....(中間省略)....
-----END PGP PUBLIC KEY BLOCK-----

從上面的輸出,你會知道該數位簽章碼其實僅是一個亂數而已,這個亂數對於數位簽章有意義而已, 我們看不懂啦!那麼這個檔案如何安裝呢?透過底下的方式來安裝即可喔!

[root@study ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

由於不同版本 GPG 金鑰檔案放置的位置可能不同,不過檔名大多是以 GPG-KEY 來說明的, 因此你可以簡單的使用 locate 或 find 來找尋,如以下的方式來搜尋即可:

[root@study ~]# locate GPG-KEY
[root@study ~]# find /etc -name '*GPG-KEY*'

那安裝完成之後,這個金鑰的內容會以什麼方式呈現呢?基本上都是使用 pubkey 作為軟體的名稱的! 那我們先列出金鑰軟體名稱後,再以 -qi 的方式來查詢看看該軟體的資訊為何:

[root@study ~]# rpm -qa | grep pubkey
gpg-pubkey-f4a80eb5-53a7ff4b
[root@study ~]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b
Name        : gpg-pubkey
Version     : f4a80eb5
Release     : 53a7ff4b
Architecture: (none)
Install Date: Fri 04 Sep 2015 11:30:46 AM CST
Group       : Public Keys
Size        : 0
License     : pubkey
Signature   : (none)
Source RPM  : (none)
Build Date  : Mon 23 Jun 2014 06:19:55 PM CST
Build Host  : localhost
Relocations : (not relocatable)
Packager    : CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>
Summary     : gpg(CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.11.1 (NSS-3)
....(底下省略)....

重點就是最後面出現的那一串亂碼啦!那可是作為數位簽章非常重要的一環哩! 如果你忘記加上數位簽章,很可能很多原版軟體就不能讓你安裝囉~除非你利用 rpm 時選擇略過數位簽章的選項。



22.2.6 RPM 反安裝與重建資料庫 (erase/rebuilddb)

反安裝就是將軟體解除安裝啦!要注意的是,『解安裝的過程一定要由最上層往下解除』,以 rp-pppoe 為例,這一個軟體主要是依據 ppp 這個軟體來安裝的,所以當你要解除 ppp 的時候,就必須要先解除 rp-pppoe 才行!否則就會發生結構上的問題啦!這個可以由建築物來說明, 如果你要拆除五、六樓,那麼當然要由六樓拆起,否則先拆的是第五樓時,那麼上面的樓層難道會懸空?

移除的選項很簡單,就透過 -e 即可移除。不過,很常發生軟體屬性相依導致無法移除某些軟體的問題! 我們以底下的例子來說明:

# 1. 找出與 pam 有關的軟體名稱,並嘗試移除 pam 這個軟體:
[root@study ~]# rpm -qa | grep pam
fprintd-pam-0.5.0-4.0.el7_0.x86_64
pam-1.1.8-12.el7.x86_64
gnome-keyring-pam-3.8.2-10.el7.x86_64
pam-devel-1.1.8-12.el7.x86_64
pam_krb5-2.4.8-4.el7.x86_64
[root@study ~]# rpm -e pam
error: Failed dependencies:  <==這裡提到的是相依性的問題
        libpam.so.0()(64bit) is needed by (installed) systemd-libs-208-20.el7.x86_64
        libpam.so.0()(64bit) is needed by (installed) libpwquality-1.2.3-4.el7.x86_64
....(以下省略)....

# 2. 若僅移除 pam-devel 這個之前範例安裝上的軟體呢?
[root@study ~]# rpm -e pam-devel  <==不會出現任何訊息!
[root@study ~]# rpm -q pam-devel
package pam-devel is not installed

從範例一我們知道 pam 所提供的函式庫是讓非常多其他軟體使用的,因此你不能移除 pam ,除非將其他相依軟體一口氣也全部移除!你當然也能加 --nodeps 來強制移除, 不過,如此一來所有會用到 pam 函式庫的軟體,都將成為無法運作的程式,我想,你的主機也只好準備停機休假了吧! 至於範例二中,由於 pam-devel 是依附於 pam 的開發工具,你可以單獨安裝與單獨移除啦!

由於 RPM 檔案常常會安裝/移除/升級等,某些動作或許可能會導致 RPM 資料庫 /var/lib/rpm/ 內的檔案破損。果真如此的話,那你該如何是好?別擔心,我們可以使用 --rebuilddb 這個選項來重建一下資料庫喔! 作法如下:

[root@study ~]# rpm --rebuilddb   <==重建資料庫

22.3 YUM 線上升級機制

我們在本章一開始的地方談到過 yum 這玩意兒,這個 yum 是透過分析 RPM 的標頭資料後, 根據各軟體的相關性製作出屬性相依時的解決方案,然後可以自動處理軟體的相依屬性問題,以解決軟體安裝或移除與升級的問題。 詳細的 yum 伺服器與用戶端之間的溝通,可以再回到前面的部分查閱一下圖 22.1.1 的說明。

由於 distribution 必須要先釋出軟體,然後將軟體放置於 yum 伺服器上面,以提供用戶端來要求安裝與升級之用的。 因此我們想要使用 yum 的功能時,必須要先找到適合的 yum server 才行啊!而每個 yum server 可能都會提供許多不同的軟體功能,那就是我們之前談到的『軟體庫』啦!因此,你必須要前往 yum server 查詢到相關的軟體庫網址後,再繼續處理後續的設定事宜。

事實上 CentOS 在釋出軟體時已經製作出多部映射站台 (mirror site) 提供全世界的軟體更新之用。 所以,理論上我們不需要處理任何設定值,只要能夠連上 Internet ,就可以使用 yum 囉!底下就讓我們來玩玩看吧!

22.3.1 利用 yum 進行查詢、安裝、升級與移除功能

yum 的使用真是非常簡單,就是透過 yum 這個指令啊!那麼這個指令怎麼用呢?用法很簡單,就讓我們來簡單的談談:

  • 查詢功能:yum [list|info|search|provides|whatprovides] 參數

如果想要查詢利用 yum 來查詢原版 distribution 所提供的軟體,或已知某軟體的名稱,想知道該軟體的功能, 可以利用 yum 相關的參數為:

[root@study ~]# yum [option] [查詢工作項目] [相關參數]
選項與參數:
[option]:主要的選項,包括有:
  -y :當 yum 要等待使用者輸入時,這個選項可以自動提供 yes 的回應;
  --installroot=/some/path :將該軟體安裝在 /some/path 而不使用預設路徑
[查詢工作項目] [相關參數]:這方面的參數有:
  search  :搜尋某個軟體名稱或者是描述 (description) 的重要關鍵字;
  list    :列出目前 yum 所管理的所有的軟體名稱與版本,有點類似 rpm -qa;
  info    :同上,不過有點類似 rpm -qai 的執行結果;
  provides:從檔案去搜尋軟體!類似 rpm -qf 的功能!

範例一:搜尋磁碟陣列 (raid) 相關的軟體有哪些?
[root@study ~]# yum search raid
Loaded plugins: fastestmirror, langpacks      # yum 系統自己找出最近的 yum server
Loading mirror speeds from cached hostfile    # 找出速度最快的那一部 yum server
 * base: ftp.twaren.net                       # 底下三個軟體庫,且來源為該伺服器!
 * extras: ftp.twaren.net
 * updates: ftp.twaren.net
....(前面省略)....
dmraid-events-logwatch.x86_64 : dmraid logwatch-based email reporting
dmraid-events.x86_64 : dmevent_tool (Device-mapper event tool) and DSO
iprutils.x86_64 : Utilities for the IBM Power Linux RAID adapters
mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays)
....(後面省略)....
# 在冒號 (:)  左邊的是軟體名稱,右邊的則是在 RPM 內的 name 設定 (軟體名)
# 瞧!上面的結果,這不就是與 RAID 有關的軟體嗎?如果想瞭解 mdadm 的軟體內容呢?

範例二:找出 mdadm 這個軟體的功能為何
[root@study ~]# yum info mdadm
Installed Packages       <==這說明該軟體是已經安裝的了
Name        : mdadm      <==這個軟體的名稱
Arch        : x86_64     <==這個軟體的編譯架構
Version     : 3.3.2      <==此軟體的版本
Release     : 2.el7      <==釋出的版本
Size        : 920 k      <==此軟體的檔案總容量
Repo        : installed  <==軟體庫回報說已安裝的
From repo   : anaconda
Summary     : The mdadm program controls Linux md devices (software RAID arrays)
URL         : http://www.kernel.org/pub/linux/utils/raid/mdadm/
License     : GPLv2+
Description : The mdadm program is used to create, manage, and monitor Linux MD (software
            : RAID) devices.  As such, it provides similar functionality to the raidtools
            : package.  However, mdadm is a single program, and it can perform
            : almost all functions without a configuration file, though a configuration
            : file can be used to help with some common tasks.
# 不要跟我說,上面說些啥?自己找字典翻一翻吧!拜託拜託!

範例三:列出 yum 伺服器上面提供的所有軟體名稱
[root@study ~]# yum list
Installed Packages   <==已安裝軟體
GConf2.x86_64                           3.2.6-8.el7                    @anaconda
LibRaw.x86_64                           0.14.8-5.el7.20120830git98d925 @base
ModemManager.x86_64                     1.1.0-6.git20130913.el7        @anaconda
....(中間省略)....
Available Packages   <==還可以安裝的其他軟體
389-ds-base.x86_64                      1.3.3.1-20.el7_1               updates
389-ds-base-devel.x86_64                1.3.3.1-20.el7_1               updates
389-ds-base-libs.x86_64                 1.3.3.1-20.el7_1               updates
....(底下省略)....
# 上面提供的意義為:『 軟體名稱   版本   在那個軟體庫內 』

範例四:列出目前伺服器上可供本機進行升級的軟體有哪些?
[root@study ~]# yum list updates  <==一定要是 updates 喔!
Updated Packages
NetworkManager.x86_64          1:1.0.0-16.git20150121.b4ea599c.el7_1       updates
NetworkManager-adsl.x86_64     1:1.0.0-16.git20150121.b4ea599c.el7_1       updates
....(底下省略)....
# 上面就列出在那個軟體庫內可以提供升級的軟體與版本!

範例五:列出提供 passwd 這個檔案的軟體有哪些
[root@study ~]# yum provides passwd
passwd-0.79-4.el7.x86_64 : An utility for setting or changing passwords using PAM
Repo        : base

passwd-0.79-4.el7.x86_64 : An utility for setting or changing passwords using PAM
Repo        : @anaconda
# 找到啦!就是上面的這個軟體提供了 passwd 這個程式!

透過上面的查詢,你應該大致知道 yum 如何用在查詢上面了吧?那麼實際來應用一下:

例題:
利用 yum 的功能,找出以 pam 為開頭的軟體名稱有哪些?而其中尚未安裝的又有哪些?
答:
可以透過如下的方法來查詢:
[root@study ~]# yum list pam*
Installed Packages
pam.x86_64                            1.1.8-12.el7                 @anaconda
pam_krb5.x86_64                       2.4.8-4.el7                  @base
Available Packages <==底下則是『可升級』的或『未安裝』的
pam.i686                              1.1.8-12.el7_1.1             updates
pam.x86_64                            1.1.8-12.el7_1.1             updates
pam-devel.i686                        1.1.8-12.el7_1.1             updates
pam-devel.x86_64                      1.1.8-12.el7_1.1             updates
pam_krb5.i686                         2.4.8-4.el7                  base
pam_pkcs11.i686                       0.6.2-18.el7                 base
pam_pkcs11.x86_64                     0.6.2-18.el7                 base
如上所示,所以可升級者有 pam 這兩個軟體,完全沒有安裝的則是 pam-devel 等其他幾個軟體囉!
  • 安裝/升級功能:yum [install|update] 軟體

既然可以查詢,那麼安裝與升級呢?很簡單啦!就利用 install 與 update 這兩項工作來處理即可喔!

[root@study ~]# yum [option] [安裝與升級的工作項目] [相關參數]
選項與參數:
  install :後面接要安裝的軟體!
  update  :後面接要升級的軟體,若要整個系統都升級,就直接 update 即可

範例一:將前一個練習找到的未安裝的 pam-devel 安裝起來
[root@study ~]# yum install pam-devel
Loaded plugins: fastestmirror, langpacks    # 首先的 5 行在找出最快的 yum server
Loading mirror speeds from cached hostfile
 * base: ftp.twaren.net
 * extras: ftp.twaren.net
 * updates: ftp.twaren.net
Resolving Dependencies                      # 接下來先處理『屬性相依』的軟體問題
--> Running transaction check
---> Package pam-devel.x86_64 0:1.1.8-12.el7_1.1 will be installed
--> Processing Dependency: pam(x86-64) = 1.1.8-12.el7_1.1 for package: pam-devel-
       1.1.8-12.el7_1.1.x86_64
--> Running transaction check
---> Package pam.x86_64 0:1.1.8-12.el7 will be updated 
---> Package pam.x86_64 0:1.1.8-12.el7_1.1 will be an update
--> Finished Dependency Resolution
Dependencies Resolved

# 由上面的檢查發現到 pam 這個軟體也需要同步升級,這樣才能夠安裝新版 pam-devel 喔!
# 至於底下則是一個總結的表格顯示!
==========================================================================================
 Package             Arch             Version                     Repository         Size
==========================================================================================
Installing:
 pam-devel           x86_64           1.1.8-12.el7_1.1            updates           183 k
Updating for dependencies:
 pam                 x86_64           1.1.8-12.el7_1.1            updates           714 k

Transaction Summary
==========================================================================================
Install  1 Package                          # 要安裝的是一個軟體
Upgrade             ( 1 Dependent package)  # 因為相依屬性問題,需要額外加裝一個軟體!

Total size: 897 k
Total download size: 183 k                  # 總共需要下載的容量!
Is this ok [y/d/N]: y   # 你得要自己決定是否要下載與安裝!當然是 y 啊!
Downloading packages:                       # 開始下載囉!
warning: /var/cache/yum/x86_64/7/updates/packages/pam-devel-1.1.8-12.el7_1.1.x86_64.rpm:
         Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for pam-devel-1.1.8-12.el7_1.1.x86_64.rpm is not installed
pam-devel-1.1.8-12.el7_1.1.x86_64.rpm                              | 183 kB  00:00:00
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-1.1503.el7.centos.2.8.x86_64 (@anaconda)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Is this ok [y/N]: y  # 只有在第一次安裝才會出現這個項目『確定要安裝數位簽章』才能繼續!
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
  Updating   : pam-1.1.8-12.el7_1.1.x86_64                                            1/3
  Installing : pam-devel-1.1.8-12.el7_1.1.x86_64                                      2/3
  Cleanup    : pam-1.1.8-12.el7.x86_64                                                3/3
  Verifying  : pam-1.1.8-12.el7_1.1.x86_64                                            1/3
  Verifying  : pam-devel-1.1.8-12.el7_1.1.x86_64                                      2/3
  Verifying  : pam-1.1.8-12.el7.x86_64                                                3/3

Installed:
  pam-devel.x86_64 0:1.1.8-12.el7_1.1

Dependency Updated:
  pam.x86_64 0:1.1.8-12.el7_1.1

Complete!

有沒有很高興啊!你不必知道軟體在哪裡,你不必手動下載軟體,你也不必拿出原版光碟出來 mount 之後查詢再安裝!全部不需要,只要有了 yum 這個傢伙,你的安裝、升級再也不是什麼難事! 而且還能主動的進行軟體的屬性相依處理流程,如上所示,一口氣幫我們處理好了所有事情! 是不是很過癮啊!而且整個動作完全免費!夠酷吧!

  • 移除功能:yum [remove] 軟體

那能不能用 yum 移除軟體呢?將剛剛的軟體移除看看,會出現啥狀況啊?

[root@study ~]# yum remove pam-devel
Loaded plugins: fastestmirror, langpacks
Resolving Dependencies   <==同樣的,先解決屬性相依的問題
--> Running transaction check
---> Package pam-devel.x86_64 0:1.1.8-12.el7_1.1 will be erased
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================
 Package             Arch             Version                    Repository          Size
==========================================================================================
Removing:
 pam-devel           x86_64           1.1.8-12.el7_1.1           @updates           528 k

Transaction Summary
==========================================================================================
Remove  1 Package       # 還好!沒有相依屬性的問題,僅移除一個軟體!

Installed size: 528 k
Is this ok [y/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Erasing    : pam-devel-1.1.8-12.el7_1.1.x86_64                                      1/1
  Verifying  : pam-devel-1.1.8-12.el7_1.1.x86_64                                      1/1

Removed:
  pam-devel.x86_64 0:1.1.8-12.el7_1.1

Complete!

連移除也這麼簡單!看來,似乎不需要 rpm 這個指令也能夠快樂的安裝所有的軟體了! 雖然是如此,但是 yum 畢竟是架構在 rpm 上面所發展起來的,所以,鳥哥認為你還是得需要瞭解 rpm 才行!不要學了 yum 之後就將 rpm 的功能忘記了呢!切記切記!



22.3.2 yum 的設定檔

雖然 yum 是你的主機能夠連線上 Internet 就可以直接使用的,不過,由於 CentOS 的映射站台可能會選錯, 舉例來說,我們在台灣,但是 CentOS 的映射站台卻選擇到了大陸北京或者是日本去,有沒有可能發生啊! 有啊!鳥哥教學方面就常常發生這樣的問題,要知道,我們連線到大陸或日本的速度是非常慢的呢!那怎辦? 當然就是手動的修改一下 yum 的設定檔就好囉!

在台灣,CentOS 的映射站台主要有高速網路中心與義守大學,鳥哥近來比較偏好高速網路中心, 似乎更新的速度比較快,而且連接台灣學術網路也非常快速哩!因此,鳥哥底下建議台灣的朋友使用高速網路中心的 ftp 主機資源來作為 yum 伺服器來源喔!不過因為鳥哥也在崑大服務,崑大目前也加入了 CentOS 的映射站, 如果在崑山或台南地區,也能夠選擇崑大的 FTP 喔!目前高速網路中心與崑大對於 CentOS 所提供的相關網址如下:

如果你連接到上述的網址後,就會發現裡面有一堆連結,那些連結就是這個 yum 伺服器所提供的軟體庫了! 所以高速網路中心也提供了 centosplus, cloud, extras, fasttrack, os, updates 等軟體庫,最好認的軟體庫就是 os (系統預設的軟體) 與 updates (軟體升級版本) 囉!由於鳥哥在我的測試用主機是利用 x86_64 的版本, 因此那個 os 再點進去就會得到如下的可提供安裝的網址:

為什麼在上述的網址內呢?有什麼特色!最重要的特色就是那個『 repodata 』的目錄!該目錄就是分析 RPM 軟體後所產生的軟體屬性相依資料放置處!因此,當你要找軟體庫所在網址時, 最重要的就是該網址底下一定要有個名為 repodata 的目錄存在!那就是軟體庫的網址了! 其他的軟體庫正確網址,就請各位看倌自行尋找一下喔!現在讓我們修改設定檔吧!

[root@study ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

如上所示,鳥哥僅列出 base 這個軟體庫內容而已,其他的軟體庫內容請自行查閱囉!上面的資料需要注意的是:

  • [base]:代表軟體庫的名字!中括號一定要存在,裡面的名稱則可以隨意取。但是不能有兩個相同的軟體庫名稱, 否則 yum 會不曉得該到哪裡去找軟體庫相關軟體清單檔案。

  • name:只是說明一下這個軟體庫的意義而已,重要性不高!

  • mirrorlist=:列出這個軟體庫可以使用的映射站台,如果不想使用,可以註解到這行;

  • baseurl=:這個最重要,因為後面接的就是軟體庫的實際網址! mirrorlist 是由 yum 程式自行去捉映射站台, baseurl 則是指定固定的一個軟體庫網址!我們剛剛找到的網址放到這裡來啦!

  • enable=1:就是讓這個軟體庫被啟動。如果不想啟動可以使用 enable=0 喔!

  • gpgcheck=1:還記得 RPM 的數位簽章嗎?這就是指定是否需要查閱 RPM 檔案內的數位簽章!

  • gpgkey=:就是數位簽章的公鑰檔所在位置!使用預設值即可

瞭解這個設定檔之後,接下來讓我們修改整個檔案的內容,讓我們這部主機可以直接使用高速網路中心的資源吧! 修改的方式鳥哥僅列出 base 這個軟體庫項目而已,其他的項目請您自行依照上述的作法來處理即可!

[root@study ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/os/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever - Updates
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/updates/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever - Extras
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/extras/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# 預設情況下,軟體倉庫僅有這三個有啟用!所以鳥哥僅修改這三個軟體庫的 baseurl 而已喔!

接下來當然就是給它測試一下這些軟體庫是否正常的運作中啊!如何測試呢?再次使用 yum 即可啊!

範例一:列出目前 yum server 所使用的軟體庫有哪些?
[root@study ~]# yum repolist all
repo id                              repo name                         status
C7.0.1406-base/x86_64                CentOS-7.0.1406 - Base            disabled
C7.0.1406-centosplus/x86_64          CentOS-7.0.1406 - CentOSPlus      disabled
C7.0.1406-extras/x86_64              CentOS-7.0.1406 - Extras          disabled
C7.0.1406-fasttrack/x86_64           CentOS-7.0.1406 - CentOSPlus      disabled
C7.0.1406-updates/x86_64             CentOS-7.0.1406 - Updates         disabled
base                                 CentOS-7 - Base                   enabled: 8,652
base-debuginfo/x86_64                CentOS-7 - Debuginfo              disabled
base-source/7                        CentOS-7 - Base Sources           disabled
centosplus/7/x86_64                  CentOS-7 - Plus                   disabled
centosplus-source/7                  CentOS-7 - Plus Sources           disabled
cr/7/x86_64                          CentOS-7 - cr                     disabled
extras                               CentOS-7 - Extras                 enabled:   181
extras-source/7                      CentOS-7 - Extras Sources         disabled
fasttrack/7/x86_64                   CentOS-7 - fasttrack              disabled
updates                              CentOS-7 - Updates                enabled: 1,302
updates-source/7                     CentOS-7 - Updates Sources        disabled
repolist: 10,135
# 上面最右邊有寫 enabled 才是有啟動的!由於 /etc/yum.repos.d/
# 有多個設定檔,所以你會發現還有其他的軟體庫存在。
  • 修改軟體庫產生的問題與解決之道

由於我們是修改系統預設的設定檔,事實上,我們應該要在 /etc/yum.repos.d/ 底下新建一個檔案, 該副檔名必須是 .repo 才行!但因為我們使用的是指定特定的映射站台,而不是其他軟體開發商提供的軟體庫, 因此才修改系統預設設定檔。但是可能由於使用的軟體庫版本有新舊之分,你得要知道, yum 會先下載軟體庫的清單到本機的 /var/cache/yum 裡面去!那我們修改了網址卻沒有修改軟體庫名稱 (中括號內的文字), 可能就會造成本機的清單與 yum 伺服器的清單不同步,此時就會出現無法更新的問題了!

那怎麼辦啊?很簡單,就清除掉本機上面的舊資料即可!需要手動處理嗎?不需要的, 透過 yum 的 clean 項目來處理即可!

[root@study ~]# yum clean [packages|headers|all] 
選項與參數:
 packages:將已下載的軟體檔案刪除
 headers :將下載的軟體檔頭刪除
 all     :將所有軟體庫資料都刪除!

範例一:刪除已下載過的所有軟體庫的相關資料 (含軟體本身與清單)
[root@study ~]# yum clean all



22.3.3 yum 的軟體群組功能

透過 yum 來線上安裝一個軟體是非常的簡單,但是,如果要安裝的是一個大型專案呢? 舉例來說,鳥哥使用預設安裝的方式安裝了測試機,這部主機就只有 GNOME 這個視窗管理員, 那我如果想要安裝 KDE 呢?難道需要重新安裝?當然不需要,透過 yum的軟體群組功能即可! 來看看指令先:

[root@study ~]# yum [群組功能] [軟體群組]
選項與參數:
   grouplist   :列出所有可使用的『軟體群組組』,例如 Development Tools 之類的;
   groupinfo   :後面接 group_name,則可瞭解該 group 內含的所有軟體名;
   groupinstall:這個好用!可以安裝一整組的軟體群組,相當的不錯用!
   groupremove :移除某個軟體群組;

範例一:查閱目前軟體庫與本機上面的可用與安裝過的軟體群組有哪些?
[root@study ~]# yum grouplist
Installed environment groups:            # 已經安裝的系統環境軟體群組
   Development and Creative Workstation
Available environment groups:            # 還可以安裝的系統環境軟體群組
   Minimal Install
   Compute Node
   Infrastructure Server
   File and Print Server
   Basic Web Server
   Virtualization Host
   Server with GUI
   GNOME Desktop
   KDE Plasma Workspaces
Installed groups:                        # 已經安裝的軟體群組!
   Development Tools
Available Groups:                        # 還能額外安裝的軟體群組!
   Compatibility Libraries
   Console Internet Tools
   Graphical Administration Tools
   Legacy UNIX Compatibility
   Scientific Support
   Security Tools
   Smart Card Support
   System Administration Tools
   System Management
Done

你會發現系統上面的軟體大多是群組的方式一口氣來提供安裝的!還記全新安裝 CentOS 時, 不是可以選擇所需要的軟體嗎?而那些軟體不是利用 GNOME/KDE/X Window ... 之類的名稱存在嗎? 其實那就是軟體群組囉!如果你執行上述的指令後,在『Available Groups』底下應該會看到一個 『Scientific Support』的軟體群組,想知道那是啥嗎?就這樣做:

[root@study ~]# yum groupinfo "Scientific Support"
Group: Scientific Support
 Group-Id: scientific
 Description: Tools for mathematical and scientific computations, and parallel computing.
 Optional Packages:
   atlas
   fftw
   fftw-devel
   fftw-static
   gnuplot
   gsl-devel
   lapack
   mpich
....(以下省略)....

你會發現那就是一個科學運算、平行運算會用到的各種工具就是了!而下方則列出許多應該會在該群組安裝時被下載與安裝的軟體們! 讓我們直接來安裝看看!

[root@study ~]# yum groupinstall "Scientific Support"

正常情況下系統是會幫你安裝好各項軟體的。只是傷腦筋的是,剛剛好 Scientific Support 裡面的軟體都是『可選擇的』!而不是『主要的 (mandatory)』, 因此預設情況下,上面這些軟體通通不會幫你安裝!!如果你想要安裝上述的軟體,可以使用 yum install atlas fftw .. 一個一個寫進去安裝~ 如果想要讓 groupinstall 預設安裝好所有的 optional 軟體呢?那就得要修改設定檔!更改選 groupinstall 選擇的軟體項目即可!如下所示:

[root@study ~]# vim /etc/yum.conf
.....(前面省略).....
distroverpkg=centos-release   # 找到這一行,底下新增一行!
group_package_types=default, mandatory, optional
.....(底下省略).....

[root@study ~]# yum groupinstall "Scientific Support"

你就會發現系統開始進行了一大堆軟體的安裝!那就是啦!這個 group 功能真是非常的方便呢!這個功能請一定要記下來,對你未來安裝軟體是非常有幫助的喔! ^_^



22.3.4 EPEL/ELRepo 外掛軟體以及自訂設定檔

鳥哥因為工作的關係,在 Linux 上面經常需要安裝第三方協力軟體,這包括 NetCDF 以及 MPICH 等等的軟體。現在由於平行處理的函式庫需求大增, 所以 MPICH 已經納入預設的 CentOS 7 軟體庫中。但是 NetCDF 這個軟體就沒有包含在裡頭了~同時,Linux 上面還有個很棒的統計軟體,這個軟體名稱為『 R 』! 預設也是不在 CentOS 的軟體庫內~唉~那怎辦?要使用前一章介紹的 Tarball 去編譯與安裝嗎?這倒不需要~因為有很多我們好棒的網友提供預先編譯版本了!

在 Fedora 基金會裡面發展了一個外加軟體計畫 (Extra Packages for Enterprise Linux, EPEL),這個計畫主要是針對 Red Hat Enterprise Linux 的版本來開發的, 剛剛好 CentOS 也是針對 RHEL 的版本來處理的嘛!所以也就能夠支援該軟體庫的相關軟體相依環境了。這個計畫的主網站在底下網頁:

而我們的 CentOS 7 主要可以使用的軟體倉庫網址為:

除了上述的 Fedora 計畫所提供的額外軟體庫之外,其實社群裡面也有朋友針對 CentOS 與 EPEL 的不足而提供的許多軟體倉庫喔! 底下鳥哥是列出當初鳥哥為了要處理 PCI passthrough 虛擬化而使用到的 ELRepo 這個軟體倉庫,若有其他的需求,你就得要自己搜尋了! 這個 ELRepo 軟體倉庫與提供給 CentOS 7.x 的網址如下:

這個 ELRepo 的軟體庫跟其他軟體庫比較不同的地方在於這個軟體庫提供的資料大多是與核心、核心模組與虛擬化相關軟體有關,例如 NVidia 的驅動程式也在裡面咧! 尤其提供了最新的核心 (取名為 kernel-ml 的軟體名稱,其實就是最新的 Linux 核心啊!),如果你的系統像鳥哥的某些發展伺服器一樣,那就有可能會使用到這個軟體庫喔!

好了!根據上面的說明,來玩一玩底下這個模擬案例看看:

問:
我的系統上面想要透過上述的 CentOS 7 的 EPEL 計畫來安裝 netcdf 以及 R 這兩套軟體,該如何處理?
答:
  • 首先,你的系統應該要針對 epel 進行 yum 的設定檔處理,處理方式如下:
    [root@study ~]# vim /etc/yum.repos.d/epel.repo
    [epel]
    name = epel packages
    baseurl = https://dl.fedoraproject.org/pub/epel/7/x86_64/
    gpgcheck = 0
    enabled = 0
    
    鳥哥故意不要啟動這個軟體倉庫,只是未來有需要的時候才進行安裝,預設不要去找這個軟體庫!

  • 接下來使用這個軟體庫來進行安裝 netcdf 與 R 的行為喔!
    [root@study ~]# yum --enablerepo=epel install netcdf R
    
    這樣就可以安裝起來了!未來你沒有加上 --enablerepo=epel 時,這個 EPEL 的軟體並不會更新喔!
  • 使用本機的原版光碟

萬一你的主機並沒有網路,但是你卻有很多軟體安裝的需求~假設你的系統也都還沒有任何升級的動作過, 這個時候我能不能用本機的光碟來作為主要的軟體來源呢?答案當然是可以啊!那要怎麼做呢? 很簡單,將你的光碟掛載到某個目錄,我們這裡還是繼續假設在 /mnt 好了,然後設定如下的 yum 設定檔:

[root@study ~]# vim /etc/yum.repos.d/cdrom.repo
[mycdrom]
name = mycdrom 
baseurl = file:///mnt
gpgcheck = 0
enabled = 0

[root@study ~]# yum --enablerepo=mycdrom install software_name

這個設定功能在你沒有網路但是卻需要解決很多軟體相依性的狀況時,相當好用啊!



22.3.5 全系統自動升級

我們可以手動選擇是否需要升級,那能不能讓系統自動升級,讓我們的系統隨時保持在最新的狀態呢? 當然可以啊!透過『 yum -y update 』來自動升級,那個 -y 很重要,因為可以自動回答 yes 來開始下載與安裝! 然後再透過 crontab 的功能來處理即可!假設我每天在台灣時間 3:00am 網路頻寬比較輕鬆的時候進行升級, 你可以這樣做的:

[root@study ~]# echo '10 1 * * * root /usr/bin/yum -y --enablerepo=epel update' > /etc/cron.d/yumupdate
[root@study ~]# vim /etc/crontab

從此你的系統就會自動升級啦!很棒吧!此外,你還是得要分析登錄檔與收集 root 的信件的, 因為如果升級的是核心軟體 (kernel),那麼你還是得要重新開機才會讓安裝的軟體順利運作的! 所以還是得分析登錄檔,若有新核心安裝,就重新開機,否則就讓系統自動維持在最新較安全的環境吧! 真是輕鬆愉快的管理啊!



22.3.6 管理的抉擇:RPM 還是 Tarball

這一直是個有趣的問題:『如果我要升級的話,或者是全新安裝一個新的軟體, 那麼該選擇 RPM 還是 Tarball 來安裝呢?』,事實上考慮的因素很多,不過鳥哥通常是這樣建議的:

  1. 優先選擇原廠的 RPM 功能:

    由於原廠釋出的軟體通常具有一段時間的維護期,舉例來說, RHEL 與 CentOS 每一個版本至少提供五年以上的更新期限。這對於我們的系統安全性來說,實在是非常好的選項! 何解?既然 yum 可以自動升級,加上原廠會持續維護軟體更新,那麼我們的系統就能夠自己保持在軟體最新的狀態, 對於資安來說當然會比較好一些的! 此外,由於 RPM 與 yum 具有容易安裝/移除/升級等特點,且還提供查詢與驗證的功能,安裝時更有數位簽章的保護, 讓你的軟體管理變的更輕鬆自在!因此,當然首選就是利用 RPM 來處理啦!

  2. 選擇軟體官網釋出的 RPM 或者是提供的軟體庫網址:

    不過,原廠並不會包山包海,因此某些特殊軟體你的原版廠商並不會提供的!舉例來說 CentOS 就沒有提供 NTFS 的相關模組。此時你可以自行到官網去查閱,看看有沒有提供相對到你的系統的 RPM 檔案, 如果有提供軟體庫網址,那就更好啦!可以修改 yum 設定檔來加入該軟體庫,就能夠自動安裝與升級該軟體! 你說方不方便啊!

  3. 利用 Tarball 安裝特殊軟體:

    某些特殊用途的軟體並不會特別幫你製作 RPM 檔案的,此時建議你也不要妄想自行製作 SRPM 來轉成 RPM 啦! 因為你只有區區一部主機而已,若是你要管理相同的 100 部主機,那麼將原始碼轉製作成 RPM 就有價值! 單機版的特殊軟體,例如學術網路常會用到的 MPICH/PVM 等平行運算函式庫,這種軟體建議使用 tarball 來安裝即可, 不需要特別去搜尋 RPM 囉!

  4. 用 Tarball 測試新版軟體:

    某些時刻你可能需要使用到新版的某個軟體,但是原版廠商僅提供舊版軟體,舉例來說,我們的 CentOS 主要是定位於企業版,因此很多軟體的要求是『穩』而不是『新』,但你就是需要新軟體啊! 然後又擔心新軟體裝好後產生問題,回不到舊軟體,那就慘了!此時你可以用 tarball 安裝新軟體到 /usr/local 底下, 那麼該軟體就能夠同時安裝兩個版本在系統上面了!而且大多數軟體安裝數種版本時還不會互相干擾的! 嘿嘿!用來作為測試新軟體是很不錯的呦!只是你就得要知道你使用的指令是新版軟體還是舊版軟體了!

所以說,RPM 與 Tarball 各有其優缺點,不過,如果有 RPM 的話,那麼優先權還是在於 RPM 安裝上面,畢竟管理上比較便利,但是如果軟體的架構差異性太大, 或者是無法解決相依屬性的問題,那麼與其花大把的時間與精力在解決屬性相依的問題上,還不如直接以 tarball 來安裝,輕鬆又愜意!



22.3.7 基礎服務管理:以 Apache 為例

我們在 17 章談到 systemd 的服務管理,那個時候僅使用 vsftpd 這個比較簡單的服務來做個說明,那是因為還沒有談到 yum 這個東東的緣故。 現在,我們已經處理好了網路問題 (20 章的內容),這個 yum 也能夠順利的使用!那麼有沒有其他的服務可以拿來做個測試呢?有的,我們就拿網站伺服器來說明吧!

一般來說, WWW 網站伺服器需要的有 WWW 伺服器軟體 + 網頁程式語言 + 資料庫系統 + 程式語言與資料庫的連結軟體等等,在 CentOS 上面, 我們需要的軟體就有『 httpd + php + mariadb-server + php-mysql 』這些軟體。不過我們預設僅要啟用 httpd 而已,因此等一下雖然上面的軟體都要安裝, 不過僅有 httpd 預設要啟動而已喔!

另外,在預設的情況下,你無須修改服務的設定檔,都透過系統預設值來處理你的服務即可!那麼有個江湖口訣你可以將它背下來~ 讓你在處理服務的時候就不會掉漆了~

  1. 安裝: yum install (你的軟體)
  2. 啟動: systemctl start (你的軟體)
  3. 開機啟動: systemctl enable (你的軟體)
  4. 防火牆: firewall-cmd --add-service="(你的服務)"; firewall-cmd --permanent --add-service="(你的服務)"
  5. 測試: 用軟體去查閱你的服務正常與否~

底下就讓我們一步一步來實驗吧!

# 0. 先檢查一下有哪些軟體沒有安裝或已安裝~這個不太需要進行~單純是鳥哥比較龜毛要先查看看而已!
[root@study ~]# rpm -q httpd php mariadb-server php-mysql
httpd-2.4.6-31.el7.centos.1.x86_64        # 只有這個安裝好了,底下三個都沒裝!
package php is not installed
package mariadb-server is not installed
package php-mysql is not installed

# 1. 安裝所需要的軟體!
[root@study ~]# yum install httpd php mariadb-server php-mysql
# 當然,大前提是你的網路沒問題!這樣就可以直接線上安裝或升級!

# 2. 3. 啟動與開機啟動,這兩個步驟要記得一定得進行!
[root@study ~]# systemctl daemon-reload
[root@study ~]# systemctl start httpd
[root@study ~]# systemctl enable httpd
[root@study ~]# systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
   Active: active (running) since Wed 2015-09-09 16:52:04 CST; 9s ago
 Main PID: 8837 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─8837 /usr/sbin/httpd -DFOREGROUND

# 4. 防火牆
[root@study ~]# firewall-cmd --add-service="http"
[root@study ~]# firewall-cmd --permanent  --add-service="http"
[root@study ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client ftp http https ssh   # 這個是否有啟動才是重點!
  ports: 222/tcp 555/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="192.168.1.0/24" accept

在最後的測試中,進入圖形界面,打開你的瀏覽器,在網址列輸入『 http://localhost 』就會出現如下的畫面! 那就代表成功了!你的 Linux 已經是 Web server 囉!就是這麼簡單!

服務建立的第五步驟,測試一下有沒有成功!
圖22.3.1、服務建立的第五步驟,測試一下有沒有成功!

22.4 SRPM 的使用 : rpmbuild (Optional)

談完了 RPM 類型的軟體之後,再來我們談一談包含了 Source code 的 SRPM 該如何使用呢?假如今天我們由網路上面下載了一個 SRPM 的檔案,該如何安裝他?又,如果我想要修改這個 SRPM 裡面原始碼的相關設定值,又該如何訂正與重新編譯呢? 此外,最需要注意的是,新版的 rpm 已經將 RPM 與 SRPM 的指令分開了,SRPM 使用的是 rpmbuild 這個指令,而不是 rpm 喔

22.4.1 利用預設值安裝 SRPM 檔案 (--rebuid/--recompile)

假設我下載了一個 SRPM 的檔案,又不想要修訂這個檔案內的原始碼與相關的設定值, 那麼我可以直接編譯並安裝嗎?當然可以!利用 rpmbuild 配合選項即可。選項主要有底下兩個:

--rebuild 這個選項會將後面的 SRPM 進行『編譯』與『打包』的動作,最後會產生 RPM 的檔案,但是產生的 RPM 檔案並沒有安裝到系統上。當你使用 --rebuild 的時候,最後通常會發現一行字體:
Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm
這個就是編譯完成的 RPM 檔案囉!這個檔案就可以用來安裝啦!安裝的時候請加絕對路徑來安裝即可!
--recompile 這個動作會直接的『編譯』『打包』並且『安裝』囉!請注意, rebuild 僅『編譯並打包』而已,而 recompile 不但進行編譯跟打包,還同時進行『安裝』了!

不過,要注意的是,這兩個選項都沒有修改過 SRPM 內的設定值,僅是透過再次編譯來產生 RPM 可安裝軟體檔案而已。 一般來說,如果編譯的動作順利的話,那麼編譯過程所產生的中間暫存檔都會被自動刪除,如果發生任何錯誤, 則該中間檔案會被保留在系統上,等待使用者的除錯動作!

問:
請由 http://vault.centos.org/ 下載正確的 CentOS 版本中, 在 updates 軟體庫當中的 ntp 軟體 SRPM,請下載最新的那個版本即可,然後進行編譯的行為。
答:
目前 (2015/09) 最新的版本為:ntp-4.2.6p5-19.el7.centos.1.src.rpm 這一個,所以我是這樣作的:
  • 先下載軟體:
    wget http://vault.centos.org/7.1.1503/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.1.src.rpm
  • 再嘗試直接編譯看看:
    rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
  • 上面的動作會告訴我還有一堆相依軟體沒有安裝~所以我得要安裝起來才行:
    yum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel
  • 再次嘗試編譯的行為:
    rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
  • 最終的軟體就會被放置到:
    /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm

上面的測試案例是將一個 SRPM 檔案抓下來之後,依據你的系統重新進行編譯。一般來說,因為該編譯可能會依據你的系統硬體而最佳化, 所以可能效能會好一些些,但是...人類根本感受不到那種效能優化的效果~所以並不建議你這麼作。此外, 這種情況也很能發生在你從不同的 Linux distribution 所下載的 SRPM 拿來想要安裝在你的系統上,這樣作才算是有點意義。

一般來說,如果你有需要用到 SRPM 的檔案,大部分的原因就是...你需要重新修改裡面的某些設定,讓軟體加入某些特殊功能等等的。 所以囉,此時就得要將 SRPM 拆開,編輯一下編譯設定檔,然後再予以重新編譯啦!下個小節我們來玩玩修改設定的方式!



22.4.2 SRPM 使用的路徑與需要的軟體

SRPM 既然含有 source code ,那麼其中必定有設定檔囉,所以首先我們必需要知道,這個 SRPM 在進行編譯的時候會使用到哪些目錄呢?這樣一來才能夠來修改嘛! 不過從 CentOS 6.x 開始 (當然包含我們的 CentOS 7.x 囉),因為每個用戶應該都有能力自己安裝自己的軟體,因此 SRPM 安裝、設定、編譯、最終結果所使用的目錄都與操作者的家目錄有關~鳥哥假設你用 root 的身份來進行 SRPM 的操作, 那麼你應該就會使用到下列的目錄喔:

/root/rpmbuild/SPECS 這個目錄當中放置的是該軟體的設定檔,例如這個軟體的資訊參數、設定項目等等都放置在這裡;
/root/rpmbuild/SOURCES 這個目錄當中放置的是該軟體的原始檔 (*.tar.gz 的檔案) 以及 config 這個設定檔;
/root/rpmbuild/BUILD 在編譯的過程中,有些暫存的資料都會放置在這個目錄當中;
/root/rpmbuild/RPMS 經過編譯之後,並且順利的編譯成功之後,將打包完成的檔案放置在這個目錄當中。裡頭有包含了 x86_64, noarch.... 等等的次目錄。
/root/rpmbuild/SRPMS 與 RPMS 內相似的,這裡放置的就是 SRPM 封裝的檔案囉!有時候你想要將你的軟體用 SRPM 的方式釋出時, 你的 SRPM 檔案就會放置在這個目錄中了。

Tips鳥哥的圖示 早期要使用 SRPM 時,必須是 root 的身份才能夠使用編譯行為,同時原始碼都會被放置到 /usr/src/redhat/ 目錄內喔! 跟目前放置到 /~username/rpmbuild/ 的情況不太一樣!

此外,在編譯的過程當中,可能會發生不明的錯誤,或者是設定的錯誤,這個時候就會在 /tmp 底下產生一個相對應的錯誤檔,你可以根據該錯誤檔進行除錯的工作呢! 等到所有的問題都解決之後,也編譯成功了,那麼剛剛解壓縮之後的檔案,就是在 /root/rpmbild/{SPECS, SOURCES, BUILD} 等等的檔案都會被殺掉,而只剩下放置在 /root/rpmbuild/RPMS 底下的檔案了!

由於 SRPM 需要重新編譯,而編譯的過程當中,我們至少需要有 make 與其相關的程式,及 gcc, c, c++ 等其他的編譯用的程式語言來進行編譯,更多說明請參考第二十一章原始碼所需基礎軟體吧。 所以,如果你在安裝的過程當中沒有選取軟體開發工具之類的軟體,這時就得要使用上一小節介紹的 yum 來安裝就是了! 當然,那個 "Development Tools" 的軟體群組請不要忘記安裝了!

問:
嘗試將上個練習下載的 ntp 的 SRPM 軟體直接安裝到系統中 (不要編譯),然後查閱一下所有用到的目錄為何?
答:
# 1. 鳥哥這裡假設你用 root 的身份來進行安裝的行為喔!
[root@study ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm
Updating / installing...
   1:ntp-4.2.6p5-19.el7.centos.1      ################################# [100%]
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
# 會有一堆 warning 的問題,那個不要理它!可以忽略沒問題的!

# 2. 查閱一下 /root/rpmbuild 目錄的內容!
[root@study ~]# ll -l /root/rpmbuild
drwxr-xr-x. 3 root root   39 Sep  8 16:16 BUILD
drwxr-xr-x. 2 root root    6 Sep  8 16:16 BUILDROOT
drwxr-xr-x. 4 root root   32 Sep  8 16:16 RPMS
drwxr-xr-x. 2 root root 4096 Sep  9 09:43 SOURCES
drwxr-xr-x. 2 root root   39 Sep  9 09:43 SPECS     # 這個傢伙最重要!
drwxr-xr-x. 2 root root    6 Sep  8 14:51 SRPMS

[root@study ~]# ll -l /root/rpmbuild/{SOURCES,SPECS}
/root/rpmbuild/SOURCES:
-rw-rw-r--. 1 root root      559 Jun 24 07:44 ntp-4.2.4p7-getprecision.patch
-rw-rw-r--. 1 root root      661 Jun 24 07:44 ntp-4.2.6p1-cmsgalign.patch
.....(中間省略).....
/root/rpmbuild/SPECS:
-rw-rw-r--. 1 root root   41422 Jun 24 07:44 ntp.spec   # 這就是重點!



22.4.3 設定檔的主要內容 (*.spec)

如前一個小節的練習,我們知道在 /root/rpmbuild/SOURCES 裡面會放置原始檔 (tarball) 以及相關的修補檔 (patch file), 而我們也知道編譯需要的步驟大抵就是 ./configure, make, make check, make install 等,那這些動作寫入在哪裡呢? 就在 SPECS 目錄中啦!讓我們來瞧一瞧 SPECS 裡面的檔案說些什麼吧!

[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# vim ntp.spec
# 1. 首先,這個部分在介紹整個軟體的基本相關資訊!不論是版本還是釋出次數等。
Summary: The NTP daemon and utilities           # 簡易的說明這個軟體的功能
Name: ntp                                       # 軟體的名稱
Version: 4.2.6p5                                # 軟體的版本
Release: 19%{?dist}.1                           # 軟體的釋出版次
# primary license (COPYRIGHT) : MIT             # 底下有很多 # 的註解說明!
.....(中間省略).....
License: (MIT and BSD and BSD with advertising) and GPLv2
Group: System Environment/Daemons
Source0: http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-%{version}.tar.gz
Source1: ntp.conf                               # 寫 SourceN 的就是原始碼!
Source2: ntp.keys                               # 原始碼可以有很多個!
.....(中間省略).....
Patch1: ntp-4.2.6p1-sleep.patch                 # 接下來則是補丁檔案,就是 PatchN 的目的!
Patch2: ntp-4.2.6p4-droproot.patch
.....(中間省略).....

# 2. 這部分則是在設定相依屬性需求的地方!
URL: http://www.ntp.org                         # 底下則是說明這個軟體的相依性,
Requires(post): systemd-units                   # 還有編譯過程需要的軟體有哪些等等!
Requires(preun): systemd-units
Requires(postun): systemd-units
Requires: ntpdate = %{version}-%{release}
BuildRequires: libcap-devel openssl-devel libedit-devel perl-HTML-Parser
BuildRequires: pps-tools-devel autogen autogen-libopts-devel systemd-units
.....(中間省略).....
%package -n ntpdate                             # 其實這個軟體包含有很多次軟體喔!
Summary: Utility to set the date and time via NTP
Group: Applications/System
Requires(pre): shadow-utils
Requires(post): systemd-units
Requires(preun): systemd-units
Requires(postun): systemd-units
.....(中間省略).....

# 3. 編譯前的預處理,以及編譯過程當中所需要進行的指令,都寫在這裡
#    尤其 %build 底下的資料,幾乎就是 makefile 裡面的資訊啊!
%prep                                           # 這部份大多在處理補丁的動作!
%setup -q -a 5
%patch1 -p1 -b .sleep                           # 這些 patch 當然與前面的 PatchN 有關!
%patch2 -p1 -b .droproot
.....(中間省略).....
%build                                          # 其實就是 ./configure, make 等動作!
sed -i 's|$CFLAGS -Wstrict-overflow|$CFLAGS|' configure sntp/configure
export CFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing -fno-strict-overflow"
export LDFLAGS="-pie -Wl,-z,relro,-z,now"
%configure \                                    # 不就是 ./configure 的意思嗎!
        --sysconfdir=%{_sysconfdir}/ntp/crypto \
        --with-openssl-libdir=%{_libdir} \
        --without-ntpsnmpd \
        --enable-all-clocks --enable-parse-clocks \
        --enable-ntp-signd=%{_localstatedir}/run/ntp_signd \
        --disable-local-libopts
echo '#define KEYFILE "%{_sysconfdir}/ntp/keys"' >> ntpdate/ntpdate.h
echo '#define NTP_VAR "%{_localstatedir}/log/ntpstats/"' >> config.h

make %{?_smp_mflags}                            # 不就是 make 了嗎!
.....(中間省略).....

%install                                        # 就是安裝過程所進行的各項動作了!
make DESTDIR=$RPM_BUILD_ROOT bindir=%{_sbindir} install

mkdir -p $RPM_BUILD_ROOT%{_mandir}/man{5,8}
sed -i 's/sntp\.1/sntp\.8/' $RPM_BUILD_ROOT%{_mandir}/man1/sntp.1
mv $RPM_BUILD_ROOT%{_mandir}/man{1/sntp.1,8/sntp.8}
rm -rf $RPM_BUILD_ROOT%{_mandir}/man1
.....(中間省略).....

# 4. 這裡列出,這個軟體釋出的檔案有哪些的意思!
%files                                          # 這軟體所屬的檔案有哪些的意思!
%dir %{ntpdocdir}
%{ntpdocdir}/COPYRIGHT
%{ntpdocdir}/ChangeLog
.....(中間省略).....

# 5. 列出這個軟體的更改歷史紀錄檔!
%changelog
* Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone

* Thu Apr 23 2015 Miroslav Lichvar <mlichvar@redhat.com> 4.2.6p5-19.el7_1.1
- don't step clock for leap second with -x option (#1191122)
.....(後面省略).....

要注意到的是 ntp.sepc 這個檔案,這是主要的將 SRPM 編譯成 RPM 的設定檔,他的基本規則可以這樣看:

  1. 整個檔案的開頭以Summary為開始,這部份的設定都是最基礎的說明內容;
  2. 然後每個不同的段落之間,都以 % 來做為開頭,例如 %prep 與 %install 等;

我們來談一談幾個常見的 SRPM 設定段落:

  • 系統整體資訊方面:

剛剛你看到的就有底下這些重要的咚咚囉:

參數參數意義
Summary 本軟體的主要說明,例如上表中說明了本軟體是針對 NTP 的軟體功能與工具等啦!
Name 本軟體的軟體名稱 (最終會是 RPM 檔案的檔名構成之一)
Version 本軟體的版本 (也會是 RPM 檔名的構成之一)
Release 這個是該版本打包的次數說明 (也會是 RPM 檔名的構成之一)。由於我們想要動點手腳,所以請將『 19%{?dist}.1 』 修改為『 20.vbird 』 看看
License 這個軟體的授權模式,看起來涵蓋了所有知名的 Open source 授權啊!!
Group 這個軟體在安裝的時候,主要是放置於哪一個軟體群組當中 (yum grouplist 的特點!);
URL 這個原始碼的主要官方網站;
SourceN 這個軟體的來源,如果是網路上下載的軟體,通常一定會有這個資訊來告訴大家這個原始檔的來源! 此外,如果有多個軟體來源,就會以 Source0, Source1... 來處理原始碼喔!
PatchN 就是作為補丁的 patch file 囉!也是可以有好多個!
BuildRoot 設定作為編譯時,該使用哪個目錄來暫存中間檔案 (如編譯過程的目標檔案/連結檔案等檔)。
上述為必須要存在的項目,底下為可使用的額外設定值
Requires 如果你這個軟體還需要其他的軟體的支援,那麼這裡就必需寫上來,則當你製作成 RPM 之後,系統就會自動的去檢查啦!這就是『相依屬性』的主要來源囉!
BuildRequires 編譯過程中所需要的軟體。Requires 指的是『安裝時需要檢查』的,因為與實際運作有關,這個 BuildRequires 指的是『編譯時』所需要的軟體,只有在 SRPM 編譯成為 RPM 時才會檢查的項目。

上面幾個資料通常都必需要寫啦!但是如果你的軟體沒有相依屬性的關係時,那麼就可以不需要那個 Requires 囉! 根據上面的設定,最終的檔名就會是『{Name}-{Version}-{Release}.{Arch}.rpm』的樣式, 以我們上面的設定來說,檔名應該會是『ntp-4.2.6p5-20.vbird.x86_64.rpm』的樣子囉!

  • %description:

將你的軟體做一個簡短的說明!這個也是必需要的。還記得使用『 rpm -qi 軟體名稱 』會出現一些基礎的說明嗎? 上面這些東西包括 Description 就是在顯示這些重要資訊的啦!所以,這裡記得要詳加解釋喔!

  • %prep:

pre 這個關鍵字原本就有『在...之前』的意思,因此這個項目在這裡指的就是『尚未進行設定或安裝之前,你要編譯完成的 RPM 幫你事先做的事情』,就是 prepare 的簡寫囉!那麼他的工作事項主要有:

  1. 進行軟體的補丁 (patch) 等相關工作;
  2. 尋找軟體所需要的目錄是否已經存在?確認用的!
  3. 事先建立你的軟體所需要的目錄,或者事先需要進行的任務;
  4. 如果待安裝的Linux系統內已經有安裝的時候可能會被覆蓋掉的檔案時,那麼就必需要進行備份(backup)的工作了!

在本案例中,你會發現程式會使用 patch 去進行補丁的動作啦!所以程式的原始碼才會更新到最新啊!

  • %build:

build 就是建立啊!所以當然囉,這個段落就是在談怎麼 make 編譯成為可執行的程式囉! 你會發現在此部分的程式碼方面,就是 ./configure, make 等項目哩!一般來說,如果你會使用 SRPM 來進行重新編譯的行為, 通常就是要重新 ./configure 並給予新的參數設定!於是這部份就可能會修改到!

  • %install:

編譯完成 (build) 之後,就是要安裝啦!安裝就是寫在這裡,也就是類似 Tarball 裡面的 make install 的意思囉!

  • %files:

這個軟體安裝的檔案都需要寫到這裡來,當然包括了『目錄』喔!所以連同目錄請一起寫到這個段落當中!以備查驗呢!^_^ !此外,你也可以指定每個檔案的類型,包括文件檔 (%doc 後面接的) 與設定檔 (%config 後面接的) 等等。

  • %changelog:

這個項目主要則是在記錄這個軟體曾經的更新紀錄囉!星號 (*) 後面應該要以時間,修改者, email 與軟體版本來作為說明, 減號 (-) 後面則是你要作的詳細說明囉!在這部份鳥哥就新增了兩行,內容如下:

%changelog
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw>- 4.2.6p5-20.vbird
- only rebuild this SRPM to RPM

* Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone
....(底下省略)....

修改到這裡也差不多了,您也應該要瞭解到這個 ntp.spec 有多麼重要!我們用 rpm -q 去查詢一堆資訊時, 其實都是在這裡寫入的!這樣瞭解否?接下來,就讓我們來瞭解一下如何將 SRPM 給他編譯出 RPM 來吧!



22.4.4 SRPM 的編譯指令 (-ba/-bb)

要將在 /root/rpmbuild 底下的資料編譯或者是單純的打包成為 RPM 或 SRPM 時,就需要 rpmbuild 指令與相關選項的幫忙了!我們只介紹兩個常用的選項給您瞭解一下:

[root@study ~]# rpmbuild -ba ntp.spec  <==編譯並同時產生 RPM 與 SRPM 檔案
[root@study ~]# rpmbuild -bb ntp.spec  <==僅編譯成 RPM 檔案

這個時候系統就會這樣做:

  1. 先進入到 BUILD 這個目錄中,亦即是: /root/rpmbuild/BUILD 這個目錄;

  2. 依照 *.spec 檔案內的 Name 與 Version 定義出工作的目錄名稱,以我們上面的例子為例,那麼系統就會在 BUILD 目錄中先刪除 ntp-4.2.6p5 的目錄,再重新建立一個 ntp-4.2.6p5 的目錄,並進入該目錄;

  3. 在新建的目錄裡面,針對 SOURCES 目錄下的來源檔案,也就是 *.spec 裡面的 Source 設定的那個檔案,以 tar 進行解壓縮,以我們這個例子來說,則會在 /root/rpmbuild/BUILD/ntp-4.2.6p5 當中,將 /root/rpmbuild/SOURCES/ntp-* 等等多個原始碼檔案進行解壓縮啦!

  4. 再來開始 %build 及 %install 的設定與編譯!

  5. 最後將完成打包的檔案給他放置到該放置的地方去,如果你的系統是 x86_64 的話,那麼最後編譯成功的 *.x86_64.rpm檔案就會被放置在 /root/rpmbuild/RPMS/x86_64 裡面囉!如果是 noarch 那麼自然就是 /root/rpmbuild/RPMS/noarch 目錄下囉!

整個步驟大概就是這樣子!最後的結果資料會放置在 RPMS 那個目錄底下就對啦!我們這個案例中想要同時打包 RPM 與 SRPM , 因此請您自行處理一下『 rpmbuild -ba ntp.spec 』吧!

[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# rpmbuild -ba ntp.spec
.....(前面省略).....
Wrote: /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/sntp-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.xZh6yz
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd ntp-4.2.6p5
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-20.vbird.x86_64
+ exit 0

[root@study SPECS]# find /root/rpmbuild -name 'ntp*rpm'
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
/root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
/root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
# 上面分別是 RPM 與 SRPM 的檔案檔名!

您瞧!嘿嘿~有 vbird 的軟體出現了!相當有趣吧!另外,有些文件軟體是與硬體等級無關的 (因為單純的文件啊!),所以如上表所示, 你會發現 ntp-doc-4.2.6p5-20.vbird.noarch.rpm 是 noarch 喔!有趣吧!



22.4.5 一個打包自己軟體的範例

這個就有趣了!我們自己來編輯一下自己製作的 RPM 怎麼樣?會很難嗎?完全不會! 我們這裡就舉個例子來玩玩吧!還記得我們在前一章談到 Tarball 與 make 時,曾經談到的 main 這個程式嗎?現在我們將這個程式加上 Makefile 後, 將他製作成為 main-0.1-1.x86_64.rpm 好嗎?那該如何進行呢?底下就讓我們來處理處理吧!

  • 製作原始碼檔案 tarball 產生:

因為鳥哥的網站並沒有直接釋出 main-0.2,所以假設官網提供的是 main-0.l 版本之外,同時提供了一個 patch 檔案~ 那我們就得要這樣作:

  • main-0.1.tar.gz 放在 /root/rpmbuild/SOURCES/
  • main_0.1_to_0.2_patch 放在 /root/rpmbuild/SOURCES/
  • main.spec 自行撰寫放在 /root/rpmbuild/SPECS/
# 1. 先來處理原始碼的部份,假設你的 /root/rpmbuild/SOURCES 已經存在了喔!
[root@study ~]# cd /root/rpmbuild/SOURCES
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
[root@study SOURCES]# ll main*
-rw-r--r--. 1 root root  703 Sep  4 14:47 main-0.1.tgz
-rw-r--r--. 1 root root 1538 Sep  4 14:51 main_0.1_to_0.2.patch

接下來就是 spec 檔案的建立囉!

  • 建立 *.spec 的設定檔

這個檔案的建置是所有 RPM 製作裡面最重要的課題!你必須要仔細的設定他,不要隨便處理!仔細看看吧! 有趣的是,CentOS 7.x 會主動的將必要的設定參數列出來喔!相當有趣! ^_^

[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# vim main.spec
Name:           main
Version:        0.1
Release:        1%{?dist}
Summary:        Shows sin and cos value.
Group:          Scientific Support
License:        GPLv2
URL:            http://linux.vbird.org/
Source0:        main-0.1.tgz             # 這兩個檔名要正確喔!
Patch0:         main_0.1_to_0.2.patch

%description
This package will let you input your name and calculate sin cos value.

%prep
%setup -q
%patch0 -p1                              # 要用來作為 patch 的動作!

%build
make clean main                          # 編譯就好!不要安裝!

%install
mkdir -p %{buildroot}/usr/local/bin
install -m 755 main %{buildroot}/usr/local/bin # 這才是順利的安裝行為!

%files
/usr/local/bin/main

%changelog
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.2
- build the program
  • 編譯成為 RPM 與 SRPM

老實說,那個 spec 檔案建置妥當後,後續的動作就簡單的要命了!開始來編譯吧!

[root@study SPECS]# rpmbuild -ba main.spec
.....(前面省略).....
Wrote: /root/rpmbuild/SRPMS/main-0.1-1.el7.centos.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/main-debuginfo-0.1-1.el7.centos.x86_64.rpm

很快的,我們就已經建立了幾個 RPM 檔案囉!接下來讓我們好好測試一下打包起來的成果吧!

  • 安裝/測試/實際查詢
[root@study ~]# yum install /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
[root@study ~]# rpm -ql main
/usr/local/bin/main   <==自己嘗試執行 main 看看!

[root@study ~]# rpm -qi main
Name        : main
Version     : 0.1
Release     : 1.el7.centos
Architecture: x86_64
Install Date: Wed 09 Sep 2015 04:29:08 PM CST
Group       : Scientific Support
Size        : 7200
License     : GPLv2
Signature   : (none)
Source RPM  : main-0.1-1.el7.centos.src.rpm
Build Date  : Wed 09 Sep 2015 04:27:29 PM CST
Build Host  : study.centos.vbird
Relocations : (not relocatable)
URL         : http://linux.vbird.org/
Summary     : Shows sin and cos value.
Description :
This package will let you input your name and calculate sin cos value.
# 看到沒?屬於你自己的軟體喔!真是很愉快的啦!

用很簡單的方式,就可以將自己的軟體或者程式給他修改與設定妥當!以後你就可以自行設定你的 RPM 囉!當然,也可以手動修改你的 SRPM 的來源檔內容囉!


22.5 重點回顧

  • 為了避免使用者自行編譯的困擾,開發商自行在特定的硬體與作業系統平台上面預先編譯好軟體, 並將軟體以特殊格式封包成檔案,提供終端用戶直接安裝到固定的作業系統上,並提供簡單的查詢/安裝/移除等流程。 此稱為軟體管理員。常見的軟體管理員有 RPM 與 DPKG 兩大主流。
  • RPM 的全名是 RedHat Package Manager,原本是由 Red Hat 公司所發展的,流傳甚廣;
  • RPM 類型的軟體中,所含有的軟體是經過編譯後的 binary program ,所以可以直接安裝在使用者端的系統上, 不過,也由於如此,所以 RPM 對於安裝者的環境要求相當嚴格;
  • RPM 除了將軟體安裝至使用者的系統上之外,還會將該軟體的版本、名稱、檔案與目錄配置、系統需求等等均記錄於資料庫 (/var/lib/rpm) 當中,方便未來的查詢與升級、移除;
  • RPM 可針對不同的硬體等級來加以編譯,製作出來的檔案可於副檔名 (i386, i586, i686, x86_64, noarch) 來分辨;
  • RPM 最大的問題為軟體之間的相依性問題;
  • SRPM 為 Source RPM ,內含的檔案為 Source code 而非為 binary file ,所以安裝 SRPM 時還需要經過 compile ,不過,SRPM 最大的優點就是可以讓使用者自行修改設定參數 (makefile/configure 的參數) ,以符合使用者自己的 Linux 環境;
  • RPM 軟體的屬性相依問題,已經可以藉由 yum 或者是 APT 等方式加以克服。 CentOS 使用的就是 yum 機制。
  • yum 伺服器提供多個不同的軟體庫放置個別的軟體,以提供用戶端分別管理軟體類別。

22.6 本章習題

  • 情境模擬題:透過 EPEL 安裝 NTFS 檔案系統所需要的軟體

    • 目標:利用 EPEL 提供的軟體來搜尋是否有 NTFS 所需要的各項模組!;
    • 目標:你的 Linux 必須要已經接上 Internet 才行;
    • 需求:最好瞭解磁碟容量是否夠用,以及如何啟動服務等。

    其實這個任務非常簡單!因為我們在前面各小節的說明當中已經說明了如何設定 EPEL 的 yum 設定檔,此時你只要透過底下的方式來處理即可:

    • 使用 yum --enablerepo=epel search ntfs 找出所需要的軟體名稱
    • 再使用 yum --enablerepo=epel install ntfs-3g ntfsprogs 來安裝即可!

簡答題部分:
  • 如果你曾經修改過 yum 設定檔內的軟體庫設定 (/etc/yum.repos.d/*.repo) ,導致下次使用 yum 進行安裝時老是發現錯誤, 此時你該如何是好?
    先確認你的設定檔確實是正確的,如果沒問題,可以將 yum 的快取清除,使用『yum clean all』即可。 事實上, yum 的所有快取、下載軟體、下載軟體的表頭資料,都放置於 /var/cache/yum/ 目錄下。
  • 簡單說明 RPM 與 SRPM 的異同?
    RPM 檔案是由程式打包者 (通常是由 distribution 的開發商) 藉由程式的原始碼,在特定的平台上面所編譯成功的 binary program 的資料,並將該資料製作成為 RPM 的格式,以方便相同軟、硬體平台的使用者之安裝使用。 在安裝時顯的很簡單,因為程式打包者的平台與使用者所使用的平台預設為相同。
    至於 SRPM 則是藉由與 RPM 相同的設定檔資料,不過將原始碼直接包在 SRPM 檔案當中,而不經過編譯。 因為 SRPM 所內含的資料為原始碼,所以安裝時必須要再經過編譯的行為才能成為 RPM 並提供使用者安裝。
  • 假設我想要安裝一個軟體,例如 pkgname.i386.rpm ,但卻老是發生無法安裝的問題,請問我可以加入哪些參數來強制安裝他?
    可以加入 --nodeps 等參數。例如 rpm -ivh --nodeps pkgname.i386.rpm
  • 承上題,你認為強制安裝之後,該軟體是否可以正常執行?為什麼?
    一般來說,應該是『不能執行』的,因為該軟體具有相依屬性的問題, 某些時刻該軟體的程式可能需要呼叫外部的函式庫,但函式庫可能未安裝,因此當然無法執行成功。
  • 有些人使用 CentOS 7.x 安裝在自己的 Atom CPU 上面,卻發現無法安裝,在查詢了該原版光碟的內容,發現裡面的檔案名稱為 ***.x86_64.rpm 。請問,無法安裝的可能原因為何?
    Atom 雖然也是屬於 x86 的架構,但是某些 atom 是屬於 32 位元的系統。但是 CentOS 7 已經僅釋出 64 位元的版本,所以當然無法安裝了!
  • 請問我使用 rpm -Fvh *.rpm 及 rpm -Uvh *.rpm 來升級時,兩者有何不同?
    -Uvh 後面接的軟體,如果原本未安裝,則直接安裝,原本已安裝時,則直接升級;
    -Fvh 後面接的軟體,如果原本未安裝,則不安裝,原本已安裝時,則直接升級;
  • 假設有一個廠商推出軟體時,自行處理了數位簽章,你想要安裝他們的軟體所以需要使用數位簽章,假設數位簽章的檔名為 signe, 那你該如何安裝?
    rpm --import signe
  • 承上,假設該軟體廠商提供了 yum 的安裝網址為: http://their.server.name/path/ ,那你該如何處理 yum 的設定檔?
    可以自行取個檔名,在此例中我們使用『 vim /etc/yum.repos.d/their.repo 』,副檔名要正確! 內容有點像這樣即可:
    [their]
    name=their server name
    baseurl=http://their.server.name/path/
    enable=1
    gpgcheck=0
    然後使用 yum 去安裝該軟體看看。

22.7 參考資料與延伸閱讀

2002/08/21:第一次完成
2003/02/11:重新編排與加入 FAQ
2004/04/11:已經完成了 Source code 與 Tarball ,開始進行 RPM 與 SRPM 的介紹!(需要耗時多日啊!因為又要進兵營去了!)
2004/04/20:終於給他熬出來啦!又是過了兩個休假期間~啊!給我退伍令、其餘免談!
2005/10/02:舊版的 SRPM 資料已經移動到 此處
2005/10/03:舊版的針對 Red Hat 與 Mandriva 的版本移動到 此處
2005/10/03:將原本去年的版本改為 FC4 為範例的模樣!
2009/06/20:原本的針對 FC4 寫的舊版文章移動到此處
2009/09/18:加入了簡單的情境模擬,也加入了一些關於 yum 的習題喔!
2015/10/16:加入了 ELRepo 這個專門提供核心給 CentOS 使用的軟體庫功能介紹!
2002/12/04以來統計人數
計數器
>>
HOME
PrePage
NextPage
   http://linux.vbird.org is designed by VBird during 2001-2017.