[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

Yum 與 RPM 的技巧

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 插件的套件名稱會有所不同(見下文)。

如果你要檢閱套件的細節,請執行以下 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 -qdf /path/to/file

6. 套件來源

有時你或許會想知道你從那裡穫得某些套件,或者你的系統上有多少套件來自一個特定的軟件庫或供應者。有數個未收錄在 rpm 使用手冊內的搜尋選項可以幫到你。雖然它們不是百份百完全,卻肯定對你有幫助。大多數的軟件庫都會在 Release 字串中以一個識別碼來標籤他們的套件。舉個例說,rpmforge就使用 rf 作為他們的識別碼。你可以下面這個指令來檢查你是否安裝了他們的軟件

rpm -qa release="*rf*"

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 金鑰來簽署,因為這個做法沒有已知的問題。

ArtWork/WikiDesign/icon-admonition-attention.png

警告:如果你用 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


2023-09-11 07:23