軟件包管理器之一——RPM介紹及應用

一、前言:

    在沒有軟件包管理器前,用戶都是通過源代碼的方式來安裝軟件。但是我們很容易發現,在每次安裝軟件時都必須對操作系統的境、編譯的參數進行對應的編譯,并且操作過程很是復雜,這對于不熟悉操作系統的朋友來說真心困難,那么有沒有一款軟件能讓用戶能很簡單的安裝所需的軟件呢?

    隨著自由軟件蓬勃發展,Linux系統的飛快發展,很多軟件開發者、企業和社區將這些軟件開始通過收集、整理、編譯制作成distributions發布到常用的Linux操作系統上,但是后來發現,這樣做在日后軟件更新、系統更新上面都需要做很多操作。為了解決這個問題,一些社區和企業開始思考關于Linux的軟件管理方式。

    通過社區與企業的共同努力,Linux開發商將固定的硬件平臺和操作系統需要安裝或升級的軟件編譯好,并且將這些軟件通過特定的打包方式將軟件打包成一個特殊格式的文件,這些軟件的文件含有能檢測操作系統環境和軟件依賴性的腳本,并提供記載該軟件提供的所有文件信息等,最后將這個軟件發布出去供用戶使用。那么用戶得到這個軟件包,通過特定的命令,就能執行檢測系統環境,根據環境所需的要求,對軟件進行安裝。這就是軟件管理器的誕生。


二、目前常見Linux軟件安裝方式有2種

    2.1、dpkg

        這個軟件安裝方法是通過Debian Linux社區開發出來的,通過dpkg機制,Debian所提供的軟件就能通過很簡單的方法安裝軟件,并且能記錄安裝后的軟件信息。只有是Debian的Linux distributions大多數都是使用這個方法管理軟件。例如B2D、Ubuntu

    2.2、RPM

        這個軟件安裝方法是由Red Hat公司開發出來的,由于非常的簡單實用,很多的distributions都使用這個機制來安裝和管理軟件。例如:CentOS、SuSe等


三、程序包管理器

    功能:將編譯好的程序打包成一個文件或有限的幾個文件,可以用于實現安裝、卸載、升級、查詢等功能

    包含

        1、數據庫

            程序名及版本

            依賴關系: X –> Y,Z

            功能性說明(rpm -qi bash)

            安裝生成的各文件路徑及校驗碼            

        2、程序的組成清單

            文件清單

            安裝卸載時運行的腳本


四、RPM介紹

    RPM(RedHat Package Manager),RPM通過以一個種數據庫記錄的方式來將你所需的軟件安裝到你的Linux系統上的。在你所安裝的軟件前先通過編譯完成,打包成RPM格式的文件,數據庫記錄的方式搜索對應需要具備的依賴關系的軟件,那么當你在安裝該軟件的時候,RPM會查看你系統環境和依賴性關系來判定你是否能安裝此軟件。若能滿足,則允許安裝。否則將不給予安裝。并且在安裝的時候將該軟件的信息寫入RPM的數據庫中,以便日后查詢、檢驗和升級。


五、RPM包的命名格式

        name    –     version    –        release                .arch                  .rpm

      軟件名字     軟件的版本信息    rpm包的發行號    適合的硬件平臺   擴展名

    軟件名字(name):每一個軟包的名稱

    軟件的版本信息(version):組成部分有 major.minor.release

            major:主版本號

            minor:次版本號

            release:大版本的發行號,是屬于源碼包的發行號 

    rpm包的發行號(release):當前rpm包是什么的發行號,與程序源碼(version里的)的發行號無關,僅用于標識對rpm包不同制作的修訂,比如升級了什么補丁            

    適用的硬件平臺(arch):

            x86:i386,i486,i586,i686等

            x86_64:x86_64

            powerpc:ppc

            noarch:沒有任何硬件等級上的限制

例如: bash-4.2.3-3.centos5.x86_64.rpm     #表示bash-4.2.3  ,第三次發行,支持CentOS5系統,支持硬件平臺x86_64位系統

         小貼士:獲取rpm包的途徑:

                1、發行的光盤或站點服務器

                    鏡像:

                        http://mirrors.163.com    

                        http://mirrors.sohu.com

                2、項目的官網

                    源代碼

                    rpm包

                3、很多第三方機構或個人制作并公開發布許多的rpm包

                    http://rpmfind.net

                    http://rpm/pbone.net


