為何需要升級套件 這真是一個很有趣的課題,為何需要升級套件?通常我們升級的原因主要有三個: 1. 需要新的功能,所以需要安裝新的套件; 2. 舊版本的套件上面可能有安全上的顧慮,所以需要更新到新版的套件; 3. 舊版的套件執行效能不彰,或者執行的能力不能讓管理者滿足。 尤其是第二點,當一個套件有安全上的顧慮時,千萬不要懷疑,趕緊更新套件吧!那幺更新的方法有哪些呢?基本上就是兩種啦: 1. 直接以 binary 的 source code 方法安裝:就是以 Tarball 的方式來安裝; 2. 以已經套件檔案,利用套件管理程式(package manager)如 RPM(Red Hat), apt(Mandrake), pkg(Sun Unix), dpkg(Dabien) 等方式來安裝。 這兩種方法是各有優缺點啦,我們這裡想要來談一談 RPM 與 Tarball 的安裝方式了! 什幺是 RPM 、 SRPM ? RPM 全名是『 RedHat Package Manager 』簡稱則為 RPM 啦!顧名思義,當初這個套件管理的程式是由 Red Hat 這家公司發展出來的,但其實在很多的其他套件也有相類似的套件管理程式。不過由於 RPM 使用上很方便,所以就成了目前最熱門的套件管理程式啦!那幺什幺是 RPM 呢?說的簡單一點, RPM 是以一種資料庫記錄的方式來將你所需要的套件安裝到你的 Linux 主機的一套管理程式。他最大的特點就是將您要安裝的套件先包裝好了,透過包裝好的套件裡頭預設的資料庫記錄,記錄這個套件要安裝的時候必須要的相依屬性模組(就是你的 Linux 主機需要先存在的幾個必須的套件),當安裝在你的 Linux 主機時, RPM 會先依照套件裡頭的紀錄資料查詢 Linux 主機的相依屬性套件是否滿足,若滿足則予以安裝,若不滿足則不予安裝。那幺安裝的時候就將該套件的資訊整個寫入 RPM 的資料庫中,以便未來的查詢、驗證與反安裝! 這樣一來的優點是: 1. 由於已經打包完畢,所以安裝上很方便; 2. 由於套件的資訊都已經記錄在 Linux 主機的資料庫上,很方便查詢、升級與反安裝; 但是這也造成很大的困擾,由於 RPM 程式是已經包裝好的資料,也就是說,裡面的資料已經都『編譯完成』了!所以,安裝的時候一定需要當初安裝時的主機環境才能安裝,也就是說,當初建立這個套件的安裝環境必須也要在你的主機上面出現才行!例如 rp-pppoe 這個 ADSL 撥接套件,他必須要在 ppp 這個套件存在的環境下才能進行安裝!如果你的主機並沒有 ppp 這個套件,那幺很抱歉,除非您先安裝 ppp 否則 rp-pppoe 就是不讓你安裝的(當然您可以強制安裝,但是通常都會有點問題發生就是了!) 這樣可以發現他的缺點是: 1. 安裝的環境必須與打包時的環境需求一致或相當; 2. 需要滿足套件的相依屬性需求; 3. 反安裝時需要特別小心,最底層的套件不可先移除,否則可能造成整個系統的問題! 那怎幺辦?呵呵!還好,還有 SRPM 這個東西! SRPM 是什幺呢?他也是一種 RPM 啦!但是由於裡面連同當初包裝之前的原始碼都在裡頭,所以可以進行重新編譯的動作。通常 SRPM 的附檔名是 ****.src.rpm 這一種檔案格式。由於 SRPM 包含了原始碼,所以在安裝之前則必須重新的編譯建立起包裝的資訊檔案套件才行!當然啰,如果在編譯的過程中發生了問題,也可以藉由裡頭的原始碼更動來修正問題的所在呢! 什幺是 i386, i586, i686, noarch 好啦!現在我們已經知道 RPM 與 SRPM 的格式了,分別為: 這樣子可以很清楚的發現該套件的名稱、版本資訊、打包次數與操作的硬體平台!好了,來談一談每個不同的地方吧: · 套件名稱:當然就是每一個套件的名稱了! · 版本資訊:每一次更新版本就需要有一個版本的資訊,否則如何知道這一版是新是舊? · 釋出版本次數:也就是編譯的次數啦!那麼為何需要重復的編譯呢?這是由於同一版的套件中,可能由於有某些 bug 或者是安全上的顧慮,所以必須要重新設定當初打包時候的設定參數,設定完成之後重新編譯並打包成 RPM 檔案!因此就有不同的打包數出現了! · 操作硬體平台:這是個很好玩的地方,由於 RPM 可以適用在不同的操作平台上,但是由於不同的平台設定的參數還是有所差異性!所以就有所謂的 i386, i586, i686 與 noarch 等的檔案名稱出現了! o i386:幾乎適用於所有的 x86 平台,不論是舊的 pentum 或者是新的 pentum-III 等等,都可以正常的工作!那個 i 指的是 Intel 相容的 CPU 的意思,至於 386 不用說,就是 CPU 的等級啦! o i586, i686:就是比較高階的 CPU 等級! o noarch:就是沒有任何硬體等級上的限制。 需要額外說明的是, i386 的檔案可以在任何的機器上面安裝,不論是 586 或者是 686 的機器,但是 i386 則不一定可以使用於 586 或者是 686 的硬體上面,另外,在 686 的機器上使用 i686 的檔案會比使用 i386 的檔案在執行上,效能可能比較好一些!無論如何,使用 i386 應該就是比較沒有問題的啦!另外,由於不同的 distirbution 會有不同的環境與函式庫,所以在 i386 之後也有可能會額外再加上該套件的簡寫! 好了!接下來我們來談一談安裝的時候所需要使用到的目錄! SRPM 與 RPM 工作時候所需要的安裝目錄 由於 SRPM 還需要經過一個編譯的程序,所以我們就先從 SRPM 的工作情況說起吧!好了,先捉一個檔案回去試試看: rp-pppoe-2.6-5.src.rpm! SRPM 的編譯過程: 剛剛提到 SRPM 裡頭含有的是未經編譯的原始碼,所以我們需要將 SRPM 進行編譯打包的動作!那麼編譯是在哪裡進行呢?由於編譯的時候會將原始碼解壓縮出來,並且將附有的參數控制選項也同時的解開,所以就有一些資料會出現了,那麼這些資料放在哪裡呢?你可以到你的 /usr/src/redhat 裡頭去看一看呦!先執行: rpm -i rp-pppoe-2.6-5.src.rpm 將資料解開到 /usr/src/redhat 當中! · /usr/src/redhat/SPEC:這個目錄當中放置的是該套件的設定檔,例如這個套件的資訊參數、設定項目等等都放置在這裡; · /usr/src/redhat/SOURCE:這個目錄當中放置的是該套件的原始檔(*.tar.gz的檔案)以及 config 這個設定檔; · /usr/src/redhat/BUILD:在編譯的過程中,有些暫存的資料都會放置在這個目錄當中; · /usr/src/redhat/RPMS:經過編譯之後,並且順利的編譯成功之後,將打包完成的檔案放置在這個目錄當中。裡頭有包含了 i386, i586, i686, noarch.... 等等的次目錄。 此外,在編譯的過程當中,可能會發生不明的錯誤,或者是設定的錯誤,這個時候就會在 /tmp 底下產生一個相對應的錯誤檔,您可以根據該錯誤檔進行除錯的工作呢!等到所有的問題都解決之後,也編譯成功了,那麼剛剛解壓縮之後的檔案,就是在 /usr/src/redhat/SPEC, SOURCE, BUILD 等等的檔案都會被殺掉,而只剩下放置在 /usr/src/redhat/RPMS 底下的檔案了! RPM 的安裝過程: RPM 在安裝的時候,會先去讀取 套件 內的設定參數內容,就是剛剛我們在 /usr/src/redhat/SPEC 的相關資訊啦!然後將該資料用來比對 Linux 系統的環境,如果環境相符就予以安裝,如果不符就會顯示出不符合的內容所在!等到安裝完畢之後, rpm 就會將套件的資訊寫入:/var/lib/rpm 這個目錄中去!所以,往後您在進行查詢的時候或者是預計要升級的時候,相關的資訊就會由 /var/lib/rpm 這個目錄的內容資料來提供啰! RPM 的指令使用:安裝、升級與更新、查詢、驗證、反安裝與重建資料庫 RPM 的功能相當的豐富,我們一項一項來說明吧! · 安裝: 從無到有就是安裝啦!那麼安裝的方式為何呢?若是 RPM 則使用 ivh 啦!如果是 SRPM 就使用 rebuild 或是 recompiler 啰! o --rebuild:這個參數會將後面的 SRPM 進行『編譯』與『打包』的動作,但是並沒有安裝,當您使用 --rebuild 的時候,最後通常會發現一行字體: Wrote: /usr/src/redhat/RPMS/i386/rp-pppoe-2.6-5.i386.rpm 這個就是編譯完成的 RPM 檔案啰!那麼這個檔案就可以用來安裝啦!安裝的時候請加絕對路徑來安裝即可! o --recompile:這個動作會直接的『編譯』『打包』並且『安裝』啰! o -ivh:就是用來安裝 RPM 的參數而在這個參數之下,由於會有一些『相依屬性』的問題,或者是曾經安裝過的檔案的問題,所以您可以再加以下的參數來『強制』安裝: § --nodeps:不考慮相依屬性的關系,給他強制的安裝下去; § --replacepkgs:如果這個套件之前安裝過,您想要覆蓋這個套件,那麼不需要反安裝後再安裝,可以直接加上 --replacepkgs 強制覆蓋; § --replacefiles:那麼如果這個套件安裝完畢之後,曾經被你修改過檔案呢?就是安裝過程中會出現『confilcting files 』的話,那麼直接以 --replacefiles 覆蓋掉這種檔案吧! § 升級: 使用 RPM 來升級真是太簡單了!就以 Uvh 來升級即可!但是在比較大量的升級版本中,使用 Fvh 則是比較好的作法。但是需要注意的是,如果您使用的是 Uvh ,偏偏您的機器上尚無這一個套件,那麼很抱歉,該套件並不會被安裝在您的 Linux 主機上面,所以請重新以 ivh 來安裝吧! · 注意的是, Uvh 是僅升級您所寫入的套件,至於 Fvh 則是『僅升級在您的系統裡面存在的套件』,所以有的朋友在大量的進行套件版本修補的時候: o 先到 Red Hat 的 errata 網站上捉下來最新的 i386 檔案;