天天看點

linux軟體包管理之一(rpm包管理)

開場白

1、軟體的安裝解除安裝是很平常的事情,但是在linux上面卻也這麼的不簡單。Linux的其中一個哲學思想就是 一個程式隻做一件事,并且做好。 組合小程式來完成複雜任務。這樣做有很多好處。但世界上的東西總是兩面的,有得必有失。各個小程式之間往往會存在着複雜的依賴關系。

2、再往前走一步。軟體最初的安裝方式隻有一種,那就是源代碼編譯安裝,這種方式安裝的軟體更貼近本機的系統運作環境,但也更複雜。不僅要解決軟體之間的依賴關系(所依賴的軟體還要再編譯安裝),還要配置開發編譯環境(可能會抓狂的),一切都完成了以後還要指定各種的編譯參數,而且編譯所耗費的時間也比較長。在問題出現的時候,總是有些人或組織來為我們解決問題。是以這時就有了包管理器,如redhat系的rpm,debian系的dpt,dpkg。

3、包管理器為我們解決了編譯的問題,使用起來非常的快捷。但就像我們第一段所說的,依賴關系還是存在的,雖然簡單了很多,但還是會發生幾個小時過去還沒有安裝上軟體的情況發生。那麼包管理器的前端工具就又出現了,它會為我們自動解決依賴關系,從此安裝軟體變的簡單多了。

4、雖說前端工具貌似可以解決所有問題,但在我們使用系統的過程中,它也是有局限性的。源代碼安裝也是很常用到的,但前端工具可以很簡單的解決開發環境和依賴關系的問題。

目錄:

一、rpm包管理器

1、程式包簡介。

2、rpm包管理器。

3、rpm指令的使用。

二、yum使用

三、源代碼安裝軟體

實驗環境:

系統:CentOS_7.1

rpm版本:RPM version 4.11.1

yum版本:3.4.3

一、rpm包管理器。

rpm 是redhat的軟體包管理器。全稱為:redhat package manager。成為工業标準以後的全稱為:rpm is package manager。它的軟體包字尾也為.rpm。

debian 的軟體包管理工具為dpt,dpkg,  軟體包字尾為.deb。

S.u.S.E的軟體包管理器也是使用的redhat的rpm。隻不過因為打包路徑的不同,是以并不通用。

程式包管理器分為兩個部分:包管理工具和打包的檔案。管理工具後面再說,我們先來看一下程式包所包含的東西:

  1. 編譯好的二進制程式檔案。
  2. 配置檔案。
  3. 幫助文檔。
  4. 編譯好的二進制庫檔案。

程式包還有一種拆包的概念:

源代碼安裝時可以指定功能,但程式包都是别人或組織以大衆需求進行編譯而成的,為了避免安裝一堆用不到的功能,是以常常是不同功能的檔案打包在不同的包内。以主包為基準包含主要的功能,後面就是各種不同的支包(開發包,庫包,工具包等等)。

如以bind為例:

bind 主包;bind-devel 開發包;bind-libs 庫包;bind-utils 工具包。

rpm包命名方式:

源代碼: name-version.tar.{gz|bz2|xz}   注意是源代碼包的命名方式。

VERSION: major.minor,release

major主版本           重大的版本分支

minor 次版本          其中的一個功能有了重大變化,而不是所有的變化

release 發行号。     修正了某個BUG,修正了某一段代碼。

RPM格式:

name-VERSION-relese.arch.rpm

version: 這是源代碼的版本。就是上面的majob,minor,release。

release.arch:打包版本号。rpm的發行号。

arch(archetecture)是硬體架構或系統的平台類型。

如: bash-4.3.2-2.e16.x86_64.rpm   

4.3.2是程式版本号 ,2.el6是release(2是rpm的打包版本,el6是軟體平台),後面的x86_64是硬體平台。

硬體架構平台常用到的。

x86_64