六、打包工具的分包機制:

    假設一個程序有20個功能:常用功能有8個,特殊功能A:3個,特殊功能B:6個,二次開發相關功能:3個。那如果用戶只需要常用功能,可是必須要全部安裝,那么就會很占用空間,而且其他功能根本不會使用,這時就會分包機制了。      

    分包機制: 

        核心包(主包) + 子包(分包)組成

            核心包:命令與源程序一致

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

            子包:(安裝子包前必須安裝核心包) 

例如: bash-a-4.2.3-3.centos7.x86_64.rpm
       bash-devel-4.2.3-3.centos7.x86_64.rpm   #devel就表示開發功能


七、RPM包的使用

    7.1、安裝(組合選項:-ivh)

        rpm [option] Package_file

            -i:install安裝操作

            -v:安裝時顯示詳細信息

            -vv:安裝時顯示更詳細信息

            -h:hash碼,在安裝過程中使用#號來顯示安裝進度

            –test:僅作測試,不做安裝操作

            –noteps:忽略依賴關系,強制安裝

                如果某包依賴于其他包,要么解決所有的依賴關系,要么忽略依賴關系,強制安裝。但是如果強制安裝完成后,軟件未必能正常使用

            –replacepkgs:重新安裝程序包
                備注:如果原有配置文件作了修改,很有可能不執行替換文件,而是將新生成的配置文件重命名后綴為 .rpmnew

