天天看點

軟體安裝 RPM , SRPM 與 YUM功能

軟體安裝 : RPM, SRPM,YUM功能

 雖然使用原始碼進行軟體編譯可以具有客制化的設定,但是對于Linux distribution的釋出商來說,則有軟體管理不易的問題,畢竟不是每個人都會進行原始碼編譯的,如果能

預先在相同的硬體與作業系統上面編譯好才釋出的話,可以讓相同的distribution具有完全一緻的軟體版本,管理比較友善,那就是RPM和YUM這兩個好用的東西啦!

之前提到利用廠商釋出的Tarball來進行軟體的安裝,不過,每次安裝前都要偵測作業系統與環境,設定編譯參數,實際的編譯,最後以個人的喜好來安裝軟體到定位安裝路徑

比較麻煩的過程,其實如果你的Linux系統和廠商的系統一樣的話,廠商編譯出來的執行檔,自然也就可以在我的系統上面運作了,通過廠商編譯好的可執行的軟體直接釋出給

使用者來安裝,類似和Windows的安裝方式,有程式開發者直接在已知的系統上面編譯好,再将該程式直接給使用者來安裝,如果在安裝的時候加上一些與這些程式相關的資訊

将其建立成為資料庫,那就可以安裝,反安裝,更新與驗證等等相關功能了,最常見的軟體管理者,分為RPM與DPKG,

兩大主流:RPM與DPKG

Linux開發商在固定的硬體平台與作業系統上面将需要安裝或更新的軟體編譯好,然後将相關檔案打包成一個特殊格式的檔案,這個檔案内包含預先偵測系統與相依軟體,并

提供記載該軟體提供的所有檔案資訊,最終将軟體檔案釋出,使用者得到後,隻要用特定的指令安裝,那個該軟體會依照内部的腳本來偵測相依的前驅軟體是否存在,安裝環境

符合要求,那就開始安裝,安裝後将該軟體的資訊寫入軟體管理機制中,最終以達成可以進行更新,移除等操作

無論DPKG與RPM這些機制或多或少都會有軟體屬性相依的問題,可以進行軟體檔案相依屬性的檢查,将相依屬性的資料做成清單,等到實際軟體安裝時,若發現問題則管

理機制透過相依資料屬性清單,管理機制自動去取得相依軟體來安裝,這樣就解決相依問題了,Linux開發商都有提供軟體線上更新的機制,原版CD光牒隻有第一次安裝時需要

用到,其他時候都是網絡來擷取開發商提供的任何軟體的,dpkg 管理機制上就開發出 APT 的線上更新機制,RPM 則依開發商的不同,有Red Hat系統的yum,

SuSE 系統的 Yast Online Update (YOU), Mandriva 的 urpmi 軟體

Red Hat/Fedora               RPM                         rpm, rpmbuild                   YUM (yum)

Debian/Ubuntu                DPKG                       dpkg                                   APT (apt-get)

RPM與SRPM

RPM是一種以資料庫記錄的方式來将你所需要的軟體安裝到你的Linux系統的一套管理機制,特點是将你要安裝的軟體先編譯過,并且打包成為RPM機制的包裝檔案,透過

包安裝的軟體裡頭預設的資料庫記錄,記錄這個軟體要安裝的時候必須具備的相依屬性軟體,當安裝的時候,RPM會先依照軟體裡頭的資料查詢Linux主機的相依屬性是否

滿足,若滿足則以安裝,那麼安裝的時候将該軟體的資訊寫入RPM資料庫中,以便未來查詢,驗證與反安裝,優點:

1. 由亍已經編譯完成并且打包完畢,是以軟體傳輸與安裝上很友善 (不需要再重新編譯);

2. 由亍軟體的資訊都已經記錄在 Linux 主機的資料庫上,很友善查詢、更新與反安裝

但是由于RPM檔案是已經包裝好的資料,裡面的資料已經都編譯完成了,該軟體檔案隻能安裝與原本預設的硬體與作業系統版本上,也就是不同的distribution 所釋出的 RPM

 檔案,并不能在其他的distributions 上使用,更有甚者,相同 distribution 的不同版本之間也無法互通

1. 軟體檔案安裝的環境必須與打包時的環境需求一緻或相當;

2. 需要滿足軟體的相依屬性需求;

3. 反安裝時需要特别小心,最底層的軟體不可先移除,否則可能造成整個系統的問題!

那如果真的想要安裝其他distributions 提供的好用的 RPM 軟體檔案時,可以用SRPM,也就是這個RPM檔案裡面含有原始碼,這個SRPM所提供的軟體内容沒有編譯過

他提供的是原始碼

通常 SRPM 的擴充名是以 ***.src.rpm 這種格式來命名的,與Tarball安裝的差異是,雖然SRPM的内容是原始碼,但是他也含有該軟體所需要的相關性軟體說明,以及

所有RPM檔案提供的資料,他與RPM不同的是,他也提供參數配置檔案(就是configure與makefile),SRPM安裝軟體時必須要有:

1 先将該軟體以 RPM 管理的方式編譯,此時 SRPM 會被編譯成為 RPM 檔案;

2 然後将編譯完成的 RPM 檔案安裝到 Linux 系統當中

SRPM需要重新編譯一次,是以我們就可以透過修改SRPM内的參數配置檔案,然後重新編譯産生适合我們Linux環境的PRM檔案了,如此,就可以将該軟體安裝到我們的系統