i386, i586, i686, 都是x86系列的,新點或舊點。一般都彼此相容。

ppc

noarch  代表通用硬體平台,如解釋型語言寫的程式。

擷取程式包的途徑:

(1) 系統發行版的CD光牒或官方的檔案伺服器(或鏡像站點):

            http://mirrors.aliyun.com,

            http://mirrors.sohu.com,

            http://mirrors.163.com

(2) 項目的官方站點

(3) 第三方組織:

            (a) EPEL

            (b) 搜尋引擎

                http://pkgs.org

                http://rpmfind.net

                http://rpm.pbone.net

 (4) 自已動手制作。

來源合法性驗正:

不能随意安裝來路不明的軟體包。 源碼包也一樣。

源程式: 通過md5或sha1校驗碼驗證;

rpm包: 發行商提供的合法性一定要是可信的     

驗正包完整性: 校驗碼

驗正來源合法: 公鑰驗證來源是正确的。

一定要找合法的來源管道, 不要在google上随便找一個就用。

驗正方法,我們下面會說到。

2、程式包管理器

功能:将編譯好的應用程式的各組成檔案打包成一個或幾個程式封包件,進而更友善地實作程式包的安裝、更新、解除安裝和查詢等管理操作;

1、程式包的組成清單(每個程式包都單獨實作);

                檔案清單

                安裝或解除安裝時運作的腳本

2、資料庫(公共)

                程式包的名稱和版本;

                依賴關系;

                功能說明;

                安裝生成的各檔案的檔案路徑及校驗碼資訊;

                等等等

包管理基本功能:打包、安裝、查詢、更新、解除安裝、校驗、資料庫管理   

rpm的所有管理功能都是建立在資料庫上面的,是以rpm資料庫是非常重要的。 如果不小心給弄沒了,可以找台軟體包安裝相近的機器,複制一份。rpm自帶的生成資料庫的指令不一定有用。        

Centos上的rpm資料庫位置/var/lib/rpm/

3、rpm指令的使用:

rpm  [OPTIONS]  [PACKAGE_FILE]

     安裝:-i, --install

     更新:-U, --update, -F, --freshen

     解除安裝:-e, --erase

     查詢:-q, --query

     校驗:-V, --verify

     資料庫維護:--builddb, --initdb

rpm在man文檔各個功能都是不同的部分,我們這裡也按不同的部分分開來說,文檔中的GENERAL OPTIONS是穿插在所有功能中的。

1、安裝

rpm {-i|--install} [install-options] PACKAGE_FILE ...      

最常用到的組合: rpm -ivh PACKGE_FILE

常用到的選項:

[GENERAL OPTIONS]:

-v:verbose,詳細資訊

-vv:更詳細的輸出             

[install-options]:

-h:hash marks輸出進度條;每個#表示2%的進度;

--test:測試安裝,檢查并報告依賴關系及沖突消息等;

--nodeps:忽略依賴關系;不建議;

--replacepkgs:重新安裝

--noscripts 安裝或解除安裝時不運作rpm包自帶的以下四種腳本。

--nopre 不運作安裝過程之前要運作的腳本。

--nopost 不運作安裝過程完成之後要運作的腳本。

--nopreun 不運作解除安裝過程開始之前要運作的腳本。

--nopostun 不運作解除安裝過程完成之後要運作的腳本。

注意:rpm可以自帶腳本;

四類:--noscripts

preinstall:安裝過程開始之前運作的腳本,%pre , --nopre

postinstall:安裝過程完成之後運作的腳本,%post , --nopost

preuninstall:解除安裝過程真正開始執行之前運作的腳本,%preun, --nopreun

postuninstall:解除安裝過程完成之後運作的腳本,%postun , --nopostun

可以把src的rpm包解開以後,檢視它的sepc檔案,其中一部分以%pre,%post之類開頭的腳本段。

--nosignature:不檢查包簽名資訊,不檢查來源合法性;