例子:
#測試安裝RPM包
[root@localhost mnt]# mount /dev/cdrom /mnt                                                     #掛載光盤鏡像到/mnt目錄下
mount: block device /dev/sr0 is write-protected, mounting read-only 
[root@localhost mnt]# cd /mnt/Packages/                                                         #進入光盤目錄
[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm                                 #安裝zsh-4.3.10-7.el6.x86_64.rpm包
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY      #這里的是提示密鑰,無法校驗包的合法性
Preparing...                ########################################### [100%]                  #使用#代表安裝進度,一個#代表2%
   1:zsh                    ########################################### [100%]
#僅作測試,不做安裝
[root@localhost Packages]# rpm -q zsh    
package zsh is not installed
[root@localhost Packages]# rpm --test -ivh zsh-4.3.10-7.el6.x86_64.rpm                          #僅作測試安裝,實際上未安裝
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
[root@localhost Packages]# rpm -q zsh                                                              
package zsh is not installed

    7.2、卸載 

        rpm [option] Package_name

            -e:erase刪除

        卸載的時候也會存在依賴關系的

            如果被其他包所依賴:

                1、將依賴于此包的所有包一并卸載

                2、忽略依賴關系

                        能卸載,但依賴于此包程序包可能會運行不正常

                            –nodeps

練習:
[root@localhost Packages]# rpm -q zsh            #查看軟件是否安裝,顯示出包的信息證明已經安裝。查詢命令下面會繼續介紹
zsh-4.3.10-7.el6.x86_64
[root@localhost Packages]# rpm -e zsh            #卸載zsh軟件
[root@localhost Packages]# rpm -q zsh
package zsh is not installed                     #提示該軟件未安裝

    注意:如果包的配置文件安裝后曾被改動過,卸載時,此文件將不會卸載,而是重命名并保存,會出現下面的字段

                warning: /etc/zshrc saved as /etc/zshrc.rpmsave

例如:
[root@localhost Packages]# rpm -e zsh
warning: /etc/zshrc saved as /etc/zshrc.rpmsave
[root@localhost Packages]# ls /etc/ | grep "zsh*"
zshrc.rpmsave

    7.3、升級(一般而言是新版本取代老版本)

        rpm [option] Package_file

            (1)、升級或安裝 (如果有老版本就升級,如果沒有就安裝)

                組合 -Uvh

            (2)、直接升級 (如果有老版本就安裝新版本)

                組合 -Fvh

                升級的時候也可能會出現版本沖突等問題,所以如果想強制升級可以使用 –force

        注意:不應該對內核執行升級操作,而是安裝(因為Linux系統允許多內核并存)

    7.4、查詢

        (1)、查詢某包是否安裝

                rpm -q package_name…..

        (2)、查詢所有已經安裝的包

                rpm -qa           a表示all

                    按條件過濾: rpm -qa | grep 'PATTERN'

        (3)、查詢包的表述信息

                rpm -qi package_name         (這里查詢僅查詢已安裝的包)

        (4)、查詢某包生成了哪些文件

                rpm -ql package_name

                ①查詢某包生成了哪些配置文件

                    rpm -qc package_name

                ②查詢某包生成了哪些幫助文件

                    rpm -qd package_name

                ③查詢程序包的相關腳本

                    rpm -q –scripts package_name

                        腳本有四類

                           lpreinstall:安裝前腳本

                           lpostinstall:安裝后腳本

                           lpreuninstall:卸載前腳本

                           lpostuninstall:卸載后腳本

        (5)、查詢某文件是由哪個包安裝生成的

            rpm -qf /path/to/some_file

        (6)、對尚未安裝的包執行查詢

            rpm [option] /path/to/package_file

                -q  :查看軟件包是否安裝

                -qpi:安裝以后會生成哪些配置文件

                -qpl:安裝以后會生成什么文件

                -qpc:安裝以后會生成什么配置文件

                -qpd:安裝以后相關腳本

練習:
[root@localhost Packages]# rpm -q zsh             #查看zsh軟件是否安裝                    
zsh-4.3.10-7.el6.x86_64
[root@localhost Packages]# rpm -qa | grep zsh     #查看zsh軟件是否安裝  
zsh-4.3.10-7.el6.x86_64
[root@localhost Packages]# rpm -qd zsh            #查詢zsh包生成了哪些幫助文件
[root@localhost Packages]# rpm -qpl httpd-2.2.15-29.el6.centos.x86_64.rpm  #在未安裝httpd時,查詢安裝httpd會生成什么文件
[root@localhost Packages]# rpm -qf /etc/bashrc    #查詢bashrc這個文件是通過什么程序包安裝生成的
setup-2.8.14-20.el6_4.1.noarch

    7.5、校驗(用于檢查包裝后文件屬性是否發生變化)

        rpm -V Package_name

            S file Size differs   大小

            M Mode differs (includes permissions and file type)   權限,文件類型改變

            5 digest (formerly MD5 sum) differs    md5校驗碼發生改變

            D Device major/minor number mismatch   如果是設備文件,則主設備號和次設備號發生改變

            L readLink(2) path mismatch     路徑發生改變

            U User ownership differs        屬主發生改變

            G Group ownership differs     屬組發生改變       

            T mTime differs        修改時間發生變化

            P caPabilities differ    能力發生變化(可以理解為功能)

            某屬性無改變,則顯示為 . 

[root@localhost Packages]# tail -5 /etc/zshrc 
}
_src_etc_profile_d
unset -f _src_etc_profile_d
#test file                                       #在 /etc/zshrc文件中最后一行添加了最后一段
[root@localhost Packages]# rpm -V zsh            #查詢該zsh軟件的配置文件是否更改
S.5....T.  c /etc/zshrc                          #看出文件大小,MD5校驗,修改時間都發生了變化

    7.6、RPM數據庫重建

        小貼士:rpm 的數據庫目錄  /var/lib/rpm

            rpm –initdb:初始化

                如果事先沒有庫,會新建一個;如果有,則不覆蓋

            rpm –rebuilddb:重建

                直接重建,覆蓋原有的數據庫

    7.7、校驗RPM包來源合法性及完整性

        前言:包制作者制作完成之后會附加數字簽名于包上;

                包的制作者使用單向加密提取原始數據的特征碼,而后使用自己的私鑰加密這段特征碼,附加原始數據后面。

            驗證包來源合法性和完整性的過程:

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

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

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

        所以我們必須在當前系統上導入包的制作者的公鑰

            導入公鑰:

                rpm –import /path/to/key_file             

    小貼士:centos6的密鑰是在光盤里的“RPM-GPG-KEY-CentOS-6 ”文件

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

                rpm -qa gpg-pubkey*   

            顯示公鑰的詳細信息

                rpm -qi gpg-pubkey-name

        檢查包:安裝過程中會自動執行,若要自動檢測請如下操作

            手動檢查:

                rpm -K /path/to/package_file

                rpm –checksig /path/to/package_file   

            不檢查包完整性:

                rpm -K –nodigest

            不檢查來源合法性:

                rpm -K –nosignature