當中了,而不需與原作者打包的Linux環境相同了,

RPM               xxx.rpm                    可直接安裝                   已編譯                    不可修改參數并編譯

SRPM            xxx.src.rpm             不可直接安裝                未編譯之原始碼     可修改參數并編譯

xxxxxxxxx.rpm <==RPM 的格式,已經經過編譯且包裝完成的 rpm 檔案;

xxxxx.src.rpm <==SRPM的格式,包含未編譯的原始碼資訊。

rp-pppoe-3.1-5.i386.rpm檔案的意思依次是  軟體名稱     軟體的版本資訊      釋出的次數     适合的硬體平台     擴充名

RPM的優點:RPM是透過預先編譯并打包成為RPM檔案格式後,再加以安裝的方式,并且還能夠進行資料庫的記載,優點包含:

1. RPM 内含已經編譯過的程式與配置檔案等資料,可以讓使用者免除重新編譯的困擾;

2 RPM 在被安裝之前,會先檢查系統的硬碟容量、作業系統版本等,可避免檔案被錯誤安裝

3. RPM 檔案本身提供軟體版本資訊、相依屬性軟體名稱、軟體用途說明、軟體所含檔案等資訊,便于了解軟體;

4. RPM 管理的方式使用資料庫記錄 RPM 檔案的相關參數,便亍更新、移除、查詢與驗證

如果安裝的軟體沒有找到前驅軟體,那麼安裝好的軟體也就不法使用了,為了解決這個問題,RPM提供打包的軟體時,同時加入一些訊息登陸的功能,這些訊息包括軟體的

版本,打包軟體者,相依屬性的其他軟體,本軟體的功能說明,本軟體的所有檔案記錄,然後在Linux上面建立一個RPM軟體資料庫,這樣,在安裝某個軟體的時候,RPM

會去檢驗一下資料庫裡面是否已經存在相關的軟體了,如果資料庫顯示不存在,那麼這個RPM檔案就不能安裝,這就是RPM類型的檔案為人所诟病的軟體屬性相依問題

RPM 屬性相依的克服方式: YUM 線上更新

軟體的内容分為一般使用與開發使用 (development) 兩大類

pam-devel-x.x.rpm  為了重複利用既有的軟體功能,是以很多軟體都會以凼式庫的方式釋出部分功能,以友善其他軟體的呼叫應用, 例如 PAM 子產品的驗證功能

pam-x.x.rpm 大部分人都會安裝這個軟體的内容,為了節約使用者的資料量

RPM的相依性問題可以由YUM解決,YUM可以将相依屬性的軟體進行清單,在有要安裝軟體需求時,先找到這個清單,同時與系統内已安裝的軟體相比較,沒有安裝到的軟體

會一口氣同時進行安裝,那就能解決相依性的問題了。

CentOS 先将釋出的軟體放置到 YUM 朋務器内,然後分析這些軟體的相依屬性問題,将軟體内的記錄資訊寫下來,然後将這些資訊分析後記錄成軟體相關的清單,這些軟體

所在位置與清單資料可以稱呼為容器,用戶端有軟體安裝時,會向網絡上面的YUM伺服器的容器網址下載下傳清單清單,然後透過清單與本機RPM資料已存在的軟體資料相比較

,就能夠一口氣安裝所有需要具有相依屬性的軟體了,

當用戶端有更新、安裝的需求時, yum 會向容器要求清單的更新,等到清單更新到本機的 /var/cache/yum 裡面,等下更新時就會用到這個本機清單與本機的RPM資料庫進行

比較,這樣就知道下載下傳什麼軟體,接下來yum跑到容器伺服器下載下傳所需要的軟體,接着透過RPM的機制開始軟體的安裝,最後還是需要動用RPM的啦,容器的用意是因為原廠

的資料有原資料,更新資料,特殊資料,放置在不同過的容器網址,不會放置在一起,也就是不同的網址放置不同的軟體功能類型的意思

RPM 軟體管理程式: rpm

rpm可以輕松查詢到系統有沒有安裝某個軟體,以及知道rpm類型的檔案他們是将軟體的相關檔案放置在哪裡?還有,rpm的資料庫放置在哪裡?

rpm安裝的時候,會先去讀取檔案内記載的設定參數内容,然後将該資料用來比對Linux系統的環境,找到是否有屬性相依的軟體尚未安裝的問題,例如Openssh這個軟體

需要Openssl這個加密軟體的幫忙,是以Openssl才能裝openssh的意思,沒有openssl,就無法安裝openssh的意思,合格的話就開機安裝了,安裝完畢後,該軟體相關的

資訊就會被寫入/var/lib/rpm目錄下的資料庫檔案,這個目錄内的資料很重要,未來有任何軟體更新的需求,版本之間的比較來自于這個資料庫,想查詢系統已安裝的軟體

也是從這裡查詢的,目前的RPM也提供數字簽名資訊,這些數字簽名也是在這個目錄内記錄的,是以這個目錄不要删除

軟體安裝好的檔案安裝到的目錄包括:

/etc               一些配置檔案放置的目錄,例如 /etc/crontab

/usr/bin        一些可執行檔案案

/usr/lib         一些程式使用的動态凼式庫

/usr/share/doc     一些基本的軟體使用手冊與說明檔案

