首頁 > 軟體

Linux系統之程式包管理器-RPM

2020-06-16 18:00:36

在早期我們使用原始碼的方式來安裝軟體時,都需要先把源程式程式碼編譯成可執行的二進位制安裝程式,然後進行安裝。這就意味著每次安裝軟體都需要經過預處理-->編譯-->組合-->連結-->生成安裝檔案--> 安裝,這個複雜而艱辛的過程。為簡化安裝步驟,便於廣大使用者的安裝部署程式,程式提供商就在特定的系統上面編譯好相關程式的安裝檔案並進行打包,提供給大家下載,我們只需要根據自己的系統去下載相應的安裝包進行安裝即可,其類似 Windows 的安裝方式,由程式開發者直接在已知的系統上面編譯好,再將該程式直接給使用者來安裝,如此而已。但是,程式包該怎麼管理呢,這就是我們程式包管理器的事啦!

什麼是程式包管理器
    用於管理Linux 下軟體包的軟體,其主要功能為:將編譯好的程式打包成一個檔案或有限的幾個檔案,可用於實現安裝、解除安裝、升級、查詢等功能。
程式包管理器的兩大主流
      dpkg: 最早是由 Debian Linux 社群所開發出來的, 只要是衍生亍 Debian 的其他 Linux distributions 大多使用 dpkg 這個機制來管理軟體的, 包括B2D, Ubuntu 等等,其前端工具有apt-get。
        RPM: 最早是由 Red Hat 這家公司開發出來的,後來實在太好用,因此很多distributions 就使用其來作為軟體安裝的管理方式。包括 Fedora, CentOS, SUSE 等等,其前端工具有yum。

程式包的組成格式與存放路徑:
    1、二進位制程式
        主要存放的路徑:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, /usr/local/APP/{bin,sbin}
        注意:有些特殊的應用程式放置於libexec目錄中;有些第三方應用預設安裝於/opt目錄。
    2、庫檔案(開發庫、執行庫)
      主要存放的路徑:/lib64, /usr/lib64, /usr/local/lib64, /usr/local/APP/lib
    3、組態檔
      主要存放的路徑:/etc, /usr/local/APP/etc或conf目錄
    4、幫助檔案
      主要存放的路徑:/usr/share/man, /usr/local/share/man, /usr/local/APP/man

RPM程式包管理器使用詳解
RPM包的命名格式:


    但對於一個程式來說,其可能具有很多功能,其中有些是常用功能,有些是特殊功能,有些是二次開發相關的功能,如果把所有的功能打包在一塊,無疑程式包會增大很多,對一些普通使用者無需使用的功能都需一併下載安裝,無形間就造成了資源的浪費,特此在對程式包的打包就衍生出了分包機制,一般把程式分包成主包與子包。例如一個bash程式有20個功能:常用功能有10個,特殊A:4個,特殊B:3個,二次開發相關功能:3個,那麼包的命名方式如下:
                核心包,主包:命名與源程式一致
                    bash-4.2.3-3.centos7.x86_64.rpm
                子包:
                    bash-a-4.2.3-3.centos7.x86_64.rpm
                    bash-b-4.2.3-3.centos7.x86_64.rpm
                    bash-devel-4.2.3-3.centos7.x86_64.rpm


  RPM-安裝程式包:
          命令格式: rpm [option] /path/to/package_file...
            常用選項說明:
                              -i:安裝程式;
                              -v:顯示安裝執行過程;
                            -vv:詳細顯示安裝執行過程;
                            -vvv:更詳細的顯示安裝執行過程;
                            -h:用#來標記安裝進度
                              常用組合選項:-ivh
                              --test: 僅作測試,沒有真正執行安裝
                              --nodeps:忽略依賴關係,強制安裝,能安裝上,但有可能無法執行
                              --replacepkgs:重新安裝,如果原有組態檔作了修改,很有可能不執行替換,而是將應該安裝生成的組態檔重新命名為 .rpmnew
[root@CentOS6 Packages]# rpm -ivh zsh-4.3.10-7.el6.i686.rpm --test
Preparing...                ########################################### [100%]
[root@CentOS6 Packages]# rpm -ivh zsh-4.3.10-7.el6.i686.rpm 
Preparing...                ########################################### [100%]
  1:zsh                    ########################################### [100%]

      [注意]:該命令後面接的是RPM包檔案,可以用空格做分割同時安裝多個程式,如電腦可以上網的話,也可以直接指定網路上的RPM包,進行安裝。

RPM-解除安裝程式包:

      命令格式:rpm [option] package_name
            常用選項說明:-e: 解除安裝程式
                                    --nodeps:忽略依賴關係,強行解除安裝,其他依賴於此包的程式可能無法正常執行
