在 套件升級不求人,手動編譯自己來 - 以 OpenSSH 為例 這篇文章裡,我們為了安裝一個小小的套件,就得從頭到尾、翻來覆去的純手工打造,而且還沒談到更新跟移除之類的動作。
可惜套件並不是個藝術品,完成後就一直用來放著欣賞,而是隨著時間的流逝,反覆不斷的安裝、移除、更新、調整。
本來,要把套件安裝到系統裡,必須經過這麼多的步驟。
- 下載原始碼。
- 閱讀安裝說明。
- 檢查環境組態。
- 進行編譯及打包,開始無盡的等待。
- 安裝相依套件們,開始步驟 1 到步驟 5 的多次循環。
- 安裝主要套件。
002
所以,在 RPM 這個套件格式和管理工具出現之後,大幅的改變了套件管理的生態。
- 下載 RPM 檔。
- 安裝相依套件們,開始步驟 1 到步驟 2 的多次循環。
- 安裝主要套件
現在,我們只要先確認好這個機器的 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 -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 個字就對了。
- S (File Size)
檔案的容量大小。 - M (File Mode)
檔案的類型或存取權限。 - 5 (MD5 Checksum)
檔案的 MD5 驗證碼。 - D (Device Major Number & Minor Number)
裝置的型態,主編號就像是 /dev 目錄裡的 character 跟 block 型態,次編號則像是 /dev 目錄裡的 sda1、hdc3。 - L (Symbolic Link)
符號連結,也就是捷徑。 - U (File Ownership)
檔案的擁有者。 - G (File Group)
檔案的擁有群組。 - T (Modification Time)
檔案的建立時間。 - 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
參考資料
- rpm.org - Maximum RPM
- Fedora Project - Fedora RPM Guide
- Tecmint - 20 Practical Examples of RPM Commands in Linux
- 鳥哥的 Linux 私房菜 - 第二十二章、軟體安裝 RPM, SRPM 與 YUM
圖片來源
- https://commons.wikimedia.org/wiki/File:RPM_Logo.svg
- https://pixabay.com/
- https://imgflip.com/
更新紀錄
- 2016/09/26 撰文。
0 意見 :
張貼留言