/usr/share/man    一些 man page 檔案

RPM 安裝 (install)

RPM隻有root的身份能夠執行,例如安裝rp-pppoe-3.5-32.1.i386.rpm 的檔案

本地安裝rpm -ivh package_name

-i :install 的意思

-v :察看更細部的安裝資訊畫面

-h :以安裝資訊列顯示安裝進度

一口氣安裝兩個以上的軟體時

本地安裝多個rpm包rpm -ivh a.i386.rpm b.i386.rpm *.rpm

直接由網絡上面的某個檔案安裝,以網址來安裝

rpm -ivh http://website.name/path/pkgname.rpm

如果在安裝的過程中發現問題,但是執意要安裝這個軟體時,需要用到如下的參數進行強制的安裝

--nodeps   當發生軟體屬性相依問題而無法安裝,但你執意安裝時

--replacefiles   覆寫安裝

--replacepkgs  重複安裝

--force                其實就是 --replacefiles 不 --replacepkgs 的綜合體!

--test                  要測試一下該軟體是否可以被安裝到使用者的 Linux 環境當中

--justdb             由亍 RPM 資料庫破損或者是某些緣故産生錯誤時,可使用這個選項來更新軟體在資料庫内的相關資訊

--nosignature   想要略過數字簽名的檢查時,可以使用這個選項

--prefix 新路徑  要将軟體安裝到其他非正規目錄,

--noscripts       不允許軟體在安裝的過程中自行執行某些系統指令

在沒有網絡的前提下,妳想要安裝一個名為 pam-devel 的軟體,妳手邊隻有原版CD光牒,該如何是好,可以透過挂載原版CD光牒來進行資料的查詢與安裝,将CD光牒挂載到/media

當中,并處理軟體的下載下傳

挂載CD光牒,使用: mount /dev/cdrom /media

找出檔案的實際路徑:find /media -name 'pam-devel*'

測試此軟體是否具有相依性: rpm -ivh pam-devel... --test

直接安裝: rpm -ivh pam-devel...

卸除CD光牒: umount /dev/cdrom

RPM更新與更新

指令是-Uvh 或者 -Fvh 來更新,,而 -Uvh 與 -Fvh 可以用的選項與參數,跟 install 是一樣,不過-U 與 -F的意義還是不太一樣的

-Uvh 後面接的軟體即使沒有安裝過,則系統将予以直接安裝; 若後面接的軟體有安裝過舊版,則系統自動更新至新版;

-Fvh 如果後面接的軟體并未安裝到你的 Linux 系統上,則該軟體不會被安裝;亦即隻有已安裝至你 Linux 系統内的軟體會被『更新』!

想要大量的更新系統舊版本的軟體,使用 -Fvh 則是比較好的作法,因為沒有安裝的軟體不會被補小心安裝進系統中,

整個作業系統的舊版軟體修補時,這麼進行:

1. 先到各發展商的 errata 網站或者是國内的 FTP 映像站捉下來最新的 RPM 檔案;

2. 使用 -Fvh 來将你的系統内曾安裝過的軟體進行修補與更新!

在不使用YUM功能的情況下,你可以到Centos的映射站台下載下傳updates資料,然後利用上述的方法來一口氣更新,當然,更新也可以使用--nodeps/--force 等等的參數

RPM 查詢 (query)

RPM查詢的時候,查詢的地方是/var/lib/rpm/ 這個目錄下的資料庫檔案,RPM也可以查詢未安裝的RPM檔案内的資訊

rpm -qa <==已安裝軟體

rpm -q[licdR]  已安裝的軟體名稱 <==已安裝軟體

rpm -qf 存在于系統上面的某個檔案名 <==已安裝軟體

rpm -qp[licdR] 未安裝的某個檔案名 <==查閱RPM檔案

查詢已安裝軟體的資訊

-q :僅查詢,後面接的軟體名稱是否有安裝;

-qa :列出所有的,已經安裝在本機 Linux 系統上面的所有軟體名稱; 

-qi :列出該軟體的詳細資訊 (information),包括開發商、版本不說明等; 

-ql :列出該軟體所有的檔案與目錄所在完整檔案名 (list); 

-qc :列出該軟體的所有配置檔案 (找出在 /etc/ 底下的檔名而已) 

-qd :列出該軟體的所有說明檔案 (找出與 man 有關的檔案而已) 

-qR :列出與該軟體有關的相依軟體所含的檔案 (Required 的意思) 

-qf :由後面接的檔案名,找出該檔案屬亍哪一個已安裝的軟體; 

查詢某個 RPM 檔案内含有的資訊: 

-qp[icdlR]:注意 -qp 後面接的所有參數以上面的說明一緻。但用途僅在于找出 某個 RPM 檔案内的資訊,而非已安裝的軟體資訊!注意!

查詢的部分都需要加上-q,查詢主要分為兩部分,一個是查已安裝到系統上面的軟體資訊,查詢這部分的資訊都是由 /var/lib/rpm/ 所提供,另一個則是由RPM檔案内找出一些

要寫入資料庫内的資訊,這部分就得使用-qp(p是package的意思),例如:

1.找出你的 Linux 是否有安裝 logrotate 這個軟體?rpm -q logrotate

2. 找出屬于該軟體所提供的所有目錄與檔案 rpm -ql logrotate(可以看出該軟體到底提供了多少的檔案與目錄,也可以追蹤軟體的資料)