--nodigest:不檢查包完整性資訊;

最常用到的恐怕就是ivh了。安裝,顯示詳細資訊,以#号顯示過程。

[root@localhost ~]# rpm -ivh zsh-5.0.2-7.el7_1.2.x86_64.rpm 
warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:zsh-5.0.2-7.el7_1.2              ################################# [100%]
[root@localhost ~]#      

--test隻是用來測試安裝,不會真的安裝。用來檢測依賴關系或其它問題。隻執行到上面的例子中的Preparing階段。

--nodeps 忽略依賴關系,如果依賴的僅僅是一些文檔類的包,倒也可以用。

--replacepkgs 重新安裝,不會覆寫已有的配置檔案。如果想完全的重新安裝,最好是先解除安裝再安裝。

腳本的作用,如安裝之前建立要用到的使用者和目錄,安裝之後設定權限,解除安裝之前保證環境,解除安裝之後清理檔案等等。

包的簽名資訊和合法性,是基于包自帶的簽名和制做者的公鑰來實作的。在沒有導入制作者公鑰之前就會報上面例子中第一行的錯誤。我們加上—nosignature試一下:

[root@localhost ~]# rpm -ivh --nosignature zsh-5.0.2-7.el7_1.2.x86_64.rpm 
Preparing...                          ################################# 
[100%]
Updating / installing...
   1:zsh-5.0.2-7.el7_1.2              
################################# [100%]
[root@localhost ~]#      

注意隻加--nodigest是沒有效果的,因為包完整性是基于軟體包的指紋資訊,而沒有公鑰之前是得不到指紋資訊的。是以還是會報沒有KEY的錯誤。

大家都知道非對稱密鑰吧,以一種算法計算得出私鑰,然後再從私鑰中得出公鑰。

以私鑰加密的檔案隻能用公鑰解密,而以公鑰加密的檔案則隻能用私鑰解密。

這裡解釋一下rpm包是如何做到這種驗證的。

首先軟體包在剛開始,會以單向加密計算出軟體包的校驗嗎。校驗嗎就相當于一個檔案或一些資料的指紋資訊,基本上可以完全做到唯一的标示一個檔案,隻要程式包發生一丁點的變化,加密得出的校驗碼就是完全不同的。

linux軟體包管理之一(rpm包管理)

然後制作者會以一些算法(如RSA)生成自己的私鑰和公鑰,再以自己的私鑰把特征碼加密,也就形成了簽名資訊。隻有制作者的公鑰可以解密此簽名資訊。

linux軟體包管理之一(rpm包管理)
linux軟體包管理之一(rpm包管理)

而因為一對的公鑰和私鑰隻能互相解密,是以隻要拿到制作者的公鑰,可以對簽名解密,也就證明了軟體包的來源合法性。 因為如果是另外的人加密的,用這個公鑰是無法解開的。

把簽名解開以後也就得到了程式包的特征嗎。 此時就可以用相同的單相加密計算出程式包的特征碼。隻要與從簽名解開的特征碼一樣,也就證明了程式包的完整性。

linux軟體包管理之一(rpm包管理)

大體上就是從能否解開簽名資訊而知道程式包是否正确。 從特證碼知道程式包是否缺損。

所有的操作都依賴與公鑰是正确的,這也就是CA的功能了,不過我們的程式包還用不到用CA來保證公鑰的正确性。

導入制作者公鑰:

擷取并導入信任的包制作者的密鑰:

對于CentOS發行版來說,安裝完系統以後 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7,或是CD光牒根目錄裡面的RPM-GPG-KEY-CentOS-7。centos6也一樣,隻不過7是6而已。           

驗正:

(1) 安裝此組織簽名的程式時,會自動執行驗正;

(2) 手動驗正:rpm -K PACKAGE_FILE

使用:rpm --import 公鑰檔案  來導入公鑰。

