[CentOS 7] RPM / SRPM 安裝、移除和相關指令操作,所有範例一次全部秀給你

by 9/26/2016 0 意見
RPM 格式真的是個太重要的發明,它讓套件管理這件事,就像人類的交通方式從無可選擇的步行,變成了擁有腳踏車來代步一樣的劇烈。

在 套件升級不求人,手動編譯自己來 - 以 OpenSSH 為例 這篇文章裡,我們為了安裝一個小小的套件,就得從頭到尾、翻來覆去的純手工打造,而且還沒談到更新跟移除之類的動作。

可惜套件並不是個藝術品,完成後就一直用來放著欣賞,而是隨著時間的流逝,反覆不斷的安裝、移除、更新、調整。

本來,要把套件安裝到系統裡,必須經過這麼多的步驟。
  1. 下載原始碼。
  2. 閱讀安裝說明。
  3. 檢查環境組態。
  4. 進行編譯及打包,開始無盡的等待。
  5. 安裝相依套件們,開始步驟 1 到步驟 5 的多次循環。
  6. 安裝主要套件。
一兩個套件也就算了,上百上千個套件都得這麼搞的話,光搞這些事大約就該往生了。
002

所以,在 RPM 這個套件格式和管理工具出現之後,大幅的改變了套件管理的生態。

從此以後,安裝套件的過程變成了這樣子。

  1. 下載 RPM 檔。
  2. 安裝相依套件們,開始步驟 1 到步驟 2 的多次循環。
  3. 安裝主要套件
曾經手動編譯套件過的朋友一定相當清楚,光是少掉編譯的這個動作,就節省超級多的時間。

現在,我們只要先確認好這個機器的 CPU 平台、發行版、釋出版號及位元,再下載 RPM 檔來安裝就可以了。

正所謂「Google 用的好,RPM 輕鬆找」、「朋友打包好,安裝沒煩惱」...... (無誤)


該找男人還是討救兵?!


RPM 能用的參數跟選項實在不少,Manual Page 會是我們的好碰友。
man rpm

幾乎每個指令都會有的 help 說明,當然也別忘了。
rpm --help

若是需要更詳細的指令操作及說明資料,參考資料中的站台連結保證讓你大碗滿意。

接下來,我們就分成查詢、安裝、驗證、升級、降級、移除與異常處理等段落,提供指令範例來實作。


查詢


列出所有已安裝的套件。
rpm -qa

列出這個檔案屬於什麼套件。
rpm -qf /PATH/FILE_NAME

查詢這個套件是否已經安裝到系統裡。
rpm -q PACKAGE_NAME

已安裝的套件

查詢詳細資訊 (Information)。
rpm -qi PACKAGE_NAME

列出安裝後所有建立的目錄及檔案清單 (All Files)。
rpm -ql PACKAGE_NAME

列出全部設定檔 (Configuation Files)。
rpm -qc PACKAGE_NAME

列出所有說明文件 (Documents)。
rpm -qd PACKAGE_NAME

列出相依套件們用到的所有檔案 (Depend Files)。
rpm -qR PACKAGE_NAME

未安裝的 RPM 檔

查詢詳細資訊 (Information)。
rpm -qpi /PATH/FILE_NAME.RPM

列出在安裝後所有建立的目錄及檔案清單 (All Files)。
rpm -qpl /PATH/FILE_NAME.RPM

列出全部設定檔 (Configuation Files)。
rpm -qpc /PATH/FILE_NAME.RPM

列出所有說明文件 (Documents)。
rpm -qpd /PATH/FILE_NAME.RPM

列出相依套件們用到的所有檔案 (Depend Files)。
rpm -qpR /PATH/FILE_NAME.RPM

特殊參數

  • --provides
    查詢套件提供了什麼功能
  • --conflicts
    查詢套件會跟哪些檔案相衝
  • --changelog
    查詢套件的更新紀錄
  • --triggers
    查詢安裝完畢後自動觸發的腳本 (Scripts)

安裝


所有的安裝步驟中,RPM 跟 SRPM 檔案不一定要先下載到本機裡,可以直接輸入 HTTP、HTTPS、FTP 之類的超連結位置來取代。

RPM 格式

安裝並顯示詳細訊息及進度。
sudo rpm -ivh /PATH/FILE_NAME.RPM

安裝並顯示非常非常詳細的除錯專用訊息。
sudo rpm -ivv /PATH/FILE_NAME.RPM

測試安裝並顯示詳細訊息及進度。
sudo rpm -ivh --test /PATH/FILE_NAME.RPM

忽略相依套件們,強迫安裝 RPM 檔。
sudo rpm -ivh --nodeps /PATH/FILE_NAME.RPM


重新安裝一次已安裝好的套件。
sudo rpm -ivh --replacepkgs /PATH/FILE_NAME.RPM

安裝並顯示詳細訊息,以連續的百分比數字呈現進度。
sudo rpm -iv --percent /PATH/FILE_NAME.RPM

特殊參數

  • --replacefiles
    強制覆蓋已存在的檔案們
  • --replacepkgs
    強制覆蓋已存在的套件們
  • --oldpackage
    以舊版套件來取代
  • --force
    等於同時使用 --replacefiles、--replacepkgs、--oldpackage 這三個參數
  • --prefix
    修改預設安裝路徑
  • --nosignature
    不檢查數位簽章

