天天看點

Linux軟體包的管理--RPM包管理器

    在Linux中如何安裝、更新、解除安裝軟體,是我們日常運維中重要的組成部分。接下來一CentOS6系統為例,講解如何使用 RPM 包管理器,yum包管理器以及源碼的方式來管理我們的軟體包。

一、相關的背景知識

    許多程式的源程式,例如使用C語言編寫的源代碼,要經過預處理,編譯,彙編,連結才能生成真正的可執行程式(二進制),才可以使用。為了簡化這樣的過程,就出現了所謂的包管理器。它出現的目的是:将編譯好的程式打包成一個檔案或有限的幾個檔案,可用于實作安裝、解除安裝、更新、查詢等功能。

    一個包管理器應該具有如下組成部分:

    1、資料庫:這裡面包括了 軟體名、版本、依賴關系、功能描述、安裝生成的各檔案的路徑、和校驗軟體來源和資料完整性的校驗碼。

    2、程式的組成清單:這裡最主要的是軟體在安裝、解除安裝前後所運作的腳本。

    安裝程式的時候為什麼會出現依賴性?

    由于Linux的程式或者說是工具都是由其他小程式或小工具組成,這是Linux的特性之一。正是由于這個特性決定了我們在安裝一個軟體包的時候,可能會依賴其他程式的庫檔案和頭檔案。

1

2

3

4

5

<code># 在Linux中使用 ldd 指令來檢視一個二進制程式(可執行檔案)遵循EIF格式</code>

<code>[root@server ~]</code><code># ldd `which pwd`</code>

<code>    </code><code>linux-vdso.so.1 =&gt;  (0x00007fff62df0000)   </code><code># 指程式的起始入口</code>

<code>    </code><code>libc.so.6 =&gt; </code><code>/lib64/libc</code><code>.so.6 (0x0000003508400000)</code>

<code>    </code><code>/lib64/ld-linux-x86-64</code><code>.so.2 (0x0000003507c00000)</code>

    程式包一般都包括:二進制程式,庫檔案,配置檔案,幫助檔案這些資訊。

二、RPM包管理器  

    在CentOS中的包管理器是RPM(RPM is Package Manager),具有上面包管理的組成和功能。

1、RPM包命名格式

    所有的RPM封包件都是以.rpm結尾的。具體的命名格式:

    name-version-relase.arch.rpm 

字段

含義

name

程式名

version

程式源碼編号。分别代表主版本号,副版本号,發行号

release

rpm自身的發行号,與程式源碼的發行号無關,僅用于辨別對 rpm包不同制作的修訂;同時,release還包含此包适用的OS

arch

适用于的硬體平台,主要有:i386, i486, i586, i686,x86_64,powerpc,noarch(依賴于虛拟機)

    例如:bash-4.2.3-3.centos6.x86_64.rpm

2、rpm包的合法性驗正

    包制作者制作完成之後會附加數字簽名于包上;驗證主要包括 來源合法性、包的完整性。

    具體原理:

    包的制作者使用單向加密提取原始資料的特征碼,而後使用自己的私鑰加密這段特性碼,附加原始資料後面。通過數字證書的方式驗證來源合法性,通過提取驗證碼是否正确來判斷完整性問題。

    驗正過程:

    前提:必須有可靠機制擷取到包制作者的公鑰;

    1、使用制作者的公鑰解密加密的特征碼,能解密則意味着來源合法;

    2、使用與制作者同樣的意向加密算法提取原始資料的特征碼,并與解密出來的特征作比對,相同,則意味着完整性沒問題;

3、RPM分包管理

    試想一下,例如:一個程式總共有50個小功能,難道在打包的時候都打包到一個檔案中去嗎? 如果是這樣,我們僅用到其中的5,6個功能,卻安裝了50個包,造成了空間浪費。是以,RPM包提供了分包的功能,從一定程度上解決了這個問題。

    一般是有一個主包,提供基本功能;其他功能分别打包成不同的封包件來使用。

三、RPM包管理器的使用

    RPM包管理器都是使用rpm指令(前端工具)來實作的,下面從不同角度介紹此指令的常用選項。

1、安裝程式包

    以安裝 lftp 來示例。

<a href="http://s3.51cto.com/wyfs02/M02/3F/74/wKioL1PJKJCDjwemAADuu4koEaY063.jpg" target="_blank"></a>

    當然在安裝過程中沒有出現依賴關系,如果出現依賴關系,則需要安裝依賴軟體包。

    --test:此時軟體是否可以安裝

<a href="http://s3.51cto.com/wyfs02/M02/3F/74/wKiom1PJKFyxRxNSAAC8oh9QC-c192.jpg" target="_blank"></a>

    重新安裝:--replacepkgs 如果原有配置檔案作了修改,很有可能不執行替換,而是将應該安裝生成的配置檔案重命名為 .rpmnew

    如果依賴于其它包:1、解決依賴關系;2、忽略依賴關系能安裝上,但有可能無法運作;使用--nodeps 參數。rpm -ivh --nodeps 軟體封包件名

2、解除安裝程式包

    常用用法:rpm -e package_name