[root@CentOS6 Packages]# rpm -e zsh
warning: /etc/zshrc saved as /etc/zshrc.rpmsave  #對/etc/zshrc做過修改,提示檔案不會被刪會被儲存為/etc/zshrc.rpmsave
[root@CentOS6 Packages]# rpm -e httpd  #解除安裝httpd,提示有其他程式依賴於該程式,無法解除安裝,如需解除安裝先解除安裝相依賴的程式
error: Failed dependencies: 
    httpd >= 2.2.0 is needed by (installed) gnome-user-share-2.28.2-3.el6.i686
[root@CentOS6 Packages]# rpm -e httpd --nodeps #忽略依賴關係,強行解除安裝
[root@CentOS6 Packages]#

    [注意]:如果包的組態檔安裝後曾被改動過,解除安裝時,此檔案將不會解除安裝,而是被重新命名並保留,例如
                    warning: /etc/zshrc saved as /etc/zshrc.rpmsave


  RPM-升級程式包
      命令格式:rrpm [-Uvh | -Fvh] /path/to/package_file
            常用選項說明:-Uvh: 升級或安裝,後面的程式安裝此電腦已安裝則進行升級,如沒有安裝則現在安裝;
                                    -Fvh: 升級,只對電腦上已安裝的程式進行升級,如沒有安裝則不進行安裝;
                                  --force:強制升級
    [注意]:為了保證系統的正常執行,不要對核心進行升級操作,而應該對核心進行安裝,系統允許多個核心共存。


  RPM-查詢操作

      命令格式:rpm [option] package_name|file
            常用選項說明:
                  -q: 查詢某包是否安裝,可以一次查詢多個,彼此間用空格隔離;
[root@CentOS6 cd]# rpm -q zsh
zsh-4.3.10-7.el6.i686

-qa: 查詢所有已經安裝的包,可以通過管道按條件進行過濾(rpm -qa |  grep 'PATTERN')
[root@CentOS6 cd]# rpm -qa
libaio-0.3.107-10.el6.i686
perl-URI-1.40-2.el6.noarch
kbd-1.15-11.el6.i686
gnome-speech-0.4.25-3.1.el6.i686
cas-0.15-1.el6.1.noarch
tzdata-2013g-1.el6.noarch
libsss_autofs-1.9.2-129.el6.i686
.........
[root@CentOS6 cd]# rpm -qa | grep "zs.*"
zsh-4.3.10-7.el6.i686

                  -qi: 查詢包的描述資訊(只能查詢已經安裝的包的描述資訊);
[root@CentOS6 cd]# rpm -qi zsh
Name        : zsh                          Relocations: (not relocatable)
Version    : 4.3.10                            Vendor: CentOS
Release    : 7.el6                        Build Date: Sun 24 Nov 2013 12:37:44 PM EST
Install Date: Tue 21 Apr 2015 11:29:57 AM EDT      Build Host: c6b9.bsys.dev.centos.org
Group      : System Environment/Shells    Source RPM: zsh-4.3.10-7.el6.src.rpm
Size        : 4777026                          License: BSD
Signature  : RSA/SHA1, Sun 24 Nov 2013 02:30:40 PM EST, 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.
[root@CentOS6 cd]#

                  -ql: 查詢某包安裝生成了哪些檔案(所有);
                  -qc: 查詢某包安裝生成了哪些組態檔;
                  -qd: 查詢某包安裝生成了哪些幫助檔案;
                  --q --scripts package_name: 查詢程式包的相關指令碼;
                        指令碼有四類:
                            preinstall:安裝前指令碼,包安裝之前就需安裝的腳步
                            postinstall: 安裝後指令碼
                            preuninstall: 解除安裝前指令碼
[root@CentOS6 cd]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@CentOS6 cd]# rpm -qd zsh
/usr/share/doc/zsh-4.3.10/BUGS
.....
/usr/share/man/man1/zshall.1.gz
....
[root@CentOS6 cd]# rpm -q --scripts zsh
postinstall scriptlet (using /bin/sh):
if [ ! -f /etc/shells ] ; then
.....
[root@CentOS6 cd]#


      查詢沒有安裝的包的相關資訊,只需要在選項裡加入-p即可,如下:

                    -qpi  包的描述資訊
                    -qpl  包安裝會生成的檔案
                    -qpc  包安裝會生成的組態檔
                    -qpd  包安裝會生成的幫助檔案
    查詢某檔案是由哪個包安裝生成的:rpm -qf /path/to/some_file