SRPM 格式

這種格式幾乎等同於我們在 套件升級不求人,手動編譯自己來 - 以 OpenSSH 為例 裡提到的 Tarball 原始碼格式,必須自行編譯、打包及安裝。

但是又有些不同,因為 SRPM 檔裡面除了原始碼之外,還針對了不同的發行版、平台、版號預先建立好適當的設定檔,讓我們可以直接使用。

那就直接用原始碼就好啦,何必多此一舉呢?
比方像是我們希望快速的完成套件的安裝,不打算從頭做起,但是又想要在事先做一些小幅度的調整,例如:修改預設安裝路徑、修改部份的程式碼、加入新功能 ...... 之類的動作。

過程也很簡單,先把 SRPM 檔案下載下來,這邊以 screen 為例。
wget http://vault.centos.org/7.2.1511/updates/Source/SPackages/screen-4.1.0-0.23.20120314git3c2946.el7_2.src.rpm

安裝必要的套件。
sudo yum -y install rpm-build

開始產生 RPM 檔,這邊可能會顯示缺少相依套件之類的錯誤訊息,而且可能會顯示很多次。
rpmbuild --rebuild screen-4.1.0-0.23.20120314git3c2946.el7_2.src.rpm

把所有相依套件全部裝起來。
sudo yum -y install ncurses-devel pam-devel autoconf texinfo automake libutempter-devel gc gcc

既然是從頭開始編譯,這邊就請多點耐心,等它全部完成。

沒有任何錯誤訊息,出現「exit 0」就可以了。

編譯過程中,會建立一個叫 rpmbuild 的目錄,編譯完成的 RPM 檔會存在 rpmbuild/RPMS 的子目錄裡。

既然是個 RPM 檔,安裝的方法就依照上一段的參數操作就行了。
sudo rpm -Uvh rpmbuild/RPMS/x86_64/screen-4.1.0-0.23.20120314git3c2946.el7.centos.x86_64.rpm

如果打算編譯、打包及安裝一次完成,那就換個參數再上!
rpmbuild --recompile screen-4.1.0-0.23.20120314git3c2946.el7_2.src.rpm

驗證

驗證系統裡的所有套件是不是有檔案被竄改。
rpm -Va

驗證這個套件是不是有檔案被竄改。
rpm -V PACKAGE_NAME

驗證這個目錄下的檔案是不是曾被竄改 (不含子目錄)。
rpm -Vf /PATH

驗證這個 RPM 檔跟目前系統裡的差異。
rpm -Vp /PATH/FILE_NAME.RPM

怎麼分辨檔案的哪個部份被竄改了呢?依序比對開頭的 9 個字就對了。

  1. S  (File Size)
    檔案的容量大小。
  2. M  (File Mode)
    檔案的類型或存取權限。
  3. 5  (MD5 Checksum)
    檔案的 MD5 驗證碼。
  4. D  (Device Major Number & Minor Number)
    裝置的型態,主編號就像是 /dev 目錄裡的 character 跟 block 型態,次編號則像是 /dev 目錄裡的 sda1、hdc3。
  5. L (Symbolic Link)
    符號連結,也就是捷徑。
  6. U  (File Ownership)
    檔案的擁有者。
  7. G  (File Group)
    檔案的擁有群組。
  8. T  (Modification Time)
    檔案的建立時間。
  9. P  (Ca pabilities)
    能力,這個不太容易解釋,請參閱 H's 手札 - 利用capability特徵加強Linux系統安全

接著,獨立的第 10 個字代表檔案的型態:

  • c (configuration files)
    設定檔
  • d (documentation files)
    說明文件檔
  • g (ghost files)
    不應該存在的不明檔案
  • l (license files)
    授權檔案
  • r (read me)
    讀我檔案


更新、降級


用 RPM 檔升級並顯示詳細訊息及進度,如果已安裝了舊版本就更新,未安裝就開始安裝。
sudo rpm -Uvh /PATH/FILE_NAME.RPM

用 RPM 檔升級並顯示詳細訊息及進度,如果已安裝了舊版本就更新,未安裝就什麼事都不做。
sudo rpm -Fvh /PATH/FILE_NAME.RPM

用 RPM 檔降級並顯示詳細訊息及進度,如果已安裝了舊版本就更新,未安裝就開始安裝。
(F 參數無法用於降級)
sudo rpm -Uvh --oldpackage /PATH/FILE_NAME.RPM


移除


移除套件並顯示詳細訊息及進度。
sudo rpm -evh PACKAGE_NAME

測試移除套件的所有動作,並顯示非常非常詳細的除錯專用訊息。
sudo rpm -evv --test PACKAGE_NAME


異常處理


如果發現套件無法安裝、移除、更新等等的神奇狀況,可能是 RPM 資料庫有問題。

解決方法很簡單,刪除狀態暫存檔,再重建 RPM 資料庫即可。
sudo rm -rf /var/lib/rpm/__db.00*
sudo rpm --rebuilddb


參考資料


圖片來源

  • https://commons.wikimedia.org/wiki/File:RPM_Logo.svg
  • https://pixabay.com/
  • https://imgflip.com/

更新紀錄

  • 2016/09/26 撰文。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

0 意見 :

張貼留言