在CentOS7上面還可以用rpmkeys --import指令,而且man文檔中就是rpmkeys指令。

rpmkeys --import PUBKEY ...

rpmkeys {-K|--checksig} PACKAGE_FILE ...

[root@localhost cdrom]# rpmkeys --import RPM-GPG-KEY-CentOS-7
[root@localhost cdrom]# rpm -ivh Packages/zsh-5.0.2-7.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:zsh-5.0.2-7.el7                  ################################# [100%]
[root@localhost cdrom]#      

可以看到現在沒有報任何錯誤。

[root@localhost ~]# rpm -K zsh-5.0.2-7.el7_1.2.x86_64.rpm 
zsh-5.0.2-7.el7_1.2.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
[root@localhost ~]# 
單獨的驗證程式封包件也可以。      

2、更新:

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

-U:更新或安裝;如果原本就沒有安裝此軟體,則安裝。

-F:更新,如果沒有安裝些軟體,則不更新。

rpm  -Uvh PACKAGE_FILE ...

rpm  -Fvh PACKAGE_FILE ...

--oldpackage:降級;

--force:強制更新;有時候低版本的程式可能被其它程式所依賴,這時更新會報錯。如果強制更新很可能會導緻一些程式不能使用。這也是還要使用源代碼安裝軟體的一個原因。

注意:(1) 不要對核心做更新操作; 4.0之前的核心必須要重新開機才能使用,可能會發生重新開機以後發現系統起不來了。可以直接安裝新版本核心。Linux支援多核心版本并存,可以直接安裝新版本核心;

(2)隻要新更新安裝的包的配置檔案與老版本的配置檔案不同,新的配置檔案會重命名為*.rpmsave或*.rpmnew之類的名稱。 是根據校驗碼之類的進行的比較。

[root@localhost ~]# rpm -Uvh zsh-5.0.2-7.el7_1.2.x86_64.rpm 
warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:zsh-5.0.2-7.el7_1.2              ################################# [ 50%]
Cleaning up / removing...
   2:zsh-5.0.2-7.el7                  ################################# [100%]
[root@localhost ~]#      

3、解除安裝:

 rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...

--allmatches:解除安裝所有比對指定名稱的程式包的各版本;

--nodeps:忽略依賴關系

--test:測試解除安裝,dry run模式

[root@localhost ~]# rpm -evh zsh
Preparing...                          ################################# [100%]
Cleaning up / removing...
   1:zsh-5.0.2-7.el7_1.2              ################################# [100%]
[root@localhost ~]#      

4、查詢:

rpm {-q|--query} [select-options] [query-options]

-q是基本,可以組合以下各選項。

[select-options]

    PACKAGE_NAME:查詢指定的程式包是否已經安裝,及其版本;

    -a, --all:查詢所有已經安裝過的包;

    -f  FILE:查詢指定的檔案由哪個程式包安裝生成;

    -p, --package PACKAGE_FILE:用于實作對未安裝的程式包執行查詢操作;

    --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程式包提供;

    --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴;

CAPABILITY表示的是一種能力,如生成的可執行程式,提供的web服務,提拱的shell功能等等。

[query-options]

     --changelog:查詢rpm包的changlog;修改日志,這裡隻是rpm包的修改日志,而不是源碼的changelog.

     -l, --list:程式安裝生成的所有檔案清單;

     -i, --info:程式包相關的資訊,版本号、大小、所屬的包組,等;

     -c, --configfiles:查詢指定的程式包提供的配置檔案;

     -d, --docfiles:查詢指定的程式包提供的文檔;

     --provides:列出指定的程式包提供的所有的CAPABILITY;

     -R, --requires:查詢指定的程式包的依賴關系;

     --scripts:檢視程式包自帶的腳本片斷;

常用到的組合:

-qi  PACKAGE:查詢已安裝程式的詳細資訊。

-qf FILE:查詢某個檔案是由哪個程式包所提供的