[root@CentOS6 cd]# rpm -qf /bin/vi 
vim-minimal-7.2.411-1.8.el6.i686  #顯示/bin/vi檔案是由該安裝包生成
[root@CentOS6 cd]#

RPM-校驗

        用於檢查包安裝生成的檔案屬性是否發生變化
        命令格式:rpm [option] package_name|file
        常用選項說明:
                    -V :後面加的是程式名稱,若該程式屬有的檔案發生改變就會顯示;
                    -Va :顯示目前系統上面所有可能被修改過的檔案;
                    -Vp :後面加的是檔名,顯示該程式內可能被更改過的檔案;
                    -Vf :後面加的是檔名,顯示某個檔案是否被修改過。
[root@CentOS6 cd]# rpm -V zsh
S.5....T.  c /etc/zshrc
[root@CentOS6 cd]#

    對應屬性位說明:
              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包的校驗與數位簽章說明:

    RPM包的校驗主要有來源合法性驗證與包的完整性驗證。
    數位簽章:包的製作者使用單向加密提取原始資料的特徵碼,而後使用自己的私鑰加密這段特性碼,附加原始資料後面。
    驗正過程:
        前提:必須有可靠機制獲取到包製作者的公鑰;
        1、使用製作者的公鑰解密加密的特徵碼,能解密則意味著來源合法;
        2、使用與製作者同樣的意向加密演算法提取原始資料的特徵碼,並與解密出來的特徵作比對,相同,則意味著完整性沒問題;
rpm包來源合法性及完整性檢驗:
            在當前系統上匯入包的製作者的公鑰:
                rpm --import /path/to/key_file
          顯示所有已經匯入的gpg格式的公鑰:
                rpm -qa gpg-pubkey*       
[root@CentOS6 cd]# rpm -qa gpg-pubkey*
gpg-pubkey-c105b9de-4e0fd3a3
[root@CentOS6 cd]#

            顯示金鑰的詳細資訊

          rpm -qi gpg-pubkey-NAME       
[root@CentOS6 cd]# rpm -qi gpg-pubkey-c105b9de-4e0fd3a3
Name        : gpg-pubkey                  Relocations: (not relocatable)
Version    : c105b9de                          Vendor: (none)
......
-----END PGP PUBLIC KEY BLOCK-----

      【注意】安裝過程中會自動用已經匯入的的公鑰,對程式包進行檢驗,一般無需進行手動校驗。

  手動檢查:
          rpm {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE
              選項說明:
                    -K :等同於 --checksig ,進行檢查並顯示結果;
                    --nodigest:不檢查包完整性;
                    --nosignature:不檢查來源合法性。
[root@CentOS6 cd]# cd Packages/
[root@CentOS6 Packages]# rpm -K zsh-4.3.10-7.el6.i686.rpm 
zsh-4.3.10-7.el6.i686.rpm: rsa sha1 (md5) pgp md5 OK
[root@CentOS6 Packages]# rpm --checksig zsh-4.3.10-7.el6.i686.rpm 
zsh-4.3.10-7.el6.i686.rpm: rsa sha1 (md5) pgp md5 OK
[root@CentOS6 Packages]# rpm -K --nodigest zsh-4.3.10-7.el6.i686.rpm 
zsh-4.3.10-7.el6.i686.rpm: rsa (md5) pgp OK
[root@CentOS6 Packages]# rpm -K --nosignature zsh-4.3.10-7.el6.i686.rpm 
zsh-4.3.10-7.el6.i686.rpm: sha1 md5 OK

     
  RPM- 資料庫重建:
        資料庫目錄:/var/lib/rpm
        重建資料庫:
            rpm --initdb:初始化
                如果事先沒有庫,會新建一個;如果有,則不新建;
            rpm --rebuilddb : 重建
                直接重建,覆蓋原有的資料庫

RPM包建立入門  http://www.linuxidc.com/Linux/2015-02/113559.htm

如何在Linux中建立RPM包?  http://www.linuxidc.com/Linux/2012-05/60278.htm

製作自己的rpm包 http://www.linuxidc.com/Linux/2013-06/86435.htm

Linux 下rpm安裝後的目錄結構和一些設定 http://www.linuxidc.com/Linux/2013-06/85761.htm

rpm與yum的綜合性介紹與範例演示 http://www.linuxidc.com/Linux/2013-05/84480.htm

RedHat Linux---rpm 命令詳解 http://www.linuxidc.com/Linux/2013-03/81971.htm

使用FPM輕鬆製作RPM包 http://www.linuxidc.com/linux/2014-06/103019.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-05/117260.htm


IT145.com E-mail:sddin#qq.com