RPM程序包管理

由於Linux是開源的系統,所有在Linux上運行的程序有很多不同的作者提供源代碼,這些程序包有C語言、C++語言、perl語言、python語言、或ruby語言等其他語言。對於不同語言的程序包,他們的安裝方式不同,不同的語言開發的程序需要不同的API(應用接口),對於用戶來說,非常之不方便,而且使新的用戶望而卻步。操作系統發行商主要負責通過自己的方式,將程序編程成程序包,給用戶直接使用,而且程序包之間還存在依賴關係,如A依賴B才能安裝,B又依賴C安裝,因此係統發行商開發出了程序包管理器。

程序在編譯之前都是源代碼,編譯之後轉換爲二進制程序,還有幫助文件、配置文件、庫文件四個部分組成。在linux系統中這四個部門會存放於如下目錄中:

  二進制程序: /bin , /sbin , /usr/bin , /usr/sbin , /usr/local/bin ,/ user/loacl/sbin , /opt/bin ,/opt/sbin

    庫文件: /lib , /lib64 , /usr/lib , /usr/lib64 , /usr/loacl/lin , /usr/local/lib64

   配置文件: /etc , /etc/DIR , /usr/share/{etc,,conf}

       幫助文件: /usr/share/man , /usr/share/doc , /usr/loacl/share/man

      注意:有些特殊的應用程序可能會將執行文件放置於libexec目錄。也可以單獨安裝在某一目錄下。

程序包管理器對應用程序打包成特定的格式,對兼容的程序包直接進行安裝、卸載、升級、查詢。常見的包管理器有:deb的Debian和和Red Hat的.rpm。

程序包的格式爲(rpm格式的):appname-VERSION-ARCH-RELEASE .ARCH .rpm ,其中VERSION爲版本號有major:主版本號和minor:次版本號; RELEASE:發行號,包自身的修訂號,有時候還會包含適用於os信息,比如bash-4.3.2-2.centos6.x86_64.rpm中的2.contos6releaseARCH爲適用的平臺,如x86:i386、i586、i686、x86_64amd64等,如顯示noarch則此程序包與平臺無關都可以兼容。由於一個程序包中蘊含多種功能,有些功能不常用,所以程序包有分包機制,可以安裝自己需要的,一般主包都會安裝,分爲核心包(主包)和子包(支包),核心包的命名與源項目的命名一致,子包的命名爲源項目名稱附加子包中文件提供的功能組成如下:

           php-pecl-apc.x86_64(主包)、php-pecl-apc-devel.i686(子包)、php-pecl-apc-devel.x86_64(子包)

獲取程序包的途徑主要有四種,系統的發行光盤、程序包的官方站點、第三方組織或通過搜索引擎。、                           Centos系統上程序rpm包管理有四個方式,安裝、升級、卸載、查詢、檢驗。下面講一下常用的命令。

    

