1. 程式人生 > >Linux學習筆記30——linux如何安裝軟體?(RPM、SRPM、yum)

Linux學習筆記30——linux如何安裝軟體?(RPM、SRPM、yum)

 

目錄

一、軟體管理員簡介

1,Linux 界的兩大主流: RPM 與 DPKG

2,什麼是 RPM 與 SRPM

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

4,RPM 的優點

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

二、RPM 軟體管理程式: rpm

1,RPM 預設安裝的路徑

2,RPM 安裝 (install)

3,RPM 升級與更新 (upgrade/freshen)

4,RPM 查詢 (query)

5,RPM 驗證與數碼簽章 (Verify/signature)

數碼簽章 (digital signature)

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

三、YUM 線上升級機制

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

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

安裝/升級功能:yum [install|update] 軟體

移除功能:yum [remove] 軟體

2,yum 的配置檔案


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

一、軟體管理員簡介

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

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

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

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/Fedora

RPM

rpm, rpmbuild

YUM (yum)

Debian/Ubuntu

DPKG

dpkg

APT (apt-get)

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

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 的用處了!

檔案格式

檔名格式

直接安裝與否

內含程式型別

可否修改引數並編譯

RPM

xxx.rpm

已編譯

不可

SRPM

xxx.src.rpm

不可

未編譯之原始碼

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

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 平臺,不論是舊的 pentum 或者是新的 Intel Core 2 與 K8 系列的 CPU 等等,都可以正常的工作!那個 i 指的是 Intel 相容的 CPU 的意思,至於 386 不用說,就是 CPU 的等級啦! |

| i586 | 就是針對 586 等級的計算機進行最優化編譯。那是哪些 CPU 呢?包括 pentum 第一代 MMX CPU, AMD 的 K5, K6 系列 CPU (socket 7 插腳) 等等的 CPU 都算是這個等級; |

| i686 | 在 pentun 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 存在, 較常

 