<a href="http://s3.51cto.com/wyfs02/M01/3F/74/wKiom1PJKrThdLorAADaxSjmdtw951.jpg" target="_blank"></a>

    如果被其它包所依賴:1、将依賴于此包的所有包一并解除安裝;2、忽略依賴關系能解除安裝,但依賴于此包程式包可能會運作不正常,使用 --nodeps 參數。

    如果包的配置檔案安裝後曾被改動過,解除安裝時,此檔案将不會解除安裝,而是被重命名并保留

3、更新軟體包

    用法:rpm -Uvh | -Fvh /path/to/package_file

    1、更新或安裝

        -Uvh:如果軟體包不存在則安裝,如果存在則更新。

    2、純更新

        -Fvh:如果軟體包不存在則什麼都不幹,如果存在則更新。

    如果有時候更新有問題,則可以使用 --force: 強制更新。

    注意:不應該對核心執行更新操作,而是安裝。因為系統允許多核心并存,是以萬一更新失敗,還可保證系統不出現問題。

4、查詢功能

    rpm的查詢功能可能是我們在軟體包管理方面使用最多的。

1)對已安裝的軟體

    -q:查詢軟體包是否安裝

    -qa:查詢系統已安裝的包

<a href="http://s3.51cto.com/wyfs02/M02/3F/76/wKioL1PJNTiDF52hAAH6qJmHWHw543.jpg" target="_blank"></a>

    -qi:查詢包的描述資訊

<a href="http://s3.51cto.com/wyfs02/M01/3F/76/wKioL1PJN8-DL7YsAAJENh0tPyk938.jpg" target="_blank"></a>

     -ql:列出軟體包所安裝的所有檔案

<a href="http://s3.51cto.com/wyfs02/M00/3F/76/wKioL1PJNWCg9RwzAAKpX-s3s7w652.jpg" target="_blank"></a>

    -qc:列出軟體包所安裝的配置檔案

    -qd:列出軟體包所安裝的幫助文檔

<a href="http://s3.51cto.com/wyfs02/M02/3F/76/wKiom1PJNJCBbYU_AAIxWKJDBEc841.jpg" target="_blank"></a>

    -q --scripts:查詢軟體安裝時所執行的腳本

<a href="http://s3.51cto.com/wyfs02/M01/3F/76/wKioL1PJNdjwmka_AAEB5g6zVrs133.jpg" target="_blank"></a>

    -qf:查詢某檔案是由哪個包安裝生成的

<a href="http://s3.51cto.com/wyfs02/M00/3F/76/wKiom1PJNQaRfoSZAABvsxeLJTA142.jpg" target="_blank"></a>

2)對未安裝的軟體

    查詢功能和已安裝的一樣,隻是加入-p選項。

    -pq -pqi -pql -pqd -pqc 等參數,同上述功能。

5、校驗

    用于檢查包安裝生成的檔案屬性是否發生變化

    rpm -V package_name 

6

7

8

9

10

11

12

<code>[root@server Packages]</code><code># rpm -V lftp</code>

<code>S.5....T.  c </code><code>/etc/lftp</code><code>.conf</code>

<code># 常見屬性如下:如果某屬性無變化,則顯示為.</code>

<code># S file Size differs</code>

<code># M Mode differs (includes permissions and file type)</code>

<code># 5 digest (formerly MD5 sum) differs</code>

<code># D Device major/minor number mismatch</code>

<code># L readLink(2) path mismatch</code>

<code># U User ownership differs</code>

<code># G Group ownership differs</code>

<code># T mTime differs</code>

<code># P caPabilities differ</code>

6、rpm包來源合法性及完整性檢驗:

    前提:在目前系統上導入包的制作者的公鑰

    導入:rpm --import /path/to/key_file

    # rpm -qa gpg-pubkey*

    顯示所有已經導入的gpg格式的公鑰

    # rpm -qi gpg-pubkey-NAME

    顯示公鑰的詳細資訊

<a href="http://s3.51cto.com/wyfs02/M02/3F/76/wKioL1PJOyayLiyoAAYyn70ZR7k688.jpg" target="_blank"></a>

    檢查包:安裝過程中會自動執行

    手動檢查:

<code># 完整性和合法性檢查</code>

<code>[root@server Packages]</code><code># rpm -K lftp-4.0.9-1.el6.x86_64.rpm </code>

<code>lftp-4.0.9-1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK</code>

<code># 不檢查來源合法性:</code>

<code>[root@server Packages]</code><code># rpm -K --nosignature lftp-4.0.9-1.el6.x86_64.rpm</code>

<code>lftp-4.0.9-1.el6.x86_64.rpm: sha1 md5 OK</code>

<code># 不檢查包完整性</code>

<code>[root@server Packages]</code><code># rpm -K --nodigest lftp-4.0.9-1.el6.x86_64.rpm</code>

<code>lftp-4.0.9-1.el6.x86_64.rpm: rsa (md5) pgp OK</code>

7、資料庫重建

    資料庫目錄:/var/lib/rpm

<a href="http://s3.51cto.com/wyfs02/M00/3F/76/wKiom1PJO_6gQhgaAALlStB-b-I140.jpg" target="_blank"></a>

    rpm --initdb:初始化,如果事先沒有庫,會建立一個;如果有,則不建立;

    rpm --rebuilddb: 直接重建,覆寫原有的資料庫

    總結:個人感覺RPM在安裝軟體包是使用不多,一般使用查詢功能居多。

本文轉自 羊木狼 51CTO部落格,原文連結:http://blog.51cto.com/guoting/1440066,如需轉載請自行聯系原作者