安裝:

                    rpm {-i | --install } [install-option] PACKAGE_FILE1…

              -h : hash ,以#來顯示安裝進度

                                 - v--verbose: 顯示安裝過程中的詳細信息:

                                  -ivvh:在選項中加v可以更詳細的顯示此程序包安裝的哪些文件,具體進度

               -ivvvh:可以添加多個v

               安裝時常用的組合:-ivh(查看以#顯示的安裝進度) , -ivvh

               --test :不執行真正的安裝過程,而僅報告依賴關係及衝突信息等;

            例如:[root@localhost Packages]# rpm -i zsh-4.3.10-7.el6.x86_64.rpm  安裝此程序包後,沒有回饋其它信息,說明已經安裝成功,可以通過which命令查看,是否已經安裝了zsh。

        例如通過-ivh選項可查看安裝進度  

           [root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm 

            Preparing...                ########################################### [100%]

            1:zsh                    ########################################### [100%]

         例如:使用--test選項來測試安裝;

            [root@localhost Packages]# rpm -ivh --test zsh-4.3.10-7.el6.x86_64.rpm 

             Preparing...                ########################################### [100%]

此外,由於程序包是由衆多目的的小程序組成,所以程序包之間存在的依賴性關係很強,譬如A需要B安裝,B還需要C完成等,程序包之間的依賴關係非常複雜。

例如:安裝php-5.3.3-38.el6.x86_64.rpm需要依賴php-cli(x86-64)和php-common(x86-64)。

            [root@localhost Packages]# rpm -ivh --test php-5.3.3-38.el6.x86_64.rpm 

             error: Failed dependencies:

     php-cli(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64

     php-common(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64

 可以通過選項---nodeps來忽略依賴關係,副作用能夠安裝成功,但未必能夠運行成功。若一不小心刪除了某些文件,可以通過--replacepkgs選項來覆蓋安裝此程序包,還可以通過--force強制安裝。

還能夠通過選項來升級程序包

    升級:

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

           -U:升級或安裝       

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

           -F:升級

       組合: -Uvh ,-Fvh與安裝選項一樣在選項中加v可以顯示詳細的升級或安裝的信息,與安裝類似還有 --test(安裝測試)、--nodeps(忽略依賴關係安裝)、--force(強制安裝)或者 --oldpackage(用於降級到舊版本)。不過需要注意的是,一定不要對內核執行升級,Linux允許多內核共存,所以可以直接安裝多個不同版本的內核。如果程序包的配置文件安裝後曾被修改,升級時,新版本的配置文件不會覆蓋老版本的配置文件;而是把新版本的配置文件重命名(加後綴.rpmnew)後保存。

 

卸載:

        移除已經安裝的程序包

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

      簡單用法: rpm -e PACKAGE_NAME...

      --allmatches: 如果一個程序包同時安裝多個版本,則此選項一次全部卸載;

      --test :測試卸載; 

      --nodeps:忽略依賴關係;

        注意:如果程序包的配置文件安裝後曾被修改,卸載時,此文件通常不會被刪除,而是被重命名(加後綴.rpmsave)後留存;

 

查詢:

          查詢某包是否已經安裝,以及檢查安裝的所有包,還可以查看某包的詳細信息;

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

 

           [select-options]

                 1、查詢某包或某些包是否安裝

                            rpm -q PACKAGE_NAME

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

                            rpm -qa

       3、查詢某個文件是由哪個包安裝生成;

                            rpm -qf /PATH/TO/SOMEFILE

       4、查詢尚未安裝的包文件的相關信息

             -p

             rpm -qpi PACKAGE_FILE

 

            [query-options]

                 1、查詢某包的簡要說明信息;

                      rpm     -qi     PACKAGE_NAME

                     例如 : rpm    -qi      zsh

                 2、查詢某包安裝生成的文件列表;

                      rpm  -ql  PACKAGE_NAME

                  3、查詢某包安裝完成後生成的所有配置文件

                      rpm  -qc PACKAGE_NAME

        4、查詢某報安裝完成生成的所有幫助文件

                      rpm -qd PACKAGE_NAME

        5、查詢某包製作時隨版本變化的changelog信息;

                     rpm -q --changelog PACKAGE_NAME 

                  6、查詢某包提供的capabilities

          rpm -q --provides PACKAGE_NAME

                   7、查詢包所依賴的capabilities

                        rpm -q --requires PACKAGE_NAME

                    8、查詢某包安裝或卸載時執行腳本;

                         rpm -q --scripts PACKAGE_NAME         

                 腳本有四類:

                                                       preinstall :安裝過程開始之前執行的腳本;

                                                       postinstall : 安裝過程完成之後執行的腳本;

                                                       preuninstall :卸載開始之前執行的腳本

                                                       postuninstall: 卸載過程完成之後執行的腳本;

例如:查詢zsh的簡要信息;

[root@localhost Packages]# rpm -qi zsh

Name        : zsh                          Relocations: (not relocatable)

Version     : 4.3.10                            Vendor: CentOS

Release     : 7.el6                         Build Date: Mon 25 Nov 2013 01:40:59 AM CST

Install Date: Sat 11 Apr 2015 05:08:33 PM CST      Build Host: c6b9.bsys.dev.centos.org

Group       : System Environment/Shells     Source RPM: zsh-4.3.10-7.el6.src.rpm

Size        : 5009102                          License: BSD

Signature   : RSA/SHA1, Mon 25 Nov 2013 03:33:46 AM CST, Key ID 0946fca2c105b9de

Packager    : CentOS BuildSystem <http://bugs.centos.org>

URL         : http://zsh.sunsite.dk/

Summary     : A powerful interactive shell

Description :

The zsh shell is a command interpreter usable as an interactive login

shell and as a shell script command processor.  Zsh resembles the ksh

shell (the Korn shell), but includes many enhancements.  Zsh supports

command line editing, built-in spelling correction, programmable

command completion, shell functions (with autoloading), a history

mechanism, and more.


校驗:

 

        查詢包安裝之後生成的文件是否發生了改變;    

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

         常見用法:rpm -V PACKAGE_NAME 

[root@localhost Packages]# rpm -V zsh

S.5....T.  c /etc/zshrc

S表示文件大小更改,5表示校驗碼也更改了,T表示修改時間戳,.表示未修改。


文件改變信息的返回值所代表修改的含義:

       S file Size differs

       M Mode differs (includes permissions and file type)

       5 digest (formerly MD5 sum) differs

       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


程序包的合法性驗證:

              來源合法

                            由我們信任的製作者提供;

                            依賴於:製作者的數據簽名,簽名是作者使用自己的私鑰加密程序包的特徵碼進行的;

              內容合法

                            包未被二次修改, 完整性檢驗成功

                             依賴於:製作者提供的程序特徵碼:

                                               驗證方式:安裝者用同樣的特徵碼提取算法提取程序包的特徵碼,並與原作者提供的相比較

                      驗證其光盤中程序包的來源及完整性   

                         rpm --import  /path/to/RPM-GPG-KEY-FILE

                        例如:# rpm --import RPM-GPG-KEY-Centos-6     導入含有公鑰的文件            

                                    驗證: rpm {-k | --checksig } PACKAGE_FILE

                          --nosignature :不檢查來源合法性

                                                            --nodigest : 不檢查完整性         

[root@localhost cdrom]# rpm --import RPM-GPG-KEY-CentOS-6

[root@localhost cdrom]# cd Packages/

[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

如上示例,通過從光盤鏡像文件獲取的含有公鑰的文件,驗證zsh-4.3.10-7.el6.x86_64.rpm此程序包的來源的合法性,如上驗證md5碼OK。


    rpm管理器數據庫:/var/lib/rpm

    重建數據庫:

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

       --initdb: 初始化數據庫,即數據庫完全不存時,可新建之;

       --rebuilddb: 無論當前數據存在與否,都會直接重建此庫;

小結,此文講述了rpm的基本管理:安裝、升級、卸載、查詢和校驗;還有程序包的合法性的驗證以及數據庫的管理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章