練習:
[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm                              #安裝時會提示你沒有公鑰,無法校驗包的完整性與合法性
warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
[root@localhost Packages]# rpm --import /mnt/RPM-GPG-KEY-CentOS-6                            #導入密鑰
[root@localhost Packages]# rpm -qa gpg-pubkey*                                               #查看所以已導入的gpg格式的密鑰
gpg-pubkey-c105b9de-4e0fd3a3
[root@localhost Packages]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3                              #查看密鑰詳細信息
[root@localhost Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm                #可以導入密鑰后安裝軟件會自動執行檢查,通過后直接安裝      
Preparing...                ########################################### [100%]    
   1:zsh                    ########################################### [100%]
[root@localhost Packages]# rpm -K zsh-4.3.10-7.el6.x86_64.rpm                                #手動檢查包的完整性與合法性
zsh-4.3.10-7.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK


八、知識要點總結

    8.1、了解軟件包管理器的來源與使用

    8.2、熟悉RPM包的命名格式    name-version-release.arch.rpm

    8.3、熟悉打包和分包機制

    8.4、熟悉RPM命令的使用 ,包括 安裝、卸載、查詢、升級、校驗、公鑰導入、合法性的檢驗、RPM數據庫重建

    雖然在安裝軟件時還有其他更好的命名,比如yum(日后再介紹),但是yum也是基于RPM而衍生出來的,而且在查詢軟件包很有用,日后也會經常使用這個命令,所以必須要對RPM命令非常熟悉,尤其是查詢命令,對日后維護Linux系統幫助很大。建議多加練習

原創文章,作者:螃蟹,如若轉載,請注明出處:http://www.www58058.com/6383

(0)
螃蟹螃蟹
上一篇 2015-07-20
下一篇 2015-07-21

相關推薦

  • 抵御DDOS攻擊,iptables限制TCP連接和頻率

    cc攻擊一到就有點兵臨城下的感覺,正確的設置防護規則可以做到臨危不亂,這里給出一個iptables對ip進行連接頻率和并發限制,限制單ip連接和頻率的設置規則的介紹 #單個IP在60秒內只允許新建20個連接,這里假設web端口就是80, iptables -I  INPUT -i eth1 -p tcp -m tcp –dpo…

    系統運維 2016-05-08
  • Linux基礎知識(三)-用戶管理組管理,正則grep,文本處理

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,只顯示一次即可。 2、取出最后登錄到當前系統的用戶的相關信息。 3、取出當前系統上被用戶當作其默認shell的最多的那個shell。 4、將/etc/passwd中的第三個字段數值最大的后10個用戶的信息全部改為大寫后保存至/tmp/maxusers.txt文件中 5、取出當前主機的IP…

    Linux干貨 2016-10-09
  • 馬哥教育網絡19期+第十二周課程練習

    1、請描述一次完整的http請求處理過程; a.向根域名服務器請求解析域名,然后根服務器返回相應的IP信息; b.用戶的Web瀏覽器向服務器端的80端口通過三次握手建立TCP連接; c.建立完TCP連接后發送HTTP請求,請求的格式包括請求方法、URL和協議版本號,方法有GET、HEAD、POST、PUT、DELETE、OPTIONS、TRACE,如: &n…

    Linux干貨 2016-08-22
  • 馬哥教育網絡班21期+第9周課程練習

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登陸shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash while read line; do     if [[ $line&n…

    Linux干貨 2016-09-01
  • openssl+http實現https

    openssl詳解及實現https OpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,并提供豐富的應用程序供測試或其它目的使用。 秘鑰算法和協議: 對稱加密: 加密和解密使用同一個密鑰,原始數據分成固定大小塊,算法不同 秘鑰過多,秘鑰分發困難 DES,3DES  AES  Blowfi…

    Linux干貨 2016-10-24
  • 分區”魔術師”的磁盤管理

    設備文件 I/O Ports: I/O設備地址 一切皆文件: open(), read(), write(), close() 設備類型: 塊設備: block,存取單位“塊”,磁盤 字符設備: char,存取單位“字符”,鍵盤 設備文件:關聯至一個設備驅動程序,進而能夠跟與之對應 硬件設備進行通信 設備號碼: 主設備號: major number, 標識設…

    Linux干貨 2016-08-29
欧美性久久久久