RPM 套件管理


基本操作

在 RedHat Linux 底下, 管理套件 (查詢/新增/刪除/升級) 的工作, 使用的是 rpm 指令. 這是由 RedHat 公司發展出來的, 但他們以 GPL 公開, 所以有很多其他版本的 Linux 也都採用 rpm 來管理系統套件, 例如 Mandrake, OpenLinux, TurboLinux, ... 等等. 即使是「非 rpm 系統」版本的 Linux 當中, 也很可能提供工具可以把包裝成 rpm 的套件直接拿來安裝, 或轉換成該系統的套件格式再安裝. 例如在 slackware 當中就提供了 rpm2targz 命令, 轉換成 slackware 認得的 .tar.gz 檔. 而 網路上豐富的 rpm 檔案庫 也就成了許多不同版本的 Linux 都可以共同運用的資源.

最常用的功能:

  1. 把 rosegarden-2.1-1.i386.rpm 這個套件檔安裝入系統 (若原已有安裝舊版的 rosegarden, 則升級): rpm -U rosegarden-2.1-1.i386.rpm
  2. 移除 rosegarden 這個套件: rpm -e rosegarden
  3. 查詢系統內已安裝了那些套件: rpm -qa | less
  4. 查詢 (已安裝在系統內的) rosegarden 套件是做什麼用的, 以及它包含了那些檔案: rpm -qil rosegarden 又, 用 rpm -qd rosegarden 可以找到這個套件內所附的說明文件.
  5. 查詢 (尚未安裝入系統的) rosegarden-2.1-1.i386.rpm 這個 rpm 檔是做什麼用的, 以及它包含了那些檔案: rpm -qpil rosegarden-2.1-1.i386.rpm
  6. 查詢 /usr/X11R6/bin/rosegarden 這個檔案來自那一個套件: rpm -qf /usr/X11R6/bin/rosegarden

製作索引檔, 方便日後查詢

每次我一取得新版的 Mandriva DVD, 就先製作一個「索引檔」:

        cd /mnt/cdrom/media/main/
        rpm -qpil *.rpm > ~/rpmindex.txt

並將完成的 rpmindex 壓縮起來: gzip ~/rpmindex.txt 從此以後隨時可以用 zless ~/rpmindex.txt.gz 或 gunzip < ~/rpmindex.txt.gz | less 查看這個索引檔, 並使用 regular expression 找尋你需要的檔案或套件. 例如有時安裝一個套件時, 系統抱怨這個套件需要用到某個檔案, 但並未說明那個 (尚未安裝的) 套件內可以找到這個檔案, 我們就可以從這裡著手. 閒來無聊時, 也可以進這個索引檔看看你的 DVD 上有那些套件, 或許你會同意我的結論: Linux 上缺乏的不是應用程式, 而是懂得善用既有資源的使用者 -- 連自己手邊的 DVD 上都還有太多我們不知道要使用的應用程式了, 更不用說網路上還有多少待發掘的資源.

進階查詢

用 -qi 查詢時, 每個套件的資訊都佔好幾列, 比較難再用其他程式加以處理. 如果希望 rpm 命令只印出我們有興趣的資訊 (例如套件名稱及佔用空間), 則可用 --queryformat 如下例:

  1. 想找出沒有用又佔空間的套件 (要清除掉): rpm -qa --queryformat '%9{SIZE} %-15{NAME} %1{SUMMARY}\n' | sort -n
  2. cd 上有那些好玩的遊戲? rpm -qp --queryformat '%9{SIZE} %-15{NAME} %1{GROUP}\n' *.rpm | egrep -i 'game|toy' | sort -n

用 rpm --querytags 可以列出所有可用的 tags (即 NAME SIZE GROUP 等具有特殊意義的標籤), 雖然線上手冊沒有一一解釋每個 tag 的意義, 但是往往從它們的名字很容易就可以猜出來.

解決相依問題

有時候要安裝 A 套件的時候, 系統告訴你需要先安裝 B 套件; 而 B 套件又需要用到 C 套件...。 Mandriva 底下有一個指令 urpmi 可以一口氣自動幫你找出所有必須預先安裝的套件。 如果設定檔 /etc/urpmi/urpmi.cfg 壞掉了, 可以到 這裡 回答問題, 自動產生修復的指令。

Fedora 則可以用 yum。

Fedora 的 rpm 可以裝到 Mandriva 上嗎?

想把 Fedora 的 rpm A 套件裝到 Mandriva 上面, 經常會遇到的是上述相依 (dependency) 問題, 特別是可能出現 "找不到某某 .so 檔" (動態聯結程式庫, shared objects) 之類的錯誤訊息。 如果 urpmi 無法自動幫你解決相依問題, 可能就需要上網找。 到 rpmfind 搜尋欠缺的 .so, 看它在那個套件裡面。 注意要抓適合 Mandriva 的版本。

如果還是有某些 .so 找不到, 或找到了, 卻無法安裝在 Mandriva 上面, 還可以試一個偷吃步。 首先還是必須安裝欠缺 .so 的舊版 (或新版), 然後試圖矇混過關:

  1. 安裝 A 時, 叫系統不要理會相依問題: rpm -U --nodeps ... 強迫安裝.
  2. 但它明明就是會用到啊, 所以到 /usr/lib 下, 建立 symbolic link 欺騙系統: ln -s 某某.so.現有版 某某.so.需要版

不是很好的方法, 偶爾會成功就是了...

.deb 套件可以裝到 rpm 系統上嗎?

alien 可以將 .deb 與 .rpm 檔案互相轉換; 不過一樣可能遭遇相依性問題...

網路資源

rpm 機制受到大家的歡迎, 所以網路上開始有很多「rpm 檔案庫」. 其中 rpmfind 及其映射站臺 有相當方便的索引系統; 而 中研院 (如果你用的不是 libc6/IA32 系統, 請見各目錄的上層目錄.) 等處也有未加索引的 rpm 套件.

包裝 rpm 檔

不會寫程式的人也可以對社群有所貢獻 -- 例如幫忙把比較少人知道, 在 rpmfind 上面找不到的程式拿來編譯/包裝成容易安裝的 rpm 檔, 方便不會/懶得編譯程式的人下載. 我在這裡提供一些 範例; 以後如果有機會再詳加說明. 但請注意: 我習慣用普通使用者的身分 (避免用 root) 做事, 連包 rpm 時也是. 所以我在家目錄中放一個 .rpmmacros 檔, 指定包裝 rpm 時使用的工作目錄, 並在 *.spec 當中指定安裝時假裝根目錄也在這個工作目錄下某處. 這些目錄都要 (以普通使用者的身分) 事先建立好:

        /var/tmp/rpm/SOURCES
                     BUILD
                     INSTALL
                     RPMS

當然你也可以放在其他目錄, 只要記得修改 .rpmmacros 及 *.spec 當中的 BuildRoot 就可以了. 一切設定好之後, 就下: rpm -bb xxx.spec 並根據最後出現的錯誤訊息來修改你的設定.

remind 是很標準的 source, 它的 spec 最簡單; geomview 也不困難, 並示範 %docdir 的用法; openvrml 是「一個 spec, 多個 rpm」的範例; billnet 比較麻煩.

Creating Custom RPMs

參考資料