Yum 與 RPM 的技巧
Contents
yum 與 rpm 是優秀的套件管理工具,但它們擁有些比較罕為人知的選項,可容許你做一些很有趣的事情。你大概不會時常使用這些選項,但當有需要時,它們可以大派用處。
1. 令 rpm 顯示架構
這是一個較簡單的提示,而且對使用 x86_64 系統的人們特別有用。只消 ~/.rpmmacros 內的一行便能避免日後一大堆的麻煩。
echo "%_query_all_fmt %%{name}-%%{version}-%%{release}.%%{arch}" >> ~/.rpmmacros
2. 查詢不是來自 CentOS 的套件
你想查詢那些套件是利用第三方軟件庫安裝,而不是來自 CentOS 的嗎?
rpm -qa --qf '%{NAME} %{VENDOR}\n' | grep -v CentOS
3. 重設檔案權限
你竟然將某個套件的檔案權限完全搞亂了嗎?沒有問題,因為 rpm 能夠為你還原。
rpm --setperms <packagename>
4. 查閱修改日誌
由於 CentOS 及上游供應商將安全性修正返向移植,當要找尋 CVE 修正時,版本號碼很多時會誤導。查閱套件的修改日誌是找出修正是否已被實施的一個好方法。
4.1. 透過 RPM
rpm -q --changelog <packagename> | less
使用 less 並非必然的,但某些套件(例如內核)的修改日誌可以是頗長篇的。使用 less 會方便閱讀。
你也可顯示未安裝的 RPM 的修改日誌,例如手動下載或以 URL 為路徑的 RPM。
rpm -q --changelog -p /home/my_user/somepackage.rpm | less rpm -q --changelog -p http://mirror.centos.org/centos/6/os/x86_64/Packages/qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm | less
4.2. 透過 YUM 的 Changelog 插件
RPM 十分強勁,但 YUM 也有它的優勢。 尤其當 YUM 配合 Changelog 插件時,你在安裝或更新套件_之先_便不須在本地下載套件或透過 URL 路徑檢視修改日誌。
視乎所安裝的 CentOS 版本,YUM Changelog 插件的套件名稱會有所不同(見下文)。
CentOS 5 的套件名為 yum-changelog
CentOS 6 的套件名為 yum-plugin-changelog
CentOS 7 的套件名為 yum-plugin-changelog
如果你要檢閱套件的細節,請執行以下 yum 指令。 此 YUM 插件已收錄在 CentOS Base 軟件庫,但預設是不被安裝的(就 CentOS 6 的安裝而言)。
yum info yum-plugin-changelog
你可用慣常安裝套件的方法來安裝 YUM Changelog 插件。
yum install yum-plugin-changelog
以下範例列印 tzdata 套件的最尾(最近)一則修改日誌。 那些仍未安裝的更新的修改日誌都放在 Available Packages 部份,而不是 Installed Packages 部份。
yum changelog 1 tzdata | less
5. 文檔在那裡?
要快捷地列出一個套件的相關文檔,你可以使用下列兩個選項:
rpm -qd <packagename>
- 這樣做會為你列出收錄在 rpm 內的文檔,或者你只有一個檔案名稱的話,你可以:
rpm -qdf /path/to/file
- 這樣 rpm 會為你列出擁有這個檔案的套件內的文檔。
6. 套件來源
有時你或許會想知道你從那裡穫得某些套件,或者你的系統上有多少套件來自一個特定的軟件庫或供應者。有數個未收錄在 rpm 使用手冊內的搜尋選項可以幫到你。雖然它們不是百份百完全,卻肯定對你有幫助。大多數的軟件庫都會在 Release 字串中以一個識別碼來標籤他們的套件。舉個例說,rpmforge就使用 rf 作為他們的識別碼。你可以下面這個指令來檢查你是否安裝了他們的軟件
rpm -qa release="*rf*"
或者如果你想知道你安裝了多少個由 JohnnyHughes 建立的套件,你可以用
rpm -qa packager="Johnny*"
這個技巧適用於大部份 rpm -qi <套件名稱> 顯示的類別上
另一個方法就是用 EPEL 軟件庫所提供的 keychecker 套件,它會按照簽署用的 GPG 金鑰列出套件。
7. 只取出一個檔案
如果你只需要從某個 rpm 取出一個檔案,而不想重裝整個套件,你可以應用 rpm2cpio。舉個例說,要將設定檔從 logrotate rpm 裡取出來,你會運用下列指令:
rpm2cpio logrotate-1.0-1.i386.rpm |cpio -ivd etc/logrotate.conf
8. 查詢套件的安裝次序及日期
這個技巧在升級後用來找尋未被升級的套件時會有用。
rpm -qa --last >~/RPMS_by_Install_Date
請利用 less 來檢視輸出的底部,好讓你能找到那些擁有較早安裝日期的 rpm。你亦可以用 grep 去搜尋特定套件及檢視它們何時安裝。
9. 查詢軟件庫所提供的套件
搜尋某個特定軟件庫所提供的所有套件,例如 RPMforge。這個方法並不會將已經從那個軟件庫安裝的套件顯示出來。
yum --disablerepo "*" --enablerepo "rpmforge" list available
10. 在 yum 軟件庫裡搜尋一個字串
搜尋在名稱或描述中包含某個字串的套件。
yum search buildrpmtree | less
11. 在命令行中啟用或者停用一個軟件庫
僅針對 CentOS 6 —— 對 CentOS 5 無效。
yum-config-manager --enable c6-media
yum-config-manager --disable c6-media
12. 令 yum 應用代理伺服器
要令 yum 應用代理伺服器,你首先要 /etc/yum.conf 內加入下列參數:
proxy=http://yourproxy:8080/
當中 yourproxy 是你想存取的代理伺服器的名稱,而 8080 是代理連接埠。假如伺服器需要驗證,你可以這樣指定登入憑證:
proxy=http://username:password@yourproxy:8080/
rpm 套件管理員則利用代理環境變數。它們可以在 /etc/profile 裡為全系統設定,或在 ~/.bash_profile 裡為個別用戶設定:
export http_proxy=http://yourproxy:8080/ export ftp_proxy=http://yourproxy:8080/
要令 wget 應用代理伺服器,請在 /etc/wgetrc 加入下列內容:
http_proxy = http://yourproxy:8080/ ftp_proxy = http://yourproxy:8080/
在這兩個例子裡,登入資料同樣可以像上面範例般設定。
13. 用 yum 去安裝本地套件,並自動地檢查/滿足依賴性
yum --nogpgcheck localinstall packagename.arch.rpm
14. 設置以你的身份、而不是 root 來重建套件
有時你就是有必要重建某個套件 —— 可能只因為要應用一些在官方套件中未被選用的設定項目。又或者由於你發現了一些很好的軟件,但在軟件庫內實在無沒找到它,而網站只提供其它發行本的 rpm。因此你要把 src.rpm 弄來並親自重建它。但你真的不想以 root 的身份個這個步驟。所以下面就是在你的主目錄 —— 利用你的戶口 —— 重建套件的方法。
14.1. 方法一
首先我們設定好你要用來工作的目錄。留意它與 /usr/src/rehdat 的目錄架構是何等驚人地相似:
[testuser@hostname ~]$ cd [testuser@hostname ~]$ mkdir -p rpmbuild/{BUILD,RPMS,SPECS,SOURCES,SRPMS} [testuser@hostname ~]$ ls rpmbuild/ BUILD RPMS SOURCES SPECS SRPMS [testuser@hostname ~]$
接著我們改動一些 rpm 巨集,好讓 rpmbuild 知道關於你及你想在那裡建立套件:
[testuser@hostname ~]$ echo "%_topdir /home/testuser/rpmbuild" >> ~/.rpmmacros [testuser@hostname ~]$ echo "%packager Test User <testuser@example.com>" >> ~/.rpmmacros [testuser@hostname ~]$ cat ~/.rpmmacros %_topdir /home/testuser/rpmbuild %packager Test User <testuser@example.com> [testuser@hostname ~]$
這樣就是了。下次你執行 rpmbuild --rebuild foo.src.rpm 的時候,你的製成品將會被放在 ~/rpmbuild/RPMS/i386 裡(或者你剛建立的套件的架構)。簡單,是不是?
14.2. 方法二
針對 CentOS-4,設定軟件庫頁面裡的 kbs-Extras 軟件庫(亦可加上 kbs-Misc),然後利用 "sudo" 或 "su -" 以 root 的身份執行 "yum install fedora-rpmdevtools"。接著以建立者的身份(你可能會想用一個特別的戶口來避免問題發生在你的正常主目錄裡)執行 "fedora-buildrpmtree",這樣一個 ~/rpmbuild/…… 目錄樹及一個 ~/.rpmmacros 檔便會自動地被建立起來。
針對 CentOS-5 —— rpmdevtools 這個套件已經收錄在軟件庫頁面裡的 EPEL 軟件庫內。
若果要令某些套件取得正確的名稱,你需要加入下列巨集(請按需要以合適的發行版本取代 "el4"):
[testuser@hostname ~]$ echo "%dist .el4" >> .rpmmacros
15. 顯示所有軟件庫的優先次序
你可以用 yum repolist all 來列出你系統上的所有軟件庫。然而,這樣做並不會顯示優先次序。下面是一個能夠這樣做的單行腳本。如果優先次序未被設定,它會被預設為最低值(99)。
sed -n -e "/^\[/h; /priority *=/{ G; s/\n/ /; s/ity=/ity = /; p }" /etc/yum.repos.d/*.repo | sort -k3n
16. 顯示所有已安裝的 GPG 金鑰
多謝論壇裡的 babo 用戶提供這個單行腳本來顯示所有 GPG 金鑰與及相關軟件庫的資訊。
rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n'
17. 簽署套件
如果你想簽署套件讓別人能驗証該它真是由你所建立的,透過 rpm 你可以輕易地做到。我們不把文檔收錄在這裡,但 Fedora RPM 包裝指引內有一章(雖然是草稿)討論這個主題。
你留心數個警告:
在 CentOS 4 及 CentOS 5 下你最好用 DSA 金鑰來簽署,因為這個做法沒有已知的問題。
|
警告:如果你用 RSA 金鑰來簽署,gpg 預設會採用第 4 版的簽名。CentOS 4 及 5 沒法檢查這類簽名。你可強迫 rpm(或 gpg)改用第 3 版的簽名。有關如何在你的 ~/.rpmmacros 內放入一個巨集做這件事情,請參閱這則 Bugzilla 記錄。請閱讀整個討論來理解這個問題 |
18. Yum 群組
你可以這樣列出 yum 群組:
yum grouplist
若要列出更多(隱藏)的群組連同識別碼,請用:
yum grouplist hidden ids
若要透過識別碼安裝一個群組(例如 X Window System (x11) 群組):
yum groupinstall x11
Translation of revision 35