雖然使用原始碼進行軟體編譯可以具有客製化的設定,但對於 Linux distribution 的發佈商來說,則有軟體管理不易的問題, 畢竟不是每個人都會進行原始碼編譯的。如果能夠將軟體預先在相同的硬體與作業系統上面編譯好才發佈的話, 不就能夠讓相同的 distribution 具有完全一致的軟體版本嗎?如果再加上簡易的安裝/移除/管理等機制的話, 對於軟體控管就會簡易的多。有這種東西嗎?有的,那就是 RPM 與 YUM 這兩個好用的咚咚。 既然這麼好用,我們當然不能錯過學習機會囉!趕緊來參詳參詳!
在前一章我們提到以原始碼的方式來安裝軟體,也就是利用廠商釋出的 Tarball 來進行軟體的安裝。不過,你應該很容易發現,那就是每次安裝軟體都需要偵測作業系統與環境、設定編譯參數、實際的編譯、 最後還要依據個人喜好的方式來安裝軟體到定位。這過程是真的很麻煩的,而且對於不熟整個系統的朋友來說,還真是累人啊!
那有沒有想過,如果我的 Linux 系統與廠商的系統一模一樣,那麼在廠商的系統上面編譯出來的執行檔, 自然也就可以在我的系統上面跑囉!也就是說, 廠商先在他們的系統上面編譯好了我們使用者所需要的軟體, 然後將這個編譯好的可執行的軟體直接釋出給使用者來安裝 ,如此一來,由於我們本來就使用廠商的 Linux distribution ,所以當然系統 (硬體與作業系統) 是一樣的,那麼使用廠商提供的編譯過的可執行檔就沒有問題啦! 說的比較白話一些,那就是利用類似 Windows 的安裝方式,由程式開發者直接在已知的系統上面編譯好,再將該程式直接給使用者來安裝,如此而已。
那麼如果在安裝的時候還可以加上一些與這些程式相關的資訊,將他建立成為資料庫,那不就可以進行安裝、反安裝、 升級與驗證等等的相關功能囉 (類似 Windows 底下的『新增移除程式』)?確實如此,在 Linux 上面至少就有兩種常見的這方面的軟體管理員,分別是 RPM 與 Debian 的 dpkg 。我們的 CentOS 主要是以 RPM 為主,但也不能不知道 dpkg 啦!所以底下就來約略介紹一下這兩個玩意兒。
由於自由軟體的蓬勃發展,加上大型 Unix-Like 主機的強大效能,讓很多軟體開發者將他們的軟體使用 Tarball 來釋出。 後來 Linux 發展起來後,由一些企業或社群將這些軟體收集起來製作成為 distributions 以發佈這好用的 Linux 作業系統。但後來發現到,這些 distribution 的軟體管理實在傷腦筋, 如果軟體有漏洞時,又該如何修補呢?使用 tarball 的方式來管理嗎?又常常不曉得到底我們安裝過了哪些程式? 因此,一些社群與企業就開始思考 Linux 的軟體管理方式。
如同剛剛談過的方式,Linux 開發商先在固定的硬體平台與作業系統平台上面將需要安裝或升級的軟體編譯好, 然後將這個軟體的所有相關檔案打包成為一個特殊格式的檔案,在這個軟體檔案內還包含了預先偵測系統與相依軟體的腳本, 並提供記載該軟體提供的所有檔案資訊等。最終將這個軟體檔案釋出。 用戶端取得這個檔案後,只要透過特定的指令來安裝, 那麼該軟體檔案就會依照內部的腳本來偵測相依的前驅軟體是否存在,若安裝的環境符合需求,那就會開始安裝 , 安裝完成後還會將該軟體的資訊寫入軟體管理機制中,以達成未來可以進行升級、移除等動作呢。
目前在 Linux 界軟體安裝方式最常見的有兩種,分別是:
如前所述,不論 dpkg/rpm 這些機制或多或少都會有軟體屬性相依的問題,那該如何解決呢? 其實前面不是談到過每個軟體檔案都有提供相依屬性的檢查嗎?那麼如果我們將相依屬性的資料做成列表, 等到實際軟體安裝時,若發生有相依屬性的軟體狀況時,例如安裝 A 需要先安裝 B 與 C ,而安裝 B 則需要安裝 D 與 E 時,那麼當你要安裝 A ,透過相依屬性列表,管理機制自動去取得 B, C, D, E 來同時安裝, 不就解決了屬性相依的問題嗎?
沒錯!您真聰明!目前新的 Linux 開發商都有提供這樣的『線上升級』機制,透過這個機制, 原版光碟就只有第一次安裝時需要用到而已,其他時候只要有網路,你就能夠取得原本開發商所提供的任何軟體了呢! 在 dpkg 管理機制上就開發出 APT 的線上升級機制,RPM 則依開發商的不同,有 Red Hat 系統的 yum , SuSE 系統的 Yast Online Update (YOU) 等。
distribution 代表軟體管理機制使用指令線上升級機制(指令) Red Hat/FedoraRPMrpm, rpmbuildYUM (yum) Debian/UbuntuDPKGdpkgAPT (apt-get)我們這裡使用的是 CentOS 系統嘛!所以說: 使用的軟體管理機制為 RPM 機制,而用來作為線上升級的方式則為 yum !底下就讓我們來談談 RPM 與 YUM 的相關說明吧!
RPM 全名是『 RedHat Package Manager 』簡稱則為 RPM 啦!顧名思義,當初這個軟體管理的機制是由 Red Hat 這家公司發展出來的。 RPM 是以一種資料庫記錄的方式來將你所需要的軟體安裝到你的 Linux 系統的一套管理機制。
他最大的特點就是將你要安裝的軟體先編譯過, 並且打包成為 RPM 機制的包裝檔案,透過包裝好的軟體裡頭預設的資料庫記錄, 記錄這個軟體要安裝的時候必須具備的相依屬性軟體,當安裝在你的 Linux 主機時, RPM 會先依照軟體裡頭的資料查詢 Linux 主機的相依屬性軟體是否滿足, 若滿足則予以安裝,若不滿足則不予安裝。那麼安裝的時候就將該軟體的資訊整個寫入 RPM 的資料庫中,以便未來的查詢、驗證與反安裝!這樣一來的優點是:
但是這也造成些許的困擾。由於 RPM 檔案是已經包裝好的資料,也就是說, 裡面的資料已經都『編譯完成』了!所以, 該軟體檔案幾乎只能安裝在原本預設的硬體與作業系統版本中。 也就是說,你的主機系統環境必須要與當初建立這個軟體檔案的主機環境相同才行! 舉例來說,rp-pppoe 這個 ADSL 撥接軟體,他必須要在 ppp 這個軟體存在的環境下才能進行安裝!如果你的主機並沒有 ppp 這個軟體,那麼很抱歉,除非你先安裝 ppp 否則 rp-pppoe 就是不讓你安裝的 (當然你可以強制安裝,但是通常都會有點問題發生就是了!)。
所以, 通常不同的 distribution 所釋出的 RPM 檔案,並不能用在其他的 distributions 上 。舉例來說,Red Hat 釋出的 RPM 檔案,通常無法直接在 SuSE 上面進行安裝的。更有甚者,相同 distribution 的不同版本之間也無法互通,例如 CentOS 6.x 的 RPM 檔案就無法直接套用在 CentOS 7.x !因此,這樣可以發現這些軟體管理機制的問題是:
那怎麼辦?如果我真的想要安裝其他 distributions 提供的好用的 RPM 軟體檔案時? 呵呵!還好,還有 SRPM 這個東西! SRPM 是什麼呢?顧名思義,他是 Source RPM 的意思,也就是這個 RPM 檔案裡面含有原始碼哩 !特別注意的是,這個 SRPM 所提供的軟體內容『並沒有經過編譯』 , 它提供的是原始碼喔!
通常 SRPM 的副檔名是以 ***.src.rpm 這種格式來命名的 。不過,既然 SRPM 提供的是原始碼,那麼為什麼我們不使用 Tarball 直接來安裝就好了?這是因為 SRPM 雖然內容是原始碼, 但是他仍然含有該軟體所需要的相依性軟體說明、以及所有 RPM 檔案所提供的資料。同時,他與 RPM 不同的是,他也提供了參數設定檔 (就是 configure 與 makefile)。所以,如果我們下載的是 SRPM ,那麼要安裝該軟體時,你就必須要:
怪了,怎麼 SRPM 這麼麻煩吶!還要重新編譯一次,那麼我們直接使用 RPM 來安裝不就好了?通常一個軟體在釋出的時候,都會同時釋出該軟體的 RPM 與 SRPM 。我們現在知道 RPM 檔案必須要在相同的 Linux 環境下才能夠安裝,而 SRPM 既然是原始碼的格式,自然 我們就可以透過修改 SRPM 內的參數設定檔,然後重新編譯產生能適合我們 Linux 環境的 RPM 檔案 ,如此一來,不就可以將該軟體安裝到我們的系統當中,而不必與原作者打包的 Linux 環境相同了?這就是 SRPM 的用處了!
檔案格式檔名格式直接安裝與否內含程式類型可否修改參數並編譯 RPMxxx.rpm可已編譯不可 SRPMxxx.src.rpm不可未編譯之原始碼可除了後面適合的硬體平台與副檔名外,主要是以『-』來隔開各個部分,這樣子可以很清楚的發現該軟體的名稱、 版本資訊、打包次數與操作的硬體平台!好了,來談一談每個不同的地方吧:
根據上面的說明,其實我們只要選擇 i686 版本來安裝在你的 x86 硬體上面就肯定沒問題。但是如果強調效能的話, 還是選擇搭配你的硬體的 RPM 檔案吧!畢竟該軟體才有針對你的 CPU 硬體平台進行過參數最佳化的編譯嘛!
為什麼 RPM 在使用上很方便呢?我們前面提過, RPM 這個軟體管理員所處理的軟體,是由軟體提供者在特定的 Linux 作業平台上面將該軟體編譯完成並且打包好。那使用者只要拿到這個打包好的軟體, 然後將裡頭的檔案放置到應該要擺放的目錄,不就完成安裝囉?對啦!就是這樣!
但是有沒有想過,我們在前一章裡面提過的,有些軟體是有相關性的,例如要安裝網路卡驅動程式,就得要有 kernel source 與 gcc 及 make 等軟體。那麼我們的 RPM 軟體是否一定可以安裝完成呢?如果該軟體安裝之後,卻找不到他相關的前驅軟體, 那不是挺麻煩的嗎?因為安裝好的軟體也無法使用啊!
為了解決這種具有相關性的軟體之間的問題 (就是所謂的軟體相依屬性),RPM 就在提供打包的軟體時,同時加入一些訊息登錄的功能,這些訊息包括軟體的版本、 打包軟體者、相依屬性的其他軟體、本軟體的功能說明、本軟體的所有檔案記錄等等,然後在 Linux 系統上面亦建立一個 RPM 軟體資料庫,如此一來,當你要安裝某個以 RPM 型態提供的軟體時,在安裝的過程中, RPM 會去檢驗一下資料庫裡面是否已經存在相關的軟體了, 如果資料庫顯示不存在,那麼這個 RPM 檔案『預設』就不能安裝。呵呵!沒有錯,這個就是 RPM 類型的檔案最為人所詬病的『 軟體的屬性相依 』問題啦!
為了重複利用既有的軟體功能,因此很多軟體都會以函式庫的方式釋出部分功能,以方便其他軟體的呼叫應用, 例如 PAM 模組的驗證功能。此外,為了節省使用者的資料量,目前的 distributions 在釋出軟體時, 都會將軟體的內容分為一般使用與開發使用 (development) 兩大類。所以你才會常常看到有類似 pam-x.x.rpm 與 pam-devel-x.x.rpm 之類的檔名啊!而預設情況下,大部分的 software-devel-x.x.rpm 都不會安裝,因為終端用戶大部分不會去開發軟體嘛!
因為有上述的現象,因此 RPM 軟體檔案就會有所謂的屬性相依的問題產生 (其實所有的軟體管理幾乎都有這方面的情況存在)。 那有沒有辦法解決啊?前面不是談到 RPM 軟體檔案內部會記錄相依屬性的資料嗎?那想一想,要是我將這些相依屬性的軟體先列表, 在有要安裝軟體需求的時候,先到這個列表去找,同時與系統內已安裝的軟體相比較,沒安裝到的相依軟體就一口氣同時安裝起來, 那不就解決了相依屬性的問題了嗎?有沒有這種機制啊?有啊!那就是 YUM 機制的由來!
CentOS (1)先將釋出的軟體放置到 YUM 伺服器內,然後(2)分析這些軟體的相依屬性問題,將軟體內的記錄資訊寫下來 (header)。 然後再將這些資訊分析後記錄成軟體相關性的清單列表。這些列表資料與軟體所在的本機或網路位置可以稱呼為容器或軟體倉庫或軟體庫 (repository)。 當用戶端有軟體安裝的需求時,用戶端主機會主動的向網路上面的 yum 伺服器的軟體庫網址下載清單列表, 然後透過清單列表的資料與本機 RPM 資料庫已存在的軟體資料相比較,就能夠一口氣安裝所有需要的具有相依屬性的軟體了。 整個流程可以簡單的如下圖說明:
當用戶端有升級、安裝的需求時, yum 會向軟體庫要求清單的更新,等到清單更新到本機的 /var/cache/yum 裡面後, 等一下更新時就會用這個本機清單與本機的 RPM 資料庫進行比較,這樣就知道該下載什麼軟體。接下來 yum 會跑到軟體庫伺服器 (yum server) 下載所需要的軟體 (因為有記錄軟體所在的網址),然後再透過 RPM 的機制開始安裝軟體啦!這就是整個流程! 談到最後,還是需要動到 RPM 的啦!所以下個小節就讓我們來談談 RPM 這咚咚吧!
RPM 的使用其實不難,只要使用 rpm 這個指令即可!鳥哥最喜歡的就是 rpm 指令的查詢功能了,可以讓我很輕易的就知道某個系統有沒有安裝鳥哥要的軟體呢!此外, 我們最好還是得要知道一下,到底 RPM 類型的檔案他們是將軟體的相關檔案放置在哪裡呢?還有,我們說的那個 RPM 的資料庫又是放置在哪裡呢?
一般來說,RPM 類型的檔案在安裝的時候,會先去讀取檔案內記載的設定參數內容,然後將該資料用來比對 Linux 系統的環境,以找出是否有屬性相依的軟體尚未安裝的問題。例如 Openssh 這個連線軟體需要透過 Openssl 這個加密軟體的幫忙,所以得先安裝 openssl 才能裝 openssh 的意思。那你的環境如果沒有 openssl , 你就無法安裝 openssh 的意思啦。
若環境檢查合格了,那麼 RPM 檔案就開始被安裝到你的 Linux 系統上。安裝完畢後,該軟體相關的資訊就會被寫入 /var/lib/rpm/ 目錄下的資料庫檔案中了。 上面這個目錄內的資料很重要喔!因為未來如果我們有任何軟體升級的需求,版本之間的比較就是來自於這個資料庫, 而如果你想要查詢系統已經安裝的軟體,也是從這裡查詢的!同時,目前的 RPM 也提供數位簽章資訊, 這些數位簽章也是在這個目錄內記錄的呢!所以說,這個目錄得要注意不要被刪除了啊!
那麼軟體內的檔案到底是放置到哪裡去啊?當然與檔案系統有關對吧!我們在 第五章的目錄配置 談過每個目錄的意義, 這裡再次的強調囉:
一些設定檔放置的目錄,例如 /etc/crontab /usr/bin 一些可執行檔案 /usr/lib 一些程式使用的動態函式庫 /usr/share/doc 一些基本的軟體使用手冊與說明檔 /usr/share/man 一些 man page 檔案好了,底下我們就來針對每個 RPM 的相關指令來進行說明囉!
因為安裝軟體是 root 的工作,因此你得要是 root 的身份才能夠操作 rpm 這指令的。 用 rpm 來安裝很簡單啦!假設我要安裝一個檔名為 rp-pppoe-3.11-5.el7.x86_64.rpm 的檔案,那麼我可以這樣:(假設原版光碟已經放在 /mnt 底下了)
[root@study ~]# rpm -i /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm不過,這樣的參數其實無法顯示安裝的進度,所以,通常我們會這樣下達安裝指令:
[root@study ~]# rpm -ivh package_name 選項與參數: -i :install 的意思 -v :察看更細部的安裝資訊畫面 -h :以安裝資訊列顯示安裝進度 範例一:安裝原版光碟上的 rp-pppoe 軟體 [root@study ~]# rpm -ivh /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:rp-pppoe-3.11-5.el7 ################################# [100%] 範例二、一口氣安裝兩個以上的軟體時: [root@study ~]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm # 後面直接接上許多的軟體檔案! 範例三、直接由網路上面的某個檔案安裝,以網址來安裝: [root@study ~]# rpm -ivh http://website.name/path/pkgname.rpm另外,如果我們在安裝的過程當中發現問題,或者已經知道會發生的問題, 而還是『執意』要安裝這個軟體時,可以使用如下的參數『強制』安裝上去:
rpm 安裝時常用的選項與參數說明 可下達的選項代表意義 --nodeps 使用時機 :當發生軟體屬性相依問題而無法安裝,但你執意安裝時一般來說,rpm 的安裝選項與參數大約就是這些了。通常鳥哥建議直接使用 -ivh 就好了, 如果安裝的過程中發現問題,一個一個去將問題找出來,盡量不要使用『 暴力安裝法 』,就是透過 --force 去強制安裝! 因為可能會發生很多不可預期的問題呢!除非你很清楚的知道使用上面的參數後,安裝的結果是你預期的!
在沒有網路的前提下,你想要安裝一個名為 pam-devel 的軟體,你手邊只有原版光碟,該如何是好? 你可以透過掛載原版光碟來進行資料的查詢與安裝。請將原版光碟放入光碟機,底下我們嘗試將光碟掛載到 /mnt 當中, 並據以處理軟體的下載囉:使用 RPM 來升級真是太簡單了!就以 -Uvh 或 -Fvh 來升級即可,而 -Uvh 與 -Fvh 可以用的選項與參數,跟 install 是一樣的。不過, -U 與 -F 的意義還是不太一樣的,基本的差別是這樣的:
後面接的軟體即使沒有安裝過,則系統將予以直接安裝; 若後面接的軟體有安裝過舊版,則系統自動更新至新版; 如果後面接的軟體並未安裝到你的 Linux 系統上,則該軟體不會被安裝;亦即只有已安裝至你 Linux 系統內的軟體會被『升級』!由上面的說明來看,如果你想要大量的升級系統舊版本的軟體時,使用 -Fvh 則是比較好的作法,因為沒有安裝的軟體才不會被不小心安裝進系統中。但是需要注意的是,如果你使用的是 -Fvh ,偏偏你的機器上尚無這一個軟體,那麼很抱歉,該軟體並不會被安裝在你的 Linux 主機上面,所以請重新以 ivh 來安裝吧!
早期沒有 yum 的環境底下,同時網路頻寬也很糟糕的狀況下,通常有的朋友在進行整個作業系統的舊版軟體修補時,喜歡這麼進行:
所以,在不曉得 yum 功能的情況下,你依舊可以到 CentOS 的映設站台下載 updates 資料,然後利用上述的方法來一口氣升級! 當然囉,升級也是可以利用 --nodeps/--force 等等的參數啦! 不過,現在既然有 yum 的機制在,這個笨方法當然也就不再需要了!
RPM 在查詢的時候,其實查詢的地方是在 /var/lib/rpm/ 這個目錄下的資料庫檔案啦!另外, RPM 也可以查詢未安裝的 RPM 檔案內的資訊喔!那如何去查詢呢? 我們先來談談可用的選項有哪些?
[root@study ~]# rpm -qa <==已安裝軟體 [root@study ~]# rpm -q[licdR] 已安裝的軟體名稱 <==已安裝軟體 [root@study ~]# rpm -qf 存在於系統上面的某個檔名 <==已安裝軟體 [root@study ~]# rpm -qp[licdR] 未安裝的某個檔案名稱 <==查閱RPM檔案 選項與參數: 查詢已安裝軟體的資訊: -q :僅查詢,後面接的軟體名稱是否有安裝; -qa :列出所有的,已經安裝在本機 Linux 系統上面的所有軟體名稱; -qi :列出該軟體的詳細資訊 (information),包含開發商、版本與說明等; -ql :列出該軟體所有的檔案與目錄所在完整檔名 (list); -qc :列出該軟體的所有設定檔 (找出在 /etc/ 底下的檔名而已) -qd :列出該軟體的所有說明檔 (找出與 man 有關的檔案而已) -qR :列出與該軟體有關的相依軟體所含的檔案 (Required 的意思) -qf :由後面接的檔案名稱,找出該檔案屬於哪一個已安裝的軟體; -q --scripts:列出是否含有安裝後需要執行的腳本檔,可用以 debug 喔! 查詢某個 RPM 檔案內含有的資訊: -qp[icdlR]:注意 -qp 後面接的所有參數以上面的說明一致。但用途僅在於找出 某個 RPM 檔案內的資訊,而非已安裝的軟體資訊!注意!在查詢的部分,所有的參數之前都需要加上 -q 才是所謂的查詢!查詢主要分為兩部分, 一個是查已安裝到系統上面的的軟體資訊,這部份的資訊都是由 /var/lib/rpm/ 所提供。另一個則是查某個 rpm 檔案內容, 等於是由 RPM 檔案內找出一些要寫入資料庫內的資訊就是了,這部份就得要使用 -qp (p 是 package 的意思)。 那就來看看幾個簡單的範例吧!
範例一:找出你的 Linux 是否有安裝 logrotate 這個軟體? [root@study ~]# rpm -q logrotate logrotate-3.8.6-4.el7.x86_64 [root@study ~]# rpm -q logrotating package logrotating is not installed # 注意到,系統會去找是否有安裝後面接的軟體名稱。注意,不必要加上版本喔! # 至於顯示的結果,一看就知道有沒有安裝啦! 範例二:列出上題當中,屬於該軟體所提供的所有目錄與檔案: [root@study ~]# rpm -ql logrotate /etc/cron.daily/logrotate /etc/logrotate.conf ....(以下省略).... # 可以看出該軟體到底提供了多少的檔案與目錄,也可以追蹤軟體的資料。 範例三:列出 logrotate 這個軟體的相關說明資料: [root@study ~]# rpm -qi logrotate Name : logrotate # 軟體名稱 Version : 3.8.6 # 軟體的版本 Release : 4.el7 # 釋出的版本 Architecture: x86_64 # 編譯時所針對的硬體等級 Install Date: Mon 04 May 2015 05:52:36 PM CST # 這個軟體安裝到本系統的時間 Group : System Environment/Base # 軟體是放再哪一個軟體群組中 Size : 102451 # 軟體的大小 License : GPL+ # 釋出的授權方式 Signature : RSA/SHA256, Fri 04 Jul 2014 11:34:56 AM CST, Key ID 24c6a8a7f4a80eb5 Source RPM : logrotate-3.8.6-4.el7.src.rpm # 這就是 SRPM 的檔名 Build Date : Tue 10 Jun 2014 05:58:02 AM CST # 軟體編譯打包的時間 Build Host : worker1.bsys.centos.org # 在哪一部主機上面編譯的 Relocations : (not relocatable) Packager : CentOS BuildSystem <http://bugs.centos.org> Vendor : CentOS URL : https://fedorahosted.org/logrotate/ Summary : Rotates, compresses, removes and mails system log files Description : # 這個是詳細的描述! The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files. Logrotate allows for the automatic rotation compression, removal and mailing of log files. Logrotate can be set to handle a log file daily, weekly, monthly or when the log file gets to a certain size. Normally, logrotate runs as a daily cron job. Install the logrotate package if you need a utility to deal with the log files on your system. # 列出該軟體的 information (資訊),裡面的資訊可多著呢,包括了軟體名稱、 # 版本、開發商、SRPM檔案名稱、打包次數、簡單說明資訊、軟體打包者、 # 安裝日期等等!如果想要詳細的知道該軟體的資料,用這個參數來瞭解一下 範例四:分別僅找出 logrotate 的設定檔與說明檔 [root@study ~]# rpm -qc logrotate [root@study ~]# rpm -qd logrotate 範例五:若要成功安裝 logrotate ,他還需要什麼檔案的幫忙? [root@study ~]# rpm -qR logrotate /bin/sh config(logrotate) = 3.8.6-4.el7 coreutils >= 5.92 ....(以下省略).... # 由這裡看起來,呵呵~還需要很多檔案的支援才行喔! 範例六:由上面的範例五,找出 /bin/sh 是那個軟體提供的? [root@study ~]# rpm -qf /bin/sh bash-4.2.46-12.el7.x86_64 # 這個參數後面接的可是『檔案』吶!不像前面都是接軟體喔! # 這個功能在查詢系統的某個檔案屬於哪一個軟體所有的。 範例七:假設我有下載一個 RPM 檔案,想要知道該檔案的需求檔案,該如何? [root@study ~]# rpm -qpR filename.i386.rpm # 加上 -qpR ,找出該檔案需求的資料!常見的查詢就是這些了!要特別說明的是,在查詢本機上面的 RPM 軟體相關資訊時, 不需要加上版本的名稱,只要加上軟體名稱即可!因為他會由 /var/lib/rpm 這個資料庫裡面去查詢, 所以我們可以不需要加上版本名稱。但是查詢某個 RPM 檔案就不同了,我們必須要列出整個檔案的完整檔名才行~ 這一點朋友們常常會搞錯。底下我們就來做幾個簡單的練習吧!
驗證 (Verify) 的功能主要在於提供系統管理員一個有用的管理機制!作用的方式是『 使用 /var/lib/rpm 底下的資料庫內容來比對目前 Linux 系統的環境下的所有軟體檔案 』也就是說,當你有資料不小心遺失, 或者是因為你誤殺了某個軟體的檔案,或者是不小心不知道修改到某一個軟體的檔案內容, 就用這個簡單的方法來驗證一下原本的檔案系統吧!好讓你瞭解這一陣子到底是修改到哪些檔案資料了!驗證的方式很簡單:
[root@study ~]# rpm -Va [root@study ~]# rpm -V 已安裝的軟體名稱 [root@study ~]# rpm -Vp 某個 RPM 檔案的檔名 [root@study ~]# rpm -Vf 在系統上面的某個檔案 選項與參數: -V :後面加的是軟體名稱,若該軟體所含的檔案被更動過,才會列出來; -Va :列出目前系統上面所有可能被更動過的檔案; -Vp :後面加的是檔案名稱,列出該軟體內可能被更動過的檔案; -Vf :列出某個檔案是否被更動過~ 範例一:列出你的 Linux 內的 logrotate 這個軟體是否被更動過? [root@study ~]# rpm -V logrotate # 如果沒有出現任何訊息,恭喜你,該軟體所提供的檔案沒有被更動過。 # 如果有出現任何訊息,才是有出現狀況啊! 範例二:查詢一下,你的 /etc/crontab 是否有被更動過? [root@study ~]# rpm -Vf /etc/crontab .......T. c /etc/crontab # 瞧!因為有被更動過,所以會列出被更動過的資訊類型!好了,那麼我怎麼知道到底我的檔案被更動過的內容是什麼?例如上面的範例二。呵呵!簡單的說明一下吧! 例如,我們檢查一下 logrotate 這個軟體:
[root@study ~]# rpm -ql logrotate /etc/cron.daily/logrotate /etc/logrotate.conf /etc/logrotate.d /usr/sbin/logrotate /usr/share/doc/logrotate-3.8.6 /usr/share/doc/logrotate-3.8.6/CHANGES /usr/share/doc/logrotate-3.8.6/COPYING /usr/share/man/man5/logrotate.conf.5.gz /usr/share/man/man8/logrotate.8.gz /var/lib/logrotate.status # 呵呵!共有 10 個檔案啊!請修改 /etc/logrotate.conf 內的 rotate 變成 5 [root@study ~]# rpm -V logrotate ..5....T. c /etc/logrotate.conf你會發現在檔名之前有個 c ,然後就是一堆奇怪的文字了。那個 c 代表的是 configuration , 就是設定檔的意思。至於最前面的幾個資訊是:
所以,如果當一個設定檔所有的資訊都被更動過,那麼他的顯示就會是:
SM5DLUGTP c filename至於那個 c 代表的是『 Config file 』的意思,也就是檔案的類型,檔案類型有底下這幾類:
經過驗證的功能,你就可以知道那個檔案被更動過。那麼如果該檔案的變更是『預期中的』, 那麼就沒有什麼大問題,但是如果該檔案是『非預期的』,那麼是否被入侵了呢?呵呵!得注意注意囉! 一般來說,設定檔 (configure) 被更動過是很正常的,萬一你的 binary program 被更動過呢? 那就得要特別特別小心啊!
談完了軟體的驗證後,不知道你有沒有發現一個問題,那就是,驗證只能驗證軟體內的資訊與 /var/lib/rpm/ 裡面的資料庫資訊而已,如果該軟體檔案所提供的資料本身就有問題,那你使用驗證的手段也無法確定該軟體的正確性啊! 那如何解決呢?在 Tarball 與檔案的驗證方面,我們可以使用前一章談到的 md5 指紋碼來檢查, 不過,連指紋碼也可能會被竄改的嘛!那怎辦?沒關係,我們可以透過數位簽章來檢驗軟體的來源的!
就像你自己的簽名一樣,我們的軟體開發商原廠所推出的軟體也會有一個廠商自己的簽章系統! 只是這個簽章被數位化了而已。廠商可以數位簽章系統產生一個專屬於該軟體的簽章,並將該簽章的公鑰 (public key) 釋出。 當你要安裝一個 RPM 檔案時:
我們 CentOS 使用的數位簽章系統為 GNU 計畫的 GnuPG (GNU Privacy Guard, GPG)( 註1 )。 GPG 可以透過雜湊運算,算出獨一無二的專屬金鑰系統或者是數位簽章系統,有興趣的朋友可以參考文末的延伸閱讀, 去瞭解一下 GPG 加密的機制喔!這裡我們僅簡單的說明數位簽章在 RPM 檔案上的應用而已。 而根據上面的說明,我們也會知道首先必須要安裝原廠釋出的 GPG 數位簽章的公鑰檔案啊!CentOS 的數位簽章位於:
[root@study ~]# ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 -rw-r--r--. 1 root root 1690 Apr 1 06:27 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 [root@study ~]# cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.5 (GNU/Linux) mQINBFOn/0sBEADLDyZ+DQHkcTHDQSE0a0B2iYAEXwpPvs67cJ4tmhe/iMOyVMh9 ....(中間省略).... -----END PGP PUBLIC KEY BLOCK-----從上面的輸出,你會知道該數位簽章碼其實僅是一個亂數而已,這個亂數對於數位簽章有意義而已, 我們看不懂啦!那麼這個檔案如何安裝呢?透過底下的方式來安裝即可喔!
[root@study ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7由於不同版本 GPG 金鑰檔案放置的位置可能不同,不過檔名大多是以 GPG-KEY 來說明的, 因此你可以簡單的使用 locate 或 find 來找尋,如以下的方式來搜尋即可:
[root@study ~]# locate GPG-KEY [root@study ~]# find /etc -name '*GPG-KEY*'那安裝完成之後,這個金鑰的內容會以什麼方式呈現呢?基本上都是使用 pubkey 作為軟體的名稱的! 那我們先列出金鑰軟體名稱後,再以 -qi 的方式來查詢看看該軟體的資訊為何:
[root@study ~]# rpm -qa | grep pubkey gpg-pubkey-f4a80eb5-53a7ff4b [root@study ~]# rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b Name : gpg-pubkey Version : f4a80eb5 Release : 53a7ff4b Architecture: (none) Install Date: Fri 04 Sep 2015 11:30:46 AM CST Group : Public Keys Size : 0 License : pubkey Signature : (none) Source RPM : (none) Build Date : Mon 23 Jun 2014 06:19:55 PM CST Build Host : localhost Relocations : (not relocatable) Packager : CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]> Summary : gpg(CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]>) Description : -----BEGIN PGP PUBLIC KEY BLOCK----- Version: rpm-4.11.1 (NSS-3) ....(底下省略)....重點就是最後面出現的那一串亂碼啦!那可是作為數位簽章非常重要的一環哩! 如果你忘記加上數位簽章,很可能很多原版軟體就不能讓你安裝囉~除非你利用 rpm 時選擇略過數位簽章的選項。
反安裝就是將軟體解除安裝啦!要注意的是,『解安裝的過程一定要由最上層往下解除』,以 rp-pppoe 為例,這一個軟體主要是依據 ppp 這個軟體來安裝的,所以當你要解除 ppp 的時候,就必須要先解除 rp-pppoe 才行!否則就會發生結構上的問題啦!這個可以由建築物來說明, 如果你要拆除五、六樓,那麼當然要由六樓拆起,否則先拆的是第五樓時,那麼上面的樓層難道會懸空?
移除的選項很簡單,就透過 -e 即可移除。不過,很常發生軟體屬性相依導致無法移除某些軟體的問題! 我們以底下的例子來說明:
# 1. 找出與 pam 有關的軟體名稱,並嘗試移除 pam 這個軟體: [root@study ~]# rpm -qa | grep pam fprintd-pam-0.5.0-4.0.el7_0.x86_64 pam-1.1.8-12.el7.x86_64 gnome-keyring-pam-3.8.2-10.el7.x86_64 pam-devel-1.1.8-12.el7.x86_64 pam_krb5-2.4.8-4.el7.x86_64 [root@study ~]# rpm -e pam error: Failed dependencies: <==這裡提到的是相依性的問題 libpam.so.0()(64bit) is needed by (installed) systemd-libs-208-20.el7.x86_64 libpam.so.0()(64bit) is needed by (installed) libpwquality-1.2.3-4.el7.x86_64 ....(以下省略).... # 2. 若僅移除 pam-devel 這個之前範例安裝上的軟體呢? [root@study ~]# rpm -e pam-devel <==不會出現任何訊息! [root@study ~]# rpm -q pam-devel package pam-devel is not installed從範例一我們知道 pam 所提供的函式庫是讓非常多其他軟體使用的,因此你不能移除 pam ,除非將其他相依軟體一口氣也全部移除!你當然也能加 --nodeps 來強制移除, 不過,如此一來所有會用到 pam 函式庫的軟體,都將成為無法運作的程式,我想,你的主機也只好準備停機休假了吧! 至於範例二中,由於 pam-devel 是依附於 pam 的開發工具,你可以單獨安裝與單獨移除啦!
由於 RPM 檔案常常會安裝/移除/升級等,某些動作或許可能會導致 RPM 資料庫 /var/lib/rpm/ 內的檔案破損。果真如此的話,那你該如何是好?別擔心,我們可以使用 --rebuilddb 這個選項來重建一下資料庫喔! 作法如下:
[root@study ~]# rpm --rebuilddb <==重建資料庫我們在本章一開始的地方談到過 yum 這玩意兒,這個 yum 是透過分析 RPM 的標頭資料後, 根據各軟體的相關性製作出屬性相依時的解決方案,然後可以自動處理軟體的相依屬性問題,以解決軟體安裝或移除與升級的問題。 詳細的 yum 伺服器與用戶端之間的溝通,可以再回到前面的部分查閱一下 圖 22.1.1 的說明。
由於 distribution 必須要先釋出軟體,然後將軟體放置於 yum 伺服器上面,以提供用戶端來要求安裝與升級之用的。 因此我們想要使用 yum 的功能時,必須要先找到適合的 yum server 才行啊!而每個 yum server 可能都會提供許多不同的軟體功能,那就是我們之前談到的『軟體庫』啦!因此,你必須要前往 yum server 查詢到相關的軟體庫網址後,再繼續處理後續的設定事宜。
事實上 CentOS 在釋出軟體時已經製作出多部映射站台 (mirror site) 提供全世界的軟體更新之用。 所以,理論上我們不需要處理任何設定值,只要能夠連上 Internet ,就可以使用 yum 囉!底下就讓我們來玩玩看吧!
yum 的使用真是非常簡單,就是透過 yum 這個指令啊!那麼這個指令怎麼用呢?用法很簡單,就讓我們來簡單的談談:
如果想要查詢利用 yum 來查詢原版 distribution 所提供的軟體,或已知某軟體的名稱,想知道該軟體的功能, 可以利用 yum 相關的參數為:
[root@study ~]# yum [option] [查詢工作項目] [相關參數] 選項與參數: [option]:主要的選項,包括有: -y :當 yum 要等待使用者輸入時,這個選項可以自動提供 yes 的回應; --installroot=/some/path :將該軟體安裝在 /some/path 而不使用預設路徑 [查詢工作項目] [相關參數]:這方面的參數有: search :搜尋某個軟體名稱或者是描述 (description) 的重要關鍵字; list :列出目前 yum 所管理的所有的軟體名稱與版本,有點類似 rpm -qa; info :同上,不過有點類似 rpm -qai 的執行結果; provides:從檔案去搜尋軟體!類似 rpm -qf 的功能! 範例一:搜尋磁碟陣列 (raid) 相關的軟體有哪些? [root@study ~]# yum search raid Loaded plugins: fastestmirror, langpacks # yum 系統自己找出最近的 yum server Loading mirror speeds from cached hostfile # 找出速度最快的那一部 yum server * base: ftp.twaren.net # 底下三個軟體庫,且來源為該伺服器! * extras: ftp.twaren.net * updates: ftp.twaren.net ....(前面省略).... dmraid-events-logwatch.x86_64 : dmraid logwatch-based email reporting dmraid-events.x86_64 : dmevent_tool (Device-mapper event tool) and DSO iprutils.x86_64 : Utilities for the IBM Power Linux RAID adapters mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays) ....(後面省略).... # 在冒號 (:) 左邊的是軟體名稱,右邊的則是在 RPM 內的 name 設定 (軟體名) # 瞧!上面的結果,這不就是與 RAID 有關的軟體嗎?如果想瞭解 mdadm 的軟體內容呢? 範例二:找出 mdadm 這個軟體的功能為何 [root@study ~]# yum info mdadm Installed Packages <==這說明該軟體是已經安裝的了 Name : mdadm <==這個軟體的名稱 Arch : x86_64 <==這個軟體的編譯架構 Version : 3.3.2 <==此軟體的版本 Release : 2.el7 <==釋出的版本 Size : 920 k <==此軟體的檔案總容量 Repo : installed <==軟體庫回報說已安裝的 From repo : anaconda Summary : The mdadm program controls Linux md devices (software RAID arrays) URL : http://www.kernel.org/pub/linux/utils/raid/mdadm/ License : GPLv2+ Description : The mdadm program is used to create, manage, and monitor Linux MD (software : RAID) devices. As such, it provides similar functionality to the raidtools : package. However, mdadm is a single program, and it can perform : almost all functions without a configuration file, though a configuration : file can be used to help with some common tasks. # 不要跟我說,上面說些啥?自己找字典翻一翻吧!拜託拜託! 範例三:列出 yum 伺服器上面提供的所有軟體名稱 [root@study ~]# yum list Installed Packages <==已安裝軟體 GConf2.x86_64 3.2.6-8.el7 @anaconda LibRaw.x86_64 0.14.8-5.el7.20120830git98d925 @base ModemManager.x86_64 1.1.0-6.git20130913.el7 @anaconda ....(中間省略).... Available Packages <==還可以安裝的其他軟體 389-ds-base.x86_64 1.3.3.1-20.el7_1 updates 389-ds-base-devel.x86_64 1.3.3.1-20.el7_1 updates 389-ds-base-libs.x86_64 1.3.3.1-20.el7_1 updates ....(底下省略).... # 上面提供的意義為:『 軟體名稱 版本 在那個軟體庫內 』 範例四:列出目前伺服器上可供本機進行升級的軟體有哪些? [root@study ~]# yum list updates <==一定要是 update s 喔! Updated Packages NetworkManager.x86_64 1:1.0.0-16.git20150121.b4ea599c.el7_1 updates NetworkManager-adsl.x86_64 1:1.0.0-16.git20150121.b4ea599c.el7_1 updates ....(底下省略).... # 上面就列出在那個軟體庫內可以提供升級的軟體與版本! 範例五:列出提供 passwd 這個檔案的軟體有哪些 [root@study ~]# yum provides passwd passwd-0.79-4.el7.x86_64 : An utility for setting or changing passwords using PAM Repo : base passwd-0.79-4.el7.x86_64 : An utility for setting or changing passwords using PAM Repo : @anaconda # 找到啦!就是上面的這個軟體提供了 passwd 這個程式!透過上面的查詢,你應該大致知道 yum 如何用在查詢上面了吧?那麼實際來應用一下:
利用 yum 的功能,找出以 pam 為開頭的軟體名稱有哪些?而其中尚未安裝的又有哪些? 可以透過如下的方法來查詢:既然可以查詢,那麼安裝與升級呢?很簡單啦!就利用 install 與 update 這兩項工作來處理即可喔!
[root@study ~]# yum [option] [安裝與升級的工作項目] [相關參數] 選項與參數: install :後面接要安裝的軟體! update :後面接要升級的軟體,若要整個系統都升級,就直接 update 即可 範例一:將前一個練習找到的未安裝的 pam-devel 安裝起來 [root@study ~]# yum install pam-devel Loaded plugins: fastestmirror, langpacks # 首先的 5 行在找出最快的 yum server Loading mirror speeds from cached hostfile * base: ftp.twaren.net * extras: ftp.twaren.net * updates: ftp.twaren.net Resolving Dependencies # 接下來先處理『屬性相依』的軟體問題 --> Running transaction check ---> Package pam-devel.x86_64 0:1.1.8-12.el7_1.1 will be installed --> Processing Dependency: pam(x86-64) = 1.1.8-12.el7_1.1 for package: pam-devel- 1.1.8-12.el7_1.1.x86_64 --> Running transaction check ---> Package pam.x86_64 0:1.1.8-12.el7 will be updated ---> Package pam.x86_64 0:1.1.8-12.el7_1.1 will be an update --> Finished Dependency Resolution Dependencies Resolved # 由上面的檢查發現到 pam 這個軟體也需要同步升級,這樣才能夠安裝新版 pam-devel 喔! # 至於底下則是一個總結的表格顯示! ========================================================================================== Package Arch Version Repository Size ========================================================================================== Installing: pam-devel x86_64 1.1.8-12.el7_1.1 updates 183 k Updating for dependencies: pam x86_64 1.1.8-12.el7_1.1 updates 714 k Transaction Summary ========================================================================================== Install 1 Package # 要安裝的是一個軟體 Upgrade ( 1 Dependent package) # 因為相依屬性問題,需要額外加裝一個軟體! Total size: 897 k Total download size: 183 k # 總共需要下載的容量! Is this ok [y/d/N]: y # 你得要自己決定是否要下載與安裝!當然是 y 啊! Downloading packages: # 開始下載囉! warning: /var/cache/yum/x86_64/7/updates/packages/pam-devel-1.1.8-12.el7_1.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY Public key for pam-devel-1.1.8-12.el7_1.1.x86_64.rpm is not installed pam-devel-1.1.8-12.el7_1.1.x86_64.rpm | 183 kB 00:00:00 Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Importing GPG key 0xF4A80EB5: Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]>" Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5 Package : centos-release-7-1.1503.el7.centos.2.8.x86_64 (@anaconda) From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Is this ok [y/N]: y # 只有在第一次安裝才會出現這個項目『確定要安裝數位簽章』才能繼續! Running transaction check Running transaction test Transaction test succeeded Running transaction Warning: RPMDB altered outside of yum. Updating : pam-1.1.8-12.el7_1.1.x86_64 1/3 Installing : pam-devel-1.1.8-12.el7_1.1.x86_64 2/3 Cleanup : pam-1.1.8-12.el7.x86_64 3/3 Verifying : pam-1.1.8-12.el7_1.1.x86_64 1/3 Verifying : pam-devel-1.1.8-12.el7_1.1.x86_64 2/3 Verifying : pam-1.1.8-12.el7.x86_64 3/3 Installed: pam-devel.x86_64 0:1.1.8-12.el7_1.1 Dependency Updated: pam.x86_64 0:1.1.8-12.el7_1.1 Complete!有沒有很高興啊!你不必知道軟體在哪裡,你不必手動下載軟體,你也不必拿出原版光碟出來 mount 之後查詢再安裝!全部不需要,只要有了 yum 這個傢伙,你的安裝、升級再也不是什麼難事! 而且還能主動的進行軟體的屬性相依處理流程,如上所示,一口氣幫我們處理好了所有事情! 是不是很過癮啊!而且整個動作完全免費!夠酷吧!
那能不能用 yum 移除軟體呢?將剛剛的軟體移除看看,會出現啥狀況啊?
[root@study ~]# yum remove pam-devel Loaded plugins: fastestmirror, langpacks Resolving Dependencies <==同樣的,先解決屬性相依的問題 --> Running transaction check ---> Package pam-devel.x86_64 0:1.1.8-12.el7_1.1 will be erased --> Finished Dependency Resolution Dependencies Resolved ========================================================================================== Package Arch Version Repository Size ========================================================================================== Removing: pam-devel x86_64 1.1.8-12.el7_1.1 @updates 528 k Transaction Summary ========================================================================================== Remove 1 Package # 還好!沒有相依屬性的問題,僅移除一個軟體! Installed size: 528 k Is this ok [y/N]: y Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Erasing : pam-devel-1.1.8-12.el7_1.1.x86_64 1/1 Verifying : pam-devel-1.1.8-12.el7_1.1.x86_64 1/1 Removed: pam-devel.x86_64 0:1.1.8-12.el7_1.1 Complete!連移除也這麼簡單!看來,似乎不需要 rpm 這個指令也能夠快樂的安裝所有的軟體了! 雖然是如此,但是 yum 畢竟是架構在 rpm 上面所發展起來的,所以,鳥哥認為你還是得需要瞭解 rpm 才行!不要學了 yum 之後就將 rpm 的功能忘記了呢!切記切記!
雖然 yum 是你的主機能夠連線上 Internet 就可以直接使用的,不過,由於 CentOS 的映射站台可能會選錯, 舉例來說,我們在台灣,但是 CentOS 的映射站台卻選擇到了大陸北京或者是日本去,有沒有可能發生啊! 有啊!鳥哥教學方面就常常發生這樣的問題,要知道,我們連線到大陸或日本的速度是非常慢的呢!那怎辦? 當然就是手動的修改一下 yum 的設定檔就好囉!
在台灣,CentOS 的映射站台主要有高速網路中心與義守大學,鳥哥近來比較偏好高速網路中心, 似乎更新的速度比較快,而且連接台灣學術網路也非常快速哩!因此,鳥哥底下建議台灣的朋友使用高速網路中心的 ftp 主機資源來作為 yum 伺服器來源喔!不過因為鳥哥也在崑大服務,崑大目前也加入了 CentOS 的映射站, 如果在崑山或台南地區,也能夠選擇崑大的 FTP 喔!目前高速網路中心與崑大對於 CentOS 所提供的相關網址如下:
如果你連接到上述的網址後,就會發現裡面有一堆連結,那些連結就是這個 yum 伺服器所提供的軟體庫了! 所以高速網路中心也提供了 centosplus, cloud, extras, fasttrack, os, updates 等軟體庫,最好認的軟體庫就是 os (系統預設的軟體) 與 updates (軟體升級版本) 囉!由於鳥哥在我的測試用主機是利用 x86_64 的版本, 因此那個 os 再點進去就會得到如下的可提供安裝的網址:
為什麼在上述的網址內呢?有什麼特色! 最重要的特色就是那個『 repodata 』的目錄!該目錄就是分析 RPM 軟體後所產生的軟體屬性相依資料放置處! 因此,當你要找軟體庫所在網址時, 最重要的就是該網址底下一定要有個名為 repodata 的目錄存在!那就是軟體庫的網址了! 其他的軟體庫正確網址,就請各位看倌自行尋找一下喔!現在讓我們修改設定檔吧!
[root@study ~]# vim /etc/yum.repos.d/CentOS-Base.repo [base] name=CentOS-$releasever - Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7如上所示,鳥哥僅列出 base 這個軟體庫內容而已,其他的軟體庫內容請自行查閱囉!上面的資料需要注意的是:
瞭解這個設定檔之後,接下來讓我們修改整個檔案的內容,讓我們這部主機可以直接使用高速網路中心的資源吧! 修改的方式鳥哥僅列出 base 這個軟體庫項目而已,其他的項目請您自行依照上述的作法來處理即可!
[root@study ~]# vim /etc/yum.repos.d/CentOS-Base.repo [base] name=CentOS-$releasever - Base baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/os/x86_64/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 [updates] name=CentOS-$releasever - Updates baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/updates/x86_64/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 [extras] name=CentOS-$releasever - Extras baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/extras/x86_64/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 # 預設情況下,軟體倉庫僅有這三個有啟用!所以鳥哥僅修改這三個軟體庫的 baseurl 而已喔!接下來當然就是給它測試一下這些軟體庫是否正常的運作中啊!如何測試呢?再次使用 yum 即可啊!
範例一:列出目前 yum server 所使用的軟體庫有哪些? [root@study ~]# yum repolist all repo id repo name status C7.0.1406-base/x86_64 CentOS-7.0.1406 - Base disabled C7.0.1406-centosplus/x86_64 CentOS-7.0.1406 - CentOSPlus disabled C7.0.1406-extras/x86_64 CentOS-7.0.1406 - Extras disabled C7.0.1406-fasttrack/x86_64 CentOS-7.0.1406 - CentOSPlus disabled C7.0.1406-updates/x86_64 CentOS-7.0.1406 - Updates disabled base CentOS-7 - Base enabled: 8,652 base-debuginfo/x86_64 CentOS-7 - Debuginfo disabled base-source/7 CentOS-7 - Base Sources disabled centosplus/7/x86_64 CentOS-7 - Plus disabled centosplus-source/7 CentOS-7 - Plus Sources disabled cr/7/x86_64 CentOS-7 - cr disabled extras CentOS-7 - Extras enabled: 181 extras-source/7 CentOS-7 - Extras Sources disabled fasttrack/7/x86_64 CentOS-7 - fasttrack disabled updates CentOS-7 - Updates enabled: 1,302 updates-source/7 CentOS-7 - Updates Sources disabled repolist: 10,135 # 上面最右邊有寫 enabled 才是有啟動的!由於 /etc/yum.repos.d/ # 有多個設定檔,所以你會發現還有其他的軟體庫存在。由於我們是修改系統預設的設定檔,事實上,我們應該要在 /etc/yum.repos.d/ 底下新建一個檔案, 該副檔名必須是 .repo 才行!但因為我們使用的是指定特定的映射站台,而不是其他軟體開發商提供的軟體庫, 因此才修改系統預設設定檔。但是可能由於使用的軟體庫版本有新舊之分,你得要知道, yum 會先下載軟體庫的清單到本機的 /var/cache/yum 裡面去!那我們修改了網址卻沒有修改軟體庫名稱 (中括號內的文字), 可能就會造成本機的清單與 yum 伺服器的清單不同步,此時就會出現無法更新的問題了!
那怎麼辦啊?很簡單,就清除掉本機上面的舊資料即可!需要手動處理嗎?不需要的, 透過 yum 的 clean 項目來處理即可!
[root@study ~]# yum clean [packages|headers|all] 選項與參數: packages:將已下載的軟體檔案刪除 headers :將下載的軟體檔頭刪除 all :將所有軟體庫資料都刪除! 範例一:刪除已下載過的所有軟體庫的相關資料 (含軟體本身與清單) [root@study ~]# yum clean all透過 yum 來線上安裝一個軟體是非常的簡單,但是,如果要安裝的是一個大型專案呢? 舉例來說,鳥哥使用預設安裝的方式安裝了測試機,這部主機就只有 GNOME 這個視窗管理員, 那我如果想要安裝 KDE 呢?難道需要重新安裝?當然不需要,透過 yum的軟體群組功能即可! 來看看指令先:
[root@study ~]# yum [群組功能] [軟體群組] 選項與參數: grouplist :列出所有可使用的『軟體群組組』,例如 Development Tools 之類的; groupinfo :後面接 group_name,則可瞭解該 group 內含的所有軟體名; groupinstall:這個好用!可以安裝一整組的軟體群組,相當的不錯用! groupremove :移除某個軟體群組; 範例一:查閱目前軟體庫與本機上面的可用與安裝過的軟體群組有哪些? [root@study ~]# yum grouplist Installed environment groups: # 已經安裝的系統環境軟體群組 Development and Creative Workstation Available environment groups: # 還可以安裝的系統環境軟體群組 Minimal Install Compute Node Infrastructure Server File and Print Server Basic Web Server Virtualization Host Server with GUI GNOME Desktop KDE Plasma Workspaces Installed groups: # 已經安裝的軟體群組! Development Tools Available Groups: # 還能額外安裝的軟體群組! Compatibility Libraries Console Internet Tools Graphical Administration Tools Legacy UNIX Compatibility Scientific Support Security Tools Smart Card Support System Administration Tools System Management你會發現系統上面的軟體大多是群組的方式一口氣來提供安裝的!還記全新安裝 CentOS 時, 不是可以選擇所需要的軟體嗎?而那些軟體不是利用 GNOME/KDE/X Window ... 之類的名稱存在嗎? 其實那就是軟體群組囉!如果你執行上述的指令後,在『Available Groups』底下應該會看到一個 『Scientific Support』的軟體群組,想知道那是啥嗎?就這樣做:
[root@study ~]# yum groupinfo "Scientific Support" Group: Scientific Support Group-Id: scientific Description: Tools for mathematical and scientific computations, and parallel computing. Optional Packages: atlas fftw-devel fftw-static gnuplot gsl-devel lapack mpich ....(以下省略)....你會發現那就是一個科學運算、平行運算會用到的各種工具就是了!而下方則列出許多應該會在該群組安裝時被下載與安裝的軟體們! 讓我們直接來安裝看看!
[root@study ~]# yum groupinstall "Scientific Support"正常情況下系統是會幫你安裝好各項軟體的。只是傷腦筋的是,剛剛好 Scientific Support 裡面的軟體都是『可選擇的』!而不是『主要的 (mandatory)』, 因此預設情況下,上面這些軟體通通不會幫你安裝!!如果你想要安裝上述的軟體,可以使用 yum install atlas fftw .. 一個一個寫進去安裝~ 如果想要讓 groupinstall 預設安裝好所有的 optional 軟體呢?那就得要修改設定檔!更改選 groupinstall 選擇的軟體項目即可!如下所示:
[root@study ~]# vim /etc/yum.conf .....(前面省略)..... distroverpkg=centos-release # 找到這一行,底下新增一行! group_package_types=default, mandatory, optional .....(底下省略)..... [root@study ~]# yum groupinstall "Scientific Support"你就會發現系統開始進行了一大堆軟體的安裝!那就是啦!這個 group 功能真是非常的方便呢!這個功能請一定要記下來,對你未來安裝軟體是非常有幫助的喔! ^_^
鳥哥因為工作的關係,在 Linux 上面經常需要安裝第三方協力軟體,這包括 NetCDF 以及 MPICH 等等的軟體。現在由於平行處理的函式庫需求大增, 所以 MPICH 已經納入預設的 CentOS 7 軟體庫中。但是 NetCDF 這個軟體就沒有包含在裡頭了~同時,Linux 上面還有個很棒的統計軟體,這個軟體名稱為『 R 』! 預設也是不在 CentOS 的軟體庫內~唉~那怎辦?要使用前一章介紹的 Tarball 去編譯與安裝嗎?這倒不需要~因為有很多我們好棒的網友提供預先編譯版本了!
在 Fedora 基金會裡面發展了一個外加軟體計畫 (Extra Packages for Enterprise Linux, EPEL),這個計畫主要是針對 Red Hat Enterprise Linux 的版本來開發的, 剛剛好 CentOS 也是針對 RHEL 的版本來處理的嘛!所以也就能夠支援該軟體庫的相關軟體相依環境了。這個計畫的主網站在底下網頁:
而我們的 CentOS 7 主要可以使用的軟體倉庫網址為:
除了上述的 Fedora 計畫所提供的額外軟體庫之外,其實社群裡面也有朋友針對 CentOS 與 EPEL 的不足而提供的許多軟體倉庫喔! 底下鳥哥是列出當初鳥哥為了要處理 PCI passthrough 虛擬化而使用到的 ELRepo 這個軟體倉庫,若有其他的需求,你就得要自己搜尋了! 這個 ELRepo 軟體倉庫與提供給 CentOS 7.x 的網址如下:
這個 ELRepo 的軟體庫跟其他軟體庫比較不同的地方在於這個軟體庫提供的資料大多是與核心、核心模組與虛擬化相關軟體有關,例如 NVidia 的驅動程式也在裡面咧! 尤其提供了最新的核心 (取名為 kernel-ml 的軟體名稱,其實就是最新的 Linux 核心啊!),如果你的系統像鳥哥的某些發展伺服器一樣,那就有可能會使用到這個軟體庫喔!
好了!根據上面的說明,來玩一玩底下這個模擬案例看看:
我的系統上面想要透過上述的 CentOS 7 的 EPEL 計畫來安裝 netcdf 以及 R 這兩套軟體,該如何處理?萬一你的主機並沒有網路,但是你卻有很多軟體安裝的需求~假設你的系統也都還沒有任何升級的動作過, 這個時候我能不能用本機的光碟來作為主要的軟體來源呢?答案當然是可以啊!那要怎麼做呢? 很簡單,將你的光碟掛載到某個目錄,我們這裡還是繼續假設在 /mnt 好了,然後設定如下的 yum 設定檔:
[root@study ~]# vim /etc/yum.repos.d/cdrom.repo [mycdrom] name = mycdrom baseurl = file:///mnt gpgcheck = 0 enabled = 0 [root@study ~]# yum --enablerepo=mycdrom install software_name這個設定功能在你沒有網路但是卻需要解決很多軟體相依性的狀況時,相當好用啊!
我們可以手動選擇是否需要升級,那能不能讓系統自動升級,讓我們的系統隨時保持在最新的狀態呢? 當然可以啊!透過『 yum -y update 』來自動升級,那個 -y 很重要,因為可以自動回答 yes 來開始下載與安裝! 然後再透過 crontab 的功能來處理即可!假設我每天在台灣時間 3:00am 網路頻寬比較輕鬆的時候進行升級, 你可以這樣做的:
[root@study ~]# echo '10 1 * * * root /usr/bin/yum -y --enablerepo=epel update' > /etc/cron.d/yumupdate [root@study ~]# vim /etc/crontab從此你的系統就會自動升級啦!很棒吧!此外,你還是得要分析登錄檔與收集 root 的信件的, 因為如果升級的是核心軟體 (kernel),那麼你還是得要重新開機才會讓安裝的軟體順利運作的! 所以還是得分析登錄檔,若有新核心安裝,就重新開機,否則就讓系統自動維持在最新較安全的環境吧! 真是輕鬆愉快的管理啊!
這一直是個有趣的問題:『 如果我要升級的話,或者是全新安裝一個新的軟體, 那麼該選擇 RPM 還是 Tarball 來安裝呢? 』,事實上考慮的因素很多,不過鳥哥通常是這樣建議的:
所以說,RPM 與 Tarball 各有其優缺點,不過,如果有 RPM 的話,那麼優先權還是在於 RPM 安裝上面,畢竟管理上比較便利,但是如果軟體的架構差異性太大, 或者是無法解決相依屬性的問題,那麼與其花大把的時間與精力在解決屬性相依的問題上,還不如直接以 tarball 來安裝,輕鬆又愜意!
我們在 17 章談到 systemd 的服務管理,那個時候僅使用 vsftpd 這個比較簡單的服務來做個說明,那是因為還沒有談到 yum 這個東東的緣故。 現在,我們已經處理好了網路問題 (20 章的內容),這個 yum 也能夠順利的使用!那麼有沒有其他的服務可以拿來做個測試呢?有的,我們就拿網站伺服器來說明吧!
一般來說, WWW 網站伺服器需要的有 WWW 伺服器軟體 + 網頁程式語言 + 資料庫系統 + 程式語言與資料庫的連結軟體等等,在 CentOS 上面, 我們需要的軟體就有『 httpd + php + mariadb-server + php-mysql 』這些軟體。不過我們預設僅要啟用 httpd 而已,因此等一下雖然上面的軟體都要安裝, 不過僅有 httpd 預設要啟動而已喔!
另外,在預設的情況下,你無須修改服務的設定檔,都透過系統預設值來處理你的服務即可!那麼有個江湖口訣你可以將它背下來~ 讓你在處理服務的時候就不會掉漆了~
底下就讓我們一步一步來實驗吧!
# 0. 先檢查一下有哪些軟體沒有安裝或已安裝~這個不太需要進行~單純是鳥哥比較龜毛要先查看看而已! [root@study ~]# rpm -q httpd php mariadb-server php-mysql httpd-2.4.6-31.el7.centos.1.x86_64 # 只有這個安裝好了,底下三個都沒裝! package php is not installed package mariadb-server is not installed package php-mysql is not installed # 1. 安裝所需要的軟體! [root@study ~]# yum install httpd php mariadb-server php-mysql # 當然,大前提是你的網路沒問題!這樣就可以直接線上安裝或升級! # 2. 3. 啟動與開機啟動,這兩個步驟要記得一定得進行! [root@study ~]# systemctl daemon-reload [root@study ~]# systemctl start httpd [root@study ~]# systemctl enable httpd [root@study ~]# systemctl status httpd httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled ) Active: active (running) since Wed 2015-09-09 16:52:04 CST; 9s ago Main PID: 8837 (httpd) Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec" CGroup: /system.slice/httpd.service ├─8837 /usr/sbin/httpd -DFOREGROUND # 4. 防火牆 [root@study ~]# firewall-cmd --add-service="http" [root@study ~]# firewall-cmd --permanent --add-service="http" [root@study ~]# firewall-cmd --list-all public (default, active) interfaces: eth0 sources: services: dhcpv6-client ftp http https ssh # 這個是否有啟動才是重點! ports: 222/tcp 555/tcp masquerade: no forward-ports: icmp-blocks: rich rules: rule family="ipv4" source address="192.168.1.0/24" accept在最後的測試中,進入圖形界面,打開你的瀏覽器,在網址列輸入『 http://localhost 』就會出現如下的畫面! 那就代表成功了!你的 Linux 已經是 Web server 囉!就是這麼簡單!
談完了 RPM 類型的軟體之後,再來我們談一談包含了 Source code 的 SRPM 該如何使用呢?假如今天我們由網路上面下載了一個 SRPM 的檔案,該如何安裝他?又,如果我想要修改這個 SRPM 裡面原始碼的相關設定值,又該如何訂正與重新編譯呢? 此外,最需要注意的是, 新版的 rpm 已經將 RPM 與 SRPM 的指令分開了,SRPM 使用的是 rpmbuild 這個指令,而不是 rpm 喔 !
假設我下載了一個 SRPM 的檔案,又不想要修訂這個檔案內的原始碼與相關的設定值, 那麼我可以直接編譯並安裝嗎?當然可以!利用 rpmbuild 配合選項即可。選項主要有底下兩個:
--rebuild 這個選項會將後面的 SRPM 進行『編譯』與『打包』的動作,最後會產生 RPM 的檔案,但是產生的 RPM 檔案並沒有安裝到系統上。當你使用 --rebuild 的時候,最後通常會發現一行字體:不過,要注意的是,這兩個選項都沒有修改過 SRPM 內的設定值,僅是透過再次編譯來產生 RPM 可安裝軟體檔案而已。 一般來說,如果編譯的動作順利的話,那麼編譯過程所產生的中間暫存檔都會被自動刪除,如果發生任何錯誤, 則該中間檔案會被保留在系統上,等待使用者的除錯動作!
請由 http://vault.centos.org/ 下載正確的 CentOS 版本中, 在 updates 軟體庫當中的 ntp 軟體 SRPM,請下載最新的那個版本即可,然後進行編譯的行為。上面的測試案例是將一個 SRPM 檔案抓下來之後,依據你的系統重新進行編譯。一般來說,因為該編譯可能會依據你的系統硬體而最佳化, 所以可能效能會好一些些,但是...人類根本感受不到那種效能優化的效果~所以並不建議你這麼作。此外, 這種情況也很能發生在你從不同的 Linux distribution 所下載的 SRPM 拿來想要安裝在你的系統上,這樣作才算是有點意義。
一般來說,如果你有需要用到 SRPM 的檔案,大部分的原因就是...你需要重新修改裡面的某些設定,讓軟體加入某些特殊功能等等的。 所以囉,此時就得要將 SRPM 拆開,編輯一下編譯設定檔,然後再予以重新編譯啦!下個小節我們來玩玩修改設定的方式!
SRPM 既然含有 source code ,那麼其中必定有設定檔囉,所以首先我們必需要知道,這個 SRPM 在進行編譯的時候會使用到哪些目錄呢?這樣一來才能夠來修改嘛! 不過從 CentOS 6.x 開始 (當然包含我們的 CentOS 7.x 囉),因為每個用戶應該都有能力自己安裝自己的軟體,因此 SRPM 安裝、設定、編譯、最終結果所使用的目錄都與操作者的家目錄有關~鳥哥假設你用 root 的身份來進行 SRPM 的操作, 那麼你應該就會使用到下列的目錄喔:
/root/rpmbuild/SPECS 這個目錄當中放置的是該軟體的設定檔,例如這個軟體的資訊參數、設定項目等等都放置在這裡; /root/rpmbuild/SOURCES 這個目錄當中放置的是該軟體的原始檔 (*.tar.gz 的檔案) 以及 config 這個設定檔; /root/rpmbuild/BUILD 在編譯的過程中,有些暫存的資料都會放置在這個目錄當中; /root/rpmbuild/RPMS 經過編譯之後,並且順利的編譯成功之後,將打包完成的檔案放置在這個目錄當中。裡頭有包含了 x86_64, noarch.... 等等的次目錄。 /root/rpmbuild/SRPMS 與 RPMS 內相似的,這裡放置的就是 SRPM 封裝的檔案囉!有時候你想要將你的軟體用 SRPM 的方式釋出時, 你的 SRPM 檔案就會放置在這個目錄中了。此外,在編譯的過程當中,可能會發生不明的錯誤,或者是設定的錯誤,這個時候就會在 /tmp 底下產生一個相對應的錯誤檔,你可以根據該錯誤檔進行除錯的工作呢! 等到所有的問題都解決之後,也編譯成功了,那麼剛剛解壓縮之後的檔案,就是在 /root/rpmbild/{SPECS, SOURCES, BUILD} 等等的檔案都會被殺掉,而只剩下放置在 /root/rpmbuild/RPMS 底下的檔案了!
由於 SRPM 需要重新編譯,而編譯的過程當中,我們 至少需要有 make 與其相關的程式,及 gcc, c, c++ 等其他的編譯用的程式語言來進行編譯 ,更多說明請參考 第二十一章原始碼所需基礎軟體 吧。 所以,如果你在安裝的過程當中沒有選取軟體開發工具之類的軟體,這時就得要使用上一小節介紹的 yum 來安裝就是了! 當然,那個 "Development Tools" 的軟體群組請不要忘記安裝了!
嘗試將上個練習下載的 ntp 的 SRPM 軟體直接安裝到系統中 (不要編譯),然後查閱一下所有用到的目錄為何? # 1. 鳥哥這裡假設你用 root 的身份來進行安裝的行為喔! [root@study ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm Updating / installing... 1:ntp-4.2.6p5-19.el7.centos.1 ################################# [100%] warning: user mockbuild does not exist - using root warning: group mockbuild does not exist - using root # 會有一堆 warning 的問題,那個不要理它!可以忽略沒問題的! # 2. 查閱一下 /root/rpmbuild 目錄的內容! [root@study ~]# ll -l /root/rpmbuild drwxr-xr-x. 3 root root 39 Sep 8 16:16 BUILD drwxr-xr-x. 2 root root 6 Sep 8 16:16 BUILDROOT drwxr-xr-x. 4 root root 32 Sep 8 16:16 RPMS drwxr-xr-x. 2 root root 4096 Sep 9 09:43 SOURCES drwxr-xr-x. 2 root root 39 Sep 9 09:43 SPECS # 這個傢伙最重要! drwxr-xr-x. 2 root root 6 Sep 8 14:51 SRPMS [root@study ~]# ll -l /root/rpmbuild/{SOURCES,SPECS} /root/rpmbuild/SOURCES: -rw-rw-r--. 1 root root 559 Jun 24 07:44 ntp-4.2.4p7-getprecision.patch -rw-rw-r--. 1 root root 661 Jun 24 07:44 ntp-4.2.6p1-cmsgalign.patch .....(中間省略)..... /root/rpmbuild/SPECS: -rw-rw-r--. 1 root root 41422 Jun 24 07:44 ntp.spec # 這就是重點!如前一個小節的練習,我們知道在 /root/rpmbuild/SOURCES 裡面會放置原始檔 (tarball) 以及相關的修補檔 (patch file), 而我們也知道編譯需要的步驟大抵就是 ./configure, make, make check, make install 等,那這些動作寫入在哪裡呢? 就在 SPECS 目錄中啦!讓我們來瞧一瞧 SPECS 裡面的檔案說些什麼吧!
[root@study ~]# cd /root/rpmbuild/SPECS [root@study SPECS]# vim ntp.spec # 1. 首先,這個部分在介紹整個軟體的基本相關資訊!不論是版本還是釋出次數等。 Summary: The NTP daemon and utilities # 簡易的說明這個軟體的功能 Name: ntp # 軟體的名稱 Version: 4.2.6p5 # 軟體的版本 Release: 19%{?dist}.1 # 軟體的釋出版次 # primary license (COPYRIGHT) : MIT # 底下有很多 # 的註解說明! .....(中間省略)..... License: (MIT and BSD and BSD with advertising) and GPLv2 Group: System Environment/Daemons Source0: http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-%{version}.tar.gz Source1: ntp.conf # 寫 SourceN 的就是原始碼! Source2: ntp.keys # 原始碼可以有很多個! .....(中間省略)..... Patch1: ntp-4.2.6p1-sleep.patch # 接下來則是補丁檔案,就是 PatchN 的目的! Patch2: ntp-4.2.6p4-droproot.patch .....(中間省略)..... # 2. 這部分則是在設定相依屬性需求的地方! URL: http://www.ntp.org # 底下則是說明這個軟體的相依性, Requires(post): systemd-units # 還有編譯過程需要的軟體有哪些等等! Requires(preun): systemd-units Requires(postun): systemd-units Requires: ntpdate = %{version}-%{release} BuildRequires: libcap-devel openssl-devel libedit-devel perl-HTML-Parser BuildRequires: pps-tools-devel autogen autogen-libopts-devel systemd-units .....(中間省略)..... %package -n ntpdate # 其實這個軟體包含有很多次軟體喔! Summary: Utility to set the date and time via NTP Group: Applications/System Requires(pre): shadow-utils Requires(post): systemd-units Requires(preun): systemd-units Requires(postun): systemd-units .....(中間省略)..... # 3. 編譯前的預處理,以及編譯過程當中所需要進行的指令,都寫在這裡 # 尤其 %build 底下的資料,幾乎就是 makefile 裡面的資訊啊! %prep # 這部份大多在處理補丁的動作! %setup -q -a 5 %patch1 -p1 -b .sleep # 這些 patch 當然與前面的 PatchN 有關! %patch2 -p1 -b .droproot .....(中間省略)..... %build # 其實就是 ./configure, make 等動作! sed -i 's|$CFLAGS -Wstrict-overflow|$CFLAGS|' configure sntp/configure export CFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing -fno-strict-overflow" export LDFLAGS="-pie -Wl,-z,relro,-z,now" %configure \ # 不就是 ./configure 的意思嗎! --sysconfdir=%{_sysconfdir}/ntp/crypto \ --with-openssl-libdir=%{_libdir} \ --without-ntpsnmpd \ --enable-all-clocks --enable-parse-clocks \ --enable-ntp-signd=%{_localstatedir}/run/ntp_signd \ --disable-local-libopts echo '#define KEYFILE "%{_sysconfdir}/ntp/keys"' >> ntpdate/ntpdate.h echo '#define NTP_VAR "%{_localstatedir}/log/ntpstats/"' >> config.h make %{?_smp_mflags} # 不就是 make 了嗎! .....(中間省略)..... %install # 就是安裝過程所進行的各項動作了! make DESTDIR=$RPM_BUILD_ROOT bindir=%{_sbindir} install mkdir -p $RPM_BUILD_ROOT%{_mandir}/man{5,8} sed -i 's/sntp\.1/sntp\.8/' $RPM_BUILD_ROOT%{_mandir}/man1/sntp.1 mv $RPM_BUILD_ROOT%{_mandir}/man{1/sntp.1,8/sntp.8} rm -rf $RPM_BUILD_ROOT%{_mandir}/man1 .....(中間省略)..... # 4. 這裡列出,這個軟體釋出的檔案有哪些的意思! %files # 這軟體所屬的檔案有哪些的意思! %dir %{ntpdocdir} %{ntpdocdir}/COPYRIGHT %{ntpdocdir}/ChangeLog .....(中間省略)..... # 5. 列出這個軟體的更改歷史紀錄檔! %changelog * Tue Jun 23 2015 CentOS Sources <[email protected]> - 4.2.6p5-19.el7.centos.1 - rebrand vendorzone * Thu Apr 23 2015 Miroslav Lichvar <[email protected]> 4.2.6p5-19.el7_1.1 - don't step clock for leap second with -x option (#1191122) .....(後面省略).....要注意到的是 ntp.sepc 這個檔案,這是主要的將 SRPM 編譯成 RPM 的設定檔,他的基本規則可以這樣看:
我們來談一談幾個常見的 SRPM 設定段落:
剛剛你看到的就有底下這些重要的咚咚囉:
參數參數意義 Summary 本軟體的主要說明,例如上表中說明了本軟體是針對 NTP 的軟體功能與工具等啦! 本軟體的軟體名稱 (最終會是 RPM 檔案的檔名構成之一) Version 本軟體的版本 (也會是 RPM 檔名的構成之一) Release 這個是該版本打包的次數說明 (也會是 RPM 檔名的構成之一)。由於我們想要動點手腳,所以請將『 19%{?dist}.1 』 修改為『 20.vbird 』 看看 License 這個軟體的授權模式,看起來涵蓋了所有知名的 Open source 授權啊!! Group 這個軟體在安裝的時候,主要是放置於哪一個軟體群組當中 (yum grouplist 的特點!); 這個原始碼的主要官方網站; SourceN 這個軟體的來源,如果是網路上下載的軟體,通常一定會有這個資訊來告訴大家這個原始檔的來源! 此外,如果有多個軟體來源,就會以 Source0, Source1... 來處理原始碼喔! PatchN 就是作為補丁的 patch file 囉!也是可以有好多個! BuildRoot 設定作為編譯時,該使用哪個目錄來暫存中間檔案 (如編譯過程的目標檔案/連結檔案等檔)。 上述為必須要存在的項目,底下為可使用的額外設定值 Requires 如果你這個軟體還需要其他的軟體的支援,那麼這裡就必需寫上來,則當你製作成 RPM 之後,系統就會自動的去檢查啦!這就是『相依屬性』的主要來源囉! BuildRequires 編譯過程中所需要的軟體。Requires 指的是『安裝時需要檢查』的,因為與實際運作有關,這個 BuildRequires 指的是『編譯時』所需要的軟體,只有在 SRPM 編譯成為 RPM 時才會檢查的項目。上面幾個資料通常都必需要寫啦!但是如果你的軟體沒有相依屬性的關係時,那麼就可以不需要那個 Requires 囉! 根據上面的設定,最終的檔名就會是『{Name}-{Version}-{Release}.{Arch}.rpm』的樣式, 以我們上面的設定來說,檔名應該會是『ntp-4.2.6p5-20.vbird.x86_64.rpm』的樣子囉!
將你的軟體做一個簡短的說明!這個也是必需要的。還記得使用『 rpm -qi 軟體名稱 』會出現一些基礎的說明嗎? 上面這些東西包括 Description 就是在顯示這些重要資訊的啦!所以,這裡記得要詳加解釋喔!
pre 這個關鍵字原本就有『在...之前』的意思,因此這個項目在這裡指的就是『 尚未進行設定或安裝之前,你要編譯完成的 RPM 幫你事先做的事情 』,就是 prepare 的簡寫囉!那麼他的工作事項主要有:
在本案例中,你會發現程式會使用 patch 去進行補丁的動作啦!所以程式的原始碼才會更新到最新啊!
build 就是建立啊!所以當然囉,這個段落就是在談怎麼 make 編譯成為可執行的程式囉! 你會發現在此部分的程式碼方面,就是 ./configure, make 等項目哩!一般來說,如果你會使用 SRPM 來進行重新編譯的行為, 通常就是要重新 ./configure 並給予新的參數設定!於是這部份就可能會修改到!
編譯完成 (build) 之後,就是要安裝啦!安裝就是寫在這裡,也就是類似 Tarball 裡面的 make install 的意思囉!
這個軟體安裝的檔案都需要寫到這裡來,當然包括了『目錄』喔!所以連同目錄請一起寫到這個段落當中!以備查驗呢!^_^ !此外,你也可以指定每個檔案的類型,包括文件檔 (%doc 後面接的) 與設定檔 (%config 後面接的) 等等。
這個項目主要則是在記錄這個軟體曾經的更新紀錄囉!星號 (*) 後面應該要以時間,修改者, email 與軟體版本來作為說明, 減號 (-) 後面則是你要作的詳細說明囉!在這部份鳥哥就新增了兩行,內容如下:
%changelog * Wed Sep 09 2015 VBird Tsai <[email protected]>- 4.2.6p5-20.vbird - only rebuild this SRPM to RPM * Tue Jun 23 2015 CentOS Sources <[email protected]> - 4.2.6p5-19.el7.centos.1 - rebrand vendorzone ....(底下省略)....修改到這裡也差不多了,您也應該要瞭解到這個 ntp.spec 有多麼重要!我們用 rpm -q 去查詢一堆資訊時, 其實都是在這裡寫入的!這樣瞭解否?接下來,就讓我們來瞭解一下如何將 SRPM 給他編譯出 RPM 來吧!
要將在 /root/rpmbuild 底下的資料編譯或者是單純的打包成為 RPM 或 SRPM 時,就需要 rpmbuild 指令與相關選項的幫忙了!我們只介紹兩個常用的選項給您瞭解一下:
[root@study ~]# rpmbuild -ba ntp.spec <==編譯並同時產生 RPM 與 SRPM 檔案 [root@study ~]# rpmbuild -bb ntp.spec <==僅編譯成 RPM 檔案這個時候系統就會這樣做:
整個步驟大概就是這樣子!最後的結果資料會放置在 RPMS 那個目錄底下就對啦!我們這個案例中想要同時打包 RPM 與 SRPM , 因此請您自行處理一下『 rpmbuild -ba ntp.spec 』吧!
[root@study ~]# cd /root/rpmbuild/SPECS [root@study SPECS]# rpmbuild -ba ntp.spec .....(前面省略)..... Wrote: /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm Wrote: /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm Wrote: /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm Wrote: /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm Wrote: /root/rpmbuild/RPMS/x86_64/sntp-4.2.6p5-20.vbird.x86_64.rpm Wrote: /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm Wrote: /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.xZh6yz + umask 022 + cd /root/rpmbuild/BUILD + cd ntp-4.2.6p5 + /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-20.vbird.x86_64 + exit 0 [root@study SPECS]# find /root/rpmbuild -name 'ntp*rpm' /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm # 上面分別是 RPM 與 SRPM 的檔案檔名!您瞧!嘿嘿~有 vbird 的軟體出現了!相當有趣吧!另外,有些文件軟體是與硬體等級無關的 (因為單純的文件啊!),所以如上表所示, 你會發現 ntp-doc-4.2.6p5-20.vbird.noarch.rpm 是 noarch 喔!有趣吧!
這個就有趣了!我們自己來編輯一下自己製作的 RPM 怎麼樣?會很難嗎?完全不會! 我們這裡就舉個例子來玩玩吧!還記得我們在前一章談到 Tarball 與 make 時,曾經談到的 main 這個程式嗎?現在我們將這個程式加上 Makefile 後, 將他製作成為 main-0.1-1.x86_64.rpm 好嗎?那該如何進行呢?底下就讓我們來處理處理吧!
因為鳥哥的網站並沒有直接釋出 main-0.2,所以假設官網提供的是 main-0.l 版本之外,同時提供了一個 patch 檔案~ 那我們就得要這樣作:
接下來就是 spec 檔案的建立囉!
這個檔案的建置是所有 RPM 製作裡面最重要的課題!你必須要仔細的設定他,不要隨便處理!仔細看看吧! 有趣的是,CentOS 7.x 會主動的將必要的設定參數列出來喔!相當有趣! ^_^
[root@study ~]# cd /root/rpmbuild/SPECS [root@study SPECS]# vim main.spec Name: main Version: 0.1 Release: 1%{?dist} Summary: Shows sin and cos value. Group: Scientific Support License: GPLv2 URL: http://linux.vbird.org/ Source0: main-0.1.tgz # 這兩個檔名要正確喔! Patch0: main_0.1_to_0.2.patch %description This package will let you input your name and calculate sin cos value. %prep %setup -q %patch0 -p1 # 要用來作為 patch 的動作! %build make clean main # 編譯就好!不要安裝! %install mkdir -p %{buildroot}/usr/local/bin install -m 755 main %{buildroot}/usr/local/bin # 這才是順利的安裝行為! %files /usr/local/bin/main %changelog * Wed Sep 09 2015 VBird Tsai <[email protected]> 0.2 - build the program老實說,那個 spec 檔案建置妥當後,後續的動作就簡單的要命了!開始來編譯吧!
[root@study SPECS]# rpmbuild -ba main.spec .....(前面省略)..... Wrote: /root/rpmbuild/SRPMS/main-0.1-1.el7.centos.src.rpm Wrote: /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm Wrote: /root/rpmbuild/RPMS/x86_64/main-debuginfo-0.1-1.el7.centos.x86_64.rpm很快的,我們就已經建立了幾個 RPM 檔案囉!接下來讓我們好好測試一下打包起來的成果吧!
用很簡單的方式,就可以將自己的軟體或者程式給他修改與設定妥當!以後你就可以自行設定你的 RPM 囉!當然,也可以手動修改你的 SRPM 的來源檔內容囉!
[their] name=their server name baseurl=http://their.server.name/path/ enable=1 gpgcheck=0然後使用 yum 去安裝該軟體看看。