-qc PACKAGE:查詢已安裝程式的配置檔案。

-ql PACKAGE:查詢已安裝程式所生成的檔案。

-qd PACKAGE:查詢已安裝程式包所提供的文檔。

-qpi  PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE: 這些與上面都一樣,隻不過不是查詢已安裝程式的,而是查詢還沒有安裝的程式封包件。

[root@localhost ~]# rpm -qf /etc/fstab 
setup-2.8.71-5.el7.noarch
[root@localhost ~]# 

[root@localhost ~]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@localhost ~]# 

[root@localhost ~]# rpm -qa | grep zs.*
zsh-5.0.2-7.el7_1.2.x86_64
[root@localhost ~]# 

[root@localhost ~]# rpm -qpc zsh-5.0.2-7.el7_1.2.x86_64.rpm 
warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@localhost ~]#      

最後一個例子是直接提供的程式封包件,而不是程式名稱。倒數第二個用來在不知道某個程式具體的名稱的時候很有用。

5、校驗:

rpm {-V|--verify} [select-options] [verify-options]    

有沒有懷疑過你的程式檔案被改了,并且植入了後門。那麼來校驗一下吧。用來校驗已安裝的程式有沒有被修改過,程式的所有檔案。

有可能會報的錯誤:

S file Size differs 大小變化

M Mode differs (includes permissions and file type) 權限變化

5 digest (formerly MD5 sum) differs 校驗碼變化,rpm資料庫中記錄了所有程式的校驗嗎。

D Device major/minor number mismatch 裝置主次号變化。

L readLink(2) path mismatch (readlink)路徑變化。

U User ownership differs    屬主變化。

G Group ownership differs 屬組變化。

T mTime differs 修改時間變化

P caPabilities differ    CAPABILITY變化。

[root@localhost ~]# rpm -V zsh
[root@localhost ~]# 
沒有消息就是最好的消息。      
[root@localhost ~]# chmod o-x /usr/bin/zsh
[root@localhost ~]# rpm -V zsh
.M.......    /bin/zsh
[root@localhost ~]# 

[root@localhost ~]# touch /usr/bin/zsh
[root@localhost ~]# rpm -V zsh
.M.....T.    /bin/zsh
[root@localhost ~]# 

[root@localhost ~]# rpm -V -a
S.5....T.  c /etc/issue
S.5....T.  c /etc/yum.repos.d/CentOS-Base.repo
S.5....T.  c /etc/sudoers
.......T.  c /root/.bash_logout
S.5....T.  c /root/.bash_profile
S.5....T.  c /root/.bashrc
.....      

修改權限的,修改時間的,最下面這個可以看到配置檔案修改也是會報出來,也是程式的組合部分。

6、資料庫重建:

rpm管理器資料庫路徑:/var/lib/rpm/

無論是更新、查詢、删除操作還有yum安裝都是需要rpm的資料庫的。是以資料庫是非常重要的。

擷取幫助:

CentOS 6:man rpm

CentOS 7:man rpmdb

rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]

--initdb:初始化資料庫,目前無任何資料庫可實始化建立一個新的;目前有時不執行任何操作;

--rebuilddb:重新建構,通過讀取目前系統上所有已經安裝過的程式包進行重新建立;

但我自己在測試中發現,一點用也沒有,雖然出現一堆檔案,但卻沒有任何軟體安裝的資料。不知道是不是我的虛拟機問題。朋友們如果可以重新生成資料庫一定要告訴我一下啊。

加進去一條:指定目錄為根目錄安裝,救援模式常用。

rpm --root=DIRECTORY -ivh

我們知道,rpm包程式安裝的時候,是把各種檔案以絕對路徑複制到各個目錄,而絕對路徑是以根開頭的。而--root參數就是以某個目錄為根進行安裝。

rpm --replacepkgs --root=/mnt/sysp_w_picpath -ivh base*.rpm