在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 => (0x00007fff62df0000) </code><code># 指程式的起始入口</code>
<code> </code><code>libc.so.6 => </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,如需轉載請自行聯系原作者