3.列出 logrotate 這個軟體的相關說明資料  rpm -qi logrotate

4. 分别僅找出 logrotate 的配置檔案與說明檔  rpm -qc logrotate               rpm -qd logrotate

5. 若要成功安裝logrotate,需要執行rpm -qR logrotate  來查詢出安裝這個軟體需要什麼檔案的幫忙

rpm -qf /bin/sh 查詢出某個指令是由哪個軟體提供的

rpm -qpR filename.i386.rpm 查詢出某個RPM包的

查詢主機上以c開頭的軟體有哪些 rpm -qa | grep ^c | wc -l

查詢httpd這個軟體的所有配置檔案放置的地方 rpm -qc httpd 

如果忘記了某個軟體中的某個配置檔案哪裡修改過,想要重新安裝一次該軟體  rpm -ivh http://web.site.name/path/httpd-x.x.xx.i386.rpm --replacepkgs

如果誤删了某個重要檔案,例如/etc/crontab 又不曉得他屬于哪個軟體, 可以執行rpm -qf /etc/crontab來查詢是哪個檔案

RPM 驗證與數字簽名 (Verify/signature

驗證功能提供系統管理者一個有用的管理機制,,作用:使用/var/lib/rpm 底下的資料庫内容來比對目前Linux系統的環境下的所有軟體檔案,當你資料遺失,某個軟體的

檔案誤删了,不小心修改了某個軟體的檔案内容,用一個方法來驗證一下原本的檔案系統,可以查詢出到底修改了那些檔案資料

rpm -Va   列出目前系統上面所有可能被更動過的檔案

rpm -V 已安裝的軟體名稱   後面加軟體名稱,若該軟體所含的檔案被更動過,才會列出來

rpm -Vp 某個 RPM 檔案的檔名  後面加的是檔案名,列出該軟體内可能被更改過的檔案

rpm -Vf 在系統上面的某個檔案  列出某個檔案是否被更動過

Linux 内的 logrotate 這個軟體是否被更動過? rpm  -V  logrotate  沒有輸出的話,表示該軟體提供的檔案沒有被改動過 , 有輸出的話,才是有狀況

查詢一下,你的 /etc/crontab 是否有被更動過? rpm -Vf /etc/crontab 有改動過,是以才會列出更動過的資訊類型

輸出的資訊中再檔名之前有個c 然後是一堆文字,那個c代表的是configuration 就是配置檔案的意思 前面的八個資訊是:

S :(file Size differs) 檔案的容量大小是否被改變

M :(Mode differs) 檔案的類型或檔案的屬性 (rwx) 是否被改變?如是否可執行等參數已被改變

5 :(MD5 sum differs) MD5 這一種指紋碼的内容已經不同

D :(Device major/minor number mis-match) 裝置的主/次代碼已經改變

L :(readLink(2) path mis-match) Link 路徑已被改變

U :(User ownership differs) 檔案的所屬人已被改變

G :(Group ownership differs) 檔案的所屬群組已被改變

T :(mTime differs) 檔案的建立時間已被改變

如果所有的資訊都被更動過,就會顯示SM5DLUGT c filename

c :配置檔案 (config file)

d :檔案資料檔案 (documentation)

g :鬼檔案~通常是該檔案不被某個軟體所包含,較少發生!(ghost file)

l :許可證檔案 (license file)

r :自述檔案 (read me)

如果某個檔案被更動過,并且是非預期的,那麼可能被入侵了,一般來說 配置檔案被更動過是正常的,萬一你的binary program被更動過,那就要特别小心了

數字簽名

談完了軟體的驗證後,可以看出驗證隻能驗證軟體内的資訊與/var/lib/rpm裡面的資料庫資訊而已,如果該軟體檔案所提供的資料本身就是有問題的,那驗證是無法确定該軟體

的正确性的,可以使用和tarball驗證一樣的md5指紋碼來檢驗,萬一連指紋碼都被串改了的話,可以透過數字簽名來檢驗軟體的來源的

廠商所推出的軟體會有一個廠商自己的簽章系統,隻是這個簽章被數字化了,廠商可以通過數字簽名系統産生一個專屬于該軟體的簽章,并将該簽章的公鑰釋出,當你安裝

一個RPM檔案時:

1. 首先你必須要先安裝原廠釋出的公鑰檔案; 

2. 實際安裝原廠的 RPM 軟體時, rpm 指令會去讀取 RPM 檔案的簽章資訊,與本機系統内的簽章資訊比對,

3. 若簽章相同則予以安裝,若找不到相關的簽章資訊時,則給予警告并且停止安裝

采用的數字簽名系統為GUN計劃的GnuPG,GPG通過HASH算法算出獨一無二的專屬密鑰系統或者是數字簽名系統,這裡僅簡單的說明數字簽名在RPM檔案上的應用而已

是以在安裝軟體之前先要安裝原廠釋出的GPG數字簽名的公鑰檔案,數字簽名位于ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 檔案裡面是一堆随機數,

這個随機數對于數字簽名有意義而已,安裝方式:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

由于不同版本GPG密鑰檔案放置的位置可能不同,不過檔名大多是GPG-KEY,可以使用locate 或 find 來查找locate GPG-KEY或find /etc -name '*GPG-KEY*'

安裝完成之後,密鑰的呈現方式是pubkey作為軟體的名稱,先列出密鑰軟體名稱後,再以-qi的方式查詢看看該軟體的資訊

rpm -qa | grep pubkey

rpm -qi gpg-pubkey-e8562897-459f07a4

其實重要的是最後一串亂碼,那可以作為數字簽名非常重要的一環,如果忘記加上數字簽名,可能很多原版軟體就不能安裝了,除非利用rpm時選擇略過數字簽名的選項

PRM反安裝與重建資料庫

反安裝就是将軟體解除安裝啦,解安裝的過程是從最上層往下解除,以 rp-pppoe 為例,這一個軟體主要是依據 ppp 這個軟體來安裝,是以在解除ppp的時候,先要解除rp-pppoe

否則會出問題

移除的選項很簡單,就透過 -e 即可移除,經常發生軟體屬性相依導緻無法移除某些軟體的問題

找出與 pam 有關的軟體名稱,并嘗試移除 pam 這個軟體

rpm -qa | grep pam

執行删除時 rpm -e pam 會出現error,這時可能就是遇到了相依性的問題,若移除pam-devel這個之前範例安裝的軟體,因為不存在相依性是以不會出現任何資訊

rpm -q pam-devel 查詢會提示沒有安裝,表示已經解除安裝掉了

我們知道pam所提供的函數庫被很多其他軟體所使用,是以不能移除pam,除非其他相依軟體一口氣全部移除,加上--nodeps來強制删除的話,那麼用到pam函式庫的

軟體都無法運作了,你的主機就出現問題了,由于pam-devel是依附于pam的開發工具,你可以單獨安裝與單獨移除

由亍 RPM 檔案常常會安裝/移除/更新等,某些動作或許可能會導緻 RPM 資料庫 /var/lib/rpm/ 内的檔案破損,我們可以使用rebuilddb這個選項來重建一下資料庫

rpm --rebuilddb <==重建資料庫

SRPM 的使用 : rpmbuild

安裝SRPM的軟體時,如果想要修改SRPM裡面的原始碼的相關設定值,SRPM使用的是rpmbuild這個指令,

利用預設值安裝 SRPM 檔案 (--rebuid/--recompile)

SRPM檔案可以設定這個檔案内的原始碼與相關的設定值,也可以直接編譯并安裝,利用rpmbuild配合

--rebuild 這個選項将SRPM進行編譯于打包的動作,最後産生RPM的檔案,這個檔案可以用來安裝,請用絕對路徑來安裝

--recompile   這個動作會直接的『編譯』『打包』并且『安裝』rebuild僅編譯并打包,而recompile 不但進行編譯跟打包,還同時進行『安裝』了

這兩個選項都沒有修改過 SRPM 内的設定值,僅是再次編譯生成RPM可安裝軟體檔案而已,如果編譯動作順利,那麼編譯過程所産生的中間暫存盤都會被自動删除,

而發生任何錯誤,則中間檔案會被保留在系統上,等待使用者出錯動作,想要出錯或者更改SRPM的設定值時,就要知道利用SRPM的時候,系統會用到哪些重要的目錄

SRPM 使用的路徑與需要的軟體

SRPM既然含有source code 那麼其中一定有配置檔案,是以我們要知道SRPM編譯的時候用到哪些目錄,一般都是在/usr/src這個目錄下的,

/usr/src/redhat/SPECS  放置的是該軟體的配置檔案,軟體的資訊參數,設定項目

/usr/src/redhat/SOURCES 放置該軟體的原始檔案 (*.tar.gz 的檔案) 以及 config 這個配置檔案

/usr/src/redhat/BUILD  編譯的過程中的暫存的資料

/usr/src/redhat/RPMS 經過順利的編譯成功之後,将打包完成的檔案放置在這個目錄當中,裡面包含i386, i586, i686, noarch.... 等等的次目錄

/usr/src/redhat/SRPMS  與RPMS 内相似的,放置的就是SRPM封裝的檔案,有時候想要将你的軟體用SRPM方式釋出的話,你的SRPM就會放置在這個目錄中的

此外,在編譯的過程當中,發生錯誤,都會在 /tmp下産生一個相對應的錯誤檔,你可以根據該錯誤檔案進行出錯的工作,等到問題解決後,也編譯成功了,那麼剛剛解壓縮

之後的檔案,就是在/usr/src/redhat/SPECS, SOURCES, BUILD等等的檔案都會被殺掉,而隻剩下放置在 /usr/src/redhat/RPMS 底下的檔案了

SRPM需要重新編譯的話,就會用到make,gcc c c++ 等其他的編譯用的程式語言來進行編譯,可以先使用『 yum groupinstall "Development Tools" 』來安裝開發軟體

rpmbuild --rebuild rp-pppoe-3.5-32.1.src.rpm 重新編譯:

ll /usr/src/redhat/RPMS/i386/ 就會看到這個rpm包了,整個過程和Tarball方式差不多,也是編譯後變成binary program,接着再以RPM的機制封裝起來,若編譯正常則會看到

exit 0的字樣,且會主動的删除很多中間暫存檔的

配置檔案的主要内容 (*.spec)

除了利用SRPM内預設的參數來進行編譯之外,還可以修改這些參數後再重新編譯,首先要将SRPM内的的檔案放置到/usr/src/redhat/ 内的相關目錄,然後再去修改配置檔案

rpm -i rp-pppoe-3.5-32.1.src.rpm  過程不會顯示,會将SRPM的檔案解開後,放置到/usr/src/redhat/

find /usr/src/redhat/ -type f 會檢視到補訂檔,原始碼,配置檔案

rp-pppoe.spec就是那個重要的配置檔案  vi rp-pppoe.spec 記憶體放整個軟體的基本相關資訊,包括:

1.版本和釋出次數

2.相依屬性的内容

3.編譯前的預處理,以及編譯過程中所需要進行的指令

4.這個軟體釋出的檔案有哪些的意思,那些需要記錄在資料庫内

5.列出這個軟體的更改曆史記錄檔案

rp-pppoe.sepc 這個檔案,這是主要的将 SRPM 編譯成 RPM 的配置檔案

1. 整個檔案的開頭以Summary為開始,這部分的設定都是最基礎的說明内容;

2. 然後每個不同的段落之間,都以%來做為開頭,例如%prep與%install等;

系統整體資訊方面

rp-pppoe.sepc内的内容

Summary 本軟體是針對xDSL的撥接用途

Name 軟體名稱 最終會是RPM檔案的檔名構成之一

Verion 軟體版本  也會是 RPM 檔名的構成之一

Release 打包的次數  RPM 檔名的構成之一

License 軟體的授權模式 使用GPL

Group 這個軟體的發展團體名稱;

Url 這個原始碼的主要官方網站;

這個軟體的來源,如果是網絡上下載下傳的軟體,通常一定會有這個資訊來告訴大家這個原始檔的來源! 此外還有來自開發商自己提供的原始檔案資料,例如上面的 adsl-start 等程式。

Patch 就是作為更新檔的 patch file

BuildRoot 設定作為編譯時,該使用哪個目錄來暫存中間檔案 (如編譯過程的目标檔案/連結檔案等檔)。

ExclusiveArch 這個軟體的适合安裝的硬體,

上方是必須的,下方的是額外的設定值

1.Requires 這個軟體還需要其他的軟體支援,那麼這裡必須寫上,則當你制作成PRM之後,系統就自動的去檢查,這就是相依屬性的主要來源

2.Prereq 這個軟體需要的前驅程式,這個指的是程式   而requires指的是軟體

3.BuildRequires 編譯過程中所需要的軟體,Requires 指的是『安裝時需要檢查』的,因為與實際運作有關,這個BuildRequires 指的是『編譯時』所需要的軟體

隻有在 SRPM 編譯成為 RPM 時才會檢查的項目

4.這個軟體是經由誰來打包的呢?

5.Vender 發展的廠商.

如果沒有軟體相依性的關系時,那麼就可以不需要那個Requires,根據上面的設定,最終的檔名就是{Name}-{Version}-{Release}.{ExclusiveArch}.rpm的格式

檔名:『rp-pppoe-3.5-32.2.vbird.i686.rpm』

%description: 将你的軟體做一個簡短的說明,當使用rpm -qi軟體名稱的時候就可以檢視到的資訊,這裡記得要詳加解釋

%prep: 也就是在進行設定或安裝之前,你要編譯完成的RPM包,幫你先做的事情做的事情,

安裝之前的事情包括:

1. 進行軟體的更新檔 (patch) 等相關工作;

2. 尋找軟體所需要的目錄是否已經存在?确認用的!

3. 事先建立你的軟體所需要的目錄,或者事先要進行的任務;

4. 如果待安裝的Linux系統内已經有安裝的時候可能會被覆寫掉的檔案時,那麼就必須進行備份的工作了

%setup: 進行解壓縮的工作,這個項目一定要寫,不然你的tarball原始碼是無法被解壓縮的

%build: 談怎麼make編譯成為可執行的程式,你會發現在此部分的程式代碼方面,就是./configure make等項目

%install: 編譯與安裝完畢後,必須要将一些暫存在BuildRoot内的資料删除才好,是以這個時候這個clean的項目就重要了,有點像

make clean的感覺,

%files: 這個軟體安裝的檔案都需要寫到這裡來,包括目錄,連同目錄請一起寫到這個段落中,此外,你也可以指定每個檔案的類型

包括檔案檔(%doc後面接的)與配置檔案(%config後面接的)

%changelog: 這個項目主要記錄這個軟體曾經的更新記錄,*後面應該要以時間,修改者,email與軟體版本來做為說明 減号後面

則是你要做的詳細說明,

SRPM 的編譯指令 (-ba/-bb)

将在/usr/src/redhat 底下的資料編譯或者單純的打包成為RPM或SRPM時,就需要rpmbuild指令與相關選項的幫忙,

rpmbuild -ba rp-pppoe.spec <==編譯幵同時産生 RPM 與SRPM 檔案

rpmbuild -bb rp-pppoe.spec <==僅編譯成 RPM 檔案

這個時候系統會這樣做:

先進入BUILD這個目錄中,亦即是/usr/src/redhat/BUILD 這個目錄,接着依照*.spec檔案内的Name與Version定義出工作的目錄名稱

那舉系統就會在 BUILD 目錄中先删除 rp-pppoe-3.5 的目錄,再重建立立一個 rp-pppoe-3.5 的目錄,幵進入該目錄,在新的目錄裡面,針對在SOURCES

目錄下的來源檔案,也就是*.spec裡面的Source設定的那個檔案,以tar進行解壓縮,則會在 /usr/src/redhat/BUILD/rp-pppoe-3.5 當中

将 /usr/src/redhat/SOURCES/rp-pppoe-3.5.tar.gz 進行解壓縮,再開始 %build 及 %install 的設定與編譯,最後完成打包的檔案給放置到該去的地方,如果

硬體是386,最後編譯成功的 *.i386.rpm,檔案會被放置在 /usr/src/redhat/RPMS/i386裡面,如果是 i686 那就自然就是 /usr/src/redhat/RPMS/i686 目錄下

以上的結果就是将結果資料放置在RPMS 那個目錄底下,同時打包RPM與SRPM,可以使用rpmbuild -ba rp-pppoe.spec 

find /usr/src/redhat -name 'rp-pppoe*rpm'

結果中就會出現  /usr/src/redhat/SRPMS/rp-pppoe-3.5-32.2.vbird.src.rpm 這個檔案了

一個打包自己軟體的範例

制作原始碼檔案 tarball 産生

mkdir /usr/local/src/main-0.1  建立軟體的目錄

tar -zxvf main.tgz -C /usr/local/src/main-0.1 解壓縮

cd /usr/local/src/main-0.1  vim Makefile 建立原始碼所需make規則

LIBS = -lm

OBJS = main.o haha.o sin_value.o cos_value.o

main: ${OBJS}

gcc -o main ${OBJS} ${LIBS}

clean:

rm -f main ${OBJS}

install:

install -m 755 main $(RPM_INSTALL_ROOT)/usr/local/bin/main

# 記得 gcc與 rm之前是使用 <tab> 按鍵作出來的空白喔!

接着壓縮

[[email protected] src]# tar -zcvf main-0.1.tar.gz main-0.1

此時産生 main-0.1.tar.gz ,将他挪到 /usr/src/redhat/SOURCES 底下  cp main-0.1.tar.gz /usr/src/redhat/SOURCES

這個時候在 /usr/src/redhat 底下的原始碼就建立成功了!接下來就是 spec 檔案的建立

建立 *.spec 的配置檔案

cd /usr/src/redhat/SPECS    vim main.spec

Summary: calculate sin and cos value.

Name:

main

Version: 0.1

Release: 1

License: GPL

Group: VBird's Home

Source: main-0.1.tar.gz <==記得要寫正确的 Tarball 檔名喔!

Url:

http://linux.vbird.org

Packager: VBird

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

%description

This package will let you input your name and calculate sin cos value.

%prep

%setup -q

%build

make

%install

rm -rf %{buildroot}

mkdir -p %{buildroot}/usr/local/bin

make install RPM_INSTALL_ROOT=%{buildroot} <==這項目也徆重要!

%files

/usr/local/bin/main

%changelog

* Wed Jul 01 2009 VBird Tsai <[email protected]> 0.1

- build the program

編譯成為 RPM 與 SRPM

那個 spec 檔案建置妥當後,後續的動作就簡單,開始編譯 rpmbuild -ba main.spec

我們就已經建立了幾個 RPM 檔案,接下來讓我們好好測試一下打包起來的成果吧

rpm -ivh /usr/src/redhat/RPMS/i386/main-0.1-1.i386.rpm

rpm -qi main 檢視軟體的詳情

以上就可以将自己的軟體或者程式給他修改和設定,以後就可以自己設定你的RPM,也可以手動修改你的SRPM的來源檔案内容

YUM 線上更新機制

YUM根據分析RPM的标頭,根據軟體的相關性制作出屬性相依時的解決方案,自行處理軟體的相依屬性問題,以解決軟體安裝,移除,更新的問題

由于distribution必須要先釋放出軟體,然後将軟體放置與yum伺服器上面,以提供用戶端來要求安裝或更新,是以要使用yum的功能,

必須要找到合适的yum server才行,每個yum server可能提供許多不同的軟體功能,那就是容器,必須要前往yum server查詢到相關的容器

網址後,再繼續處理後續 的設定

Redhat已經釋放很多映像站提供軟體的更新之用,理論上隻要能夠連上Internet,就可以使用yum

利用 yum 進行查詢、安裝、更新與移除功能

yum的使用

查詢功能   yum [list|info|search|provides|whatprovides] 參數

yum [option] [查詢工作項目] [相關參數]

-y :當 yum 要等待使用者輸入時,這個選項可以自動提供 yes 的響應

--installroot=/some/path : 将該軟體安裝在/some/path而不使用預設路徑

查詢相關參數

search :搜尋某個軟體名稱或者是描述 (description) 的重要關鍵字;

list :列出目前 yum 所管理的所有的軟體名稱與版本,有點類似 rpm -qa;

info :同上,不過有點類似 rpm -qai 的執行結果;

provides:從檔案去搜尋軟體!類似 rpm -qf 的功能!

搜尋磁盤陣列 (raid) 相關的軟體有哪些,會輸出例如mdadm

找出mdadm這個軟體的功能  yum info mdadm

列出 yum 伺服器上面提供的所有軟體名稱   yum list

列出目前伺服器上可供本機進行更新的軟體有哪些  yum list updates

列出提供 passwd 這個檔案的軟體有哪些 yum provides passwd

yum list pam* 找出pam為開頭的軟體名稱,而其中尚未安裝的又有那些?

安裝/更新功能:yum [install|update] 軟體

install :後面接要安裝的軟體!

update :後面接要更新的軟體,若要整個系統都更新,就直接 update 即可

此時不需要将CD光牒mount之後進行安裝,隻要yum進行網絡安裝,

移除功能:yum [remove] 軟體

yum remove pam-devel  同樣的,也要解決相依性的問題

yum很簡單,不過yum畢竟是架構在rpm上面發展起來的,是以還是需要了解rpm的

yum 的配置檔案

yum的網絡安裝之前必須要選擇對的映像站台,提供 addons, centosplus, extras, fasttrack, os, updates 等容器,最好認的容器是os系統預設軟體

與updates軟體更新版本,

那個 os 再點進去就會得到如下的可提供安裝的網址  os/i386/

最重要的就是那個『 repodata 』的目錄,該目錄就是分析RPM軟體後産生的軟體屬性相依性放置處,是以,你要找到容器的網址時,最重要的就是

該網址底下有個名為repodata的目錄存在,那就是容器的網址,

vi /etc/yum.repos.d/CentOS-Base.repo

base 代表容器名稱,保證唯一性

name 說明容器的意義

mirrorlist 列出這個容器可以使用的映像站台

baseurl  容器的實際網址,mirrorlist 是由 yum 程式自行去捉映像站台,而baseurl則是指定固定的一個容器網址,我們剛剛找到的網址放到這裡來啦

enable=1:就是讓這個容器被啟動

gpgcheck=1:還記得 RPM 的數字簽名嗎?這就是指定是否需要查閱 RPM 檔案内的數字簽名

gpgkey=:就是數字簽名的公鑰檔案所在位置!使用預設值即可

建立出自己的YUM設定

[[email protected] ~]# vi /etc/yum.repos.d/CentOS-Base.repo

[base]

name=CentOS-$releasever - Base

baseurl=http://ftp.twaren.net/Linux/CentOS/5/os/i386/

gpgcheck=1

gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

# 底下其他的容器項目,請自行到高速網絡中心去查詢後自己處理!

修改容器産生的問題與解決之道

應該要在 /etc/yum.repos.d/ 底下建立一個檔案,檔名必須是.repo才行,但因為我們使用的是指定特定的映射站台,而不是其他軟開發提供的容器

yum 會先下載下傳容器的清單到本機的 /var/cache/yum 裡面去,那我們修改了網址卻沒有修改容器名稱 (中刮号内的文字)

可能就會造成本機的清單與 yum伺服器的清單不同步,是以先要清除掉本機上面的舊資料,執行yum clean [packages|headers|all]

packages:将已下載下傳的軟體檔案删除

headers :将下載下傳的軟體檔案頭删除

all :将所有容器資料都删除!

删除已下載下傳過的所有容器的相關資料 (含軟體本身與清單)

yum 的軟體群組功能

yum [群組功能] [軟體群組]

grouplist :列出所有可使用的『套件組』,例如 Development Tools 之類的;

groupinfo :後面接 group_name,則可了解該 group 内含的所有套件名

groupinstall:這個好用!可以安裝一整組的套件群組,相當的不錯

groupremove :移除某個套件群組;

在安裝Centos的時候,提供選擇需要的軟體,那些軟體利用 GNOME/KDE/X Window ... 之類的名稱存在,其實就是軟體群組

yum groupinfo XFCE-4.4 列出這個群組的資訊

yum groupinstall XFCE-4.4  群組安裝

全系統自動更新

透過 crontab 的功能來處理,

vim /etc/crontab

0 3 * * * root /usr/bin/yum -y update

管理的抉擇:RPM 還是 Tarball

1 優先選擇原廠的RPM功能

由于原廠釋出的軟體通常具有一段時間的維護期,RHEL與Centos每個版本至少提供5年的更新期限,由于yum可以自動更新,保證了

自己軟體的最新狀态,資安當然比較好,并且同時提供軟體的查詢和驗證功能,安裝時提供數字簽名的保護,當然首選RPM

2. 選擇軟體官網釋出的 RPM 或者是提供的容器網址

舉例Centos不提供NTFS的相關子產品,此時可自己去官網找到系統的RPM檔案,如果有提供容器網址,那就更好,可以修改yum配置檔案

來加入該容器,就能夠自動安裝與更新軟體

3. 利用 Tarball 安裝特殊軟體

有些軟體不會幫你制作RPM檔案,建議你如果多台機器需要安裝此軟體,建議将其制作成RPM就有價值了,否則直接使用tarball來安裝即可,不需要特别搜尋RPM

4. 用 Tarball 測試新版軟體:

某些時刻需要使用新版的某個軟體,但是原廠商提供舊的軟體,但是你又需要新軟體的功能,那麼又怕軟體安裝後,回不到舊軟體

此時可以用tarball安裝新軟體到/usr/local底下,那麼該軟體就可以同時安裝兩個版本在你的系統上面了,而且大多數軟體安裝數鐘版本

還不會互相幹擾,用來測試新軟體是很不錯的,隻是你就得知道你使用的指令是新版軟體還是舊版軟體

RPM 與 Tarball 各有其優缺點,不過,如果有 RPM 的話,那麼優先權還是在于 RPM 安裝上面,畢竟管理上比較便利,但是如果軟體的架構差異性太大

或者無法解決相依性的問題,不要化大量時間解決屬性相依性的問題上,還不如直接以tarball來安裝。

繼續閱讀