截至目前為止 (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 硬體平臺進行過引數最優化的編譯嘛!

 

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 型別的檔案最為人所詬病的“軟體的屬性相依”問題啦!

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

 

為了重複利用既有的軟體功能,因此很多軟體都會以函式庫的方式釋出部分功能,以方便其他軟體的呼叫應用, 例如 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 資料庫已存在的軟體資料相比較,就能夠一口氣安裝所有需要的具有相依屬性的軟體了。 整個流程可以簡單的如下圖說明:

 

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

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

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

 

二、RPM 軟體管理程式: rpm

 

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

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

 

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 的相關指令來進行說明囉!

 

2,RPM 安裝 (install)

 

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

[[email protected] ~]# rpm -i /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm

 

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

[[email protected] ~]# rpm -ivh package_name

選項與引數:

-i :install 的意思

-v :察看更細部的安裝資訊畫面

-h :以安裝資訊列顯示安裝進度

範例一:安裝原版光碟上的 rp-pppoe 軟體

[[email protected] ~]# 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%]

範例二、一口氣安裝兩個以上的軟體時:

[[email protected] ~]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm

# 後面直接接上許多的軟體檔案!

範例三、直接由網路上面的某個檔案安裝,以網址來安裝:

[[email protected] ~]# 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

 

在鳥哥的系統中,剛好這個軟體並沒有屬性相依的問題,因此最後一個步驟可以順利的進行下去呢!

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 的機制在,這個笨方法當然也就不再需要了!

4,RPM 查詢 (query)

 

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

[[email protected] ~]# rpm -qa <==已安裝軟體

[[email protected] ~]# rpm -q[licdR] 已安裝的軟體名稱 <==已安裝軟體

[[email protected] ~]# rpm -qf 存在於系統上面的某個檔名 <==已安裝軟體

[[email protected] ~]# 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 這個軟體?

[[email protected] ~]# rpm -q logrotate

logrotate-3.8.6-4.el7.x86_64

[[email protected] ~]# rpm -q logrotating

package logrotating is not installed

# 注意到,系統會去找是否有安裝後面接的軟體名稱。注意,不必要加上版本喔!

# 至於顯示的結果,一看就知道有沒有安裝啦!

範例二:列出上題當中,屬於該軟體所提供的所有目錄與檔案:

[[email protected] ~]# rpm -ql logrotate

/etc/cron.daily/logrotate

/etc/logrotate.conf

....(以下省略)....

# 可以看出該軟體到底提供了多少的檔案與目錄,也可以追蹤軟體的資料。

範例三:列出 logrotate 這個軟體的相關說明資料:

[[email protected] ~]# 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 的配置檔案與說明文件

[[email protected] ~]# rpm -qc logrotate

[[email protected] ~]# rpm -qd logrotate

範例五:若要成功安裝 logrotate ,他還需要什麼檔案的幫忙?

[[email protected] ~]# rpm -qR logrotate

/bin/sh

config(logrotate) = 3.8.6-4.el7

coreutils >= 5.92

....(以下省略)....

# 由這裡看起來,呵呵~還需要很多檔案的支援才行喔!

範例六:由上面的範例五,找出 /bin/sh 是那個軟體提供的?

[[email protected] ~]# rpm -qf /bin/sh

bash-4.2.46-12.el7.x86_64

# 這個引數後面接的可是“檔案”吶!不像前面都是接軟體喔!

# 這個功能在查詢系統的某個檔案屬於哪一個軟體所有的。

範例七:假設我有下載一個 RPM 檔案,想要知道該檔案的需求檔案,該如何?

[[email protected] ~]# 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 就可以知道是那個軟體囉!重新安裝一次該軟體即可!

 

5,RPM 驗證與數碼簽章 (Verify/signature)

 

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

[[email protected] ~]# rpm -Va

[[email protected] ~]# rpm -V 已安裝的軟體名稱

[[email protected] ~]# rpm -Vp 某個 RPM 檔案的檔名

[[email protected] ~]# rpm -Vf 在系統上面的某個檔案

選項與引數:

-V :後面加的是軟體名稱,若該軟體所含的檔案被更動過,才會列出來;

-Va :列出目前系統上面所有可能被更動過的檔案;

-Vp :後面加的是檔名稱,列出該軟體內可能被更動過的檔案;

-Vf :列出某個檔案是否被更動過~

範例一:列出你的 Linux 內的 logrotate 這個軟體是否被更動過?

[[email protected] ~]# rpm -V logrotate

# 如果沒有出現任何訊息,恭喜你,該軟體所提供的檔案沒有被更動過。

# 如果有出現任何訊息,才是有出現狀況啊!

範例二:查詢一下,你的 /etc/crontab 是否有被更動過?

[[email protected] ~]# rpm -Vf /etc/crontab

.......T. c /etc/crontab

# 瞧!因為有被更動過,所以會列出被更動過的資訊型別!

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

[[email protected] ~]# 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

[[email protected] ~]# 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) 被更動過是很正常的,萬一你的 binaryprogram 被更動過呢? 那就得要特別特別小心啊!

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 的數碼簽章位於:
[[email protected] ~]# 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
[[email protected] ~]# 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-----

從上面的輸出,你會知道該數碼簽章碼其實僅是一個亂數而已,這個亂數對於數碼簽章有意義而已, 我們看不懂啦!那麼這個檔案如何安裝呢?通過下面的方式來安裝即可喔!
[[email protected] ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

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

那安裝完成之後,這個金鑰的內容會以什麼方式呈現呢?基本上都是使用 pubkey 作為軟體的名稱的! 那我們先列出金鑰軟體名稱後,再以 -qi 的方式來查詢看看該軟體的資訊為何:
[[email protected] ~]# rpm -qa | grep pubkey
gpg-pubkey-f4a80eb5-53a7ff4b
[[email protected] ~]# 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) <[email protected]>
Summary : gpg(CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.11.1 (NSS-3)
....(下面省略)....

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

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

反安裝就是將軟體解除安裝啦!要注意的是,“解安裝的過程一定要由最上層往下解除”,以rp-pppoe 為例,這一個軟體主要是依據 ppp 這個軟體來安裝的,所以當你要解除 ppp 的時候,就必須要先解除 rp-pppoe 才行!否則就會發生結構上的問題啦!這個可以由建築物來說明, 如果你要拆除五、六樓,那麼當然要由六樓拆起,否則先拆的是第五樓時,那麼上面的樓層難道會懸空?
移除的選項很簡單,就通過 -e 即可移除。不過,很常發生軟體屬性相依導致無法移除某些軟體的問題! 我們以下面的例子來說明:
# 1\. 找出與 pam 有關的軟體名稱,並嘗試移除 pam 這個軟體:
[[email protected] ~]# 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
[[email protected] ~]# 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 這個之前範例安裝上的軟體呢?
[[email protected] ~]# rpm -e pam-devel <==不會出現任何訊息!
[[email protected] ~]# rpm -q pam-devel
package pam-devel is not installed

從範例一我們知道 pam 所提供的函式庫是讓非常多其他軟體使用的,因此你不能移除 pam,除非將其他相依軟體一口氣也全部移除!你當然也能加 --nodeps 來強制移除, 不過,如此一來所有會用到 pam 函式庫的軟體,都將成為無法執行的程式,我想,你的主機也只好準備停機休假了吧! 至於範例二中,由於 pam-devel 是依附於 pam 的開發工具,你可以單獨安裝與單獨移除啦!
由於 RPM 檔案常常會安裝/移除/升級等,某些動作或許可能會導致 RPM 資料庫 /var/lib/rpm/內的檔案破損。果真如此的話,那你該如何是好?別擔心,我們可以使用 --rebuilddb 這個選項來重建一下資料庫喔! 作法如下:
[[email protected] ~]# rpm --rebuilddb <==重建資料庫

三、YUM 線上升級機制

 

我們在本章一開始的地方談到過 yum 這玩意兒,這個 yum 是通過分析 RPM 的標頭資料後,根據各軟體的相關性製作出屬性相