## 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 也提供數碼簽章信息, 這些數碼簽章也是在這個目錄內記錄的呢!所以說,這個目錄得要注意不要被刪除了啊!
那么軟件內的文件到底是放置到哪里去啊?當然與文件系統有關對吧!我們在[第五章的目錄配置](../Text/index.html#dir)談過每個目錄的意義, 這里再次的強調啰:
| /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]](#ps1)。 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 <==重建數據庫
```
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