rpm命令詳解

程序包的升級:

         升級rpm包:

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

         選項:

                   -U:表示升級或安裝

                   -F:僅是升級

 

升級來講額外的常用選項:

                   --oldpackage:降級;

(爲什麼要降級?

         當一個程序包升級之後發現各種不兼容,發現各種不好用,因此這時我們就進行回滾操作。將程序在還原至原來的版本。)

 

                   --force:強制升級;

(爲什麼要強制升級?

         有些時候我們升級到較新的版本時,因爲依賴關係的問題,很有可能存在這樣的現狀,老版本的程序包被其他的程序包所依賴,但是新的程序包不能滿足此前的依賴關係,因爲他依賴的功能較老程序有,新版本中程序中沒有了,給換了,所以現在升級會出現衝突,甚至會報錯,因爲升級之後可能會影響到依賴的完整性,這時候我們如果要想忽略這個歷依賴關係強制升級,那麼我們就需要強制升級。)

 

         升級rpm軟件包的真正的用法:

                   rpm  -Uvh  PACKAGE_FILE......  //後面的省略號表示可以同時安裝多個包

        

                   rpm  -Fvh  [PACKAGE_FILE......

 

注意:上面的兩個選項-U-F之間的區別就是,-U是當程序包沒有則執行安裝操作,有則執行升級操作;而選項-F是原來的程序包有就執行升級,沒有則不進行任何操作。

 

 

注意:

         1)不要對內核進行升級操作;

                            (比方說,就想內核4.0的版本,在升級之前必須要重啓系統,所以我們一旦對內核進行升級操作,意味着我們就需要重啓系統,才能啓用新內核,或者是我們即便是現在不重啓,那麼下一次重啓也會啓用新內核,萬一新內核與我們的版本不兼容怎麼辦?是不是啓動不了了?這麼這個時候我們應該怎樣辦呢?我們就需要進入救援模式了。所以不建議對內核進行升級操作。那麼不升級,我有希望測試新版本怎麼辦?

         那麼有一個辦法,linux支持多內核版本並存,因此我們打算升級內核的時候,我們可以直接進行安裝新內核。)

         2)如果某原程序包的配置文件安裝後曾被修改過,那麼新版本的程序提供的同一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名後提供保存,重命名的格式:FILENAME.rpmnew這個表示:原來的文件名字後面跟上“.rpmnew

 

 

升級程序包的演示操作:(在centos7上)

         1)我們去阿里雲的鏡像網站上下載一個程序包,我們就升級上次安裝的zsh他的版本是zsh-4.3.11-4.el6.centos.2.x86_64.rpm,查看現在安裝的程序版本,我們可以在命令行中使用命令“rpm  -ql  程序前一個字符”然後tab鍵補全,我們就能查看我們安裝的某程序的版本。

         我們進入“mirrors.aliyun.com”這個網站,然後進入下面的目錄:

http://mirrors.aliyun.com/centos/7.2.1511/updates/x86_64/Packages/找到zsh的最新版本進行下載。

 

         2)我們通過Xshell這個遠程連接工具將這個程序包複製到linux系統上。

wKioL1gyvt7SHM2zAAA3MmMlsmw255.png

我們將這個程序包複製到root用戶的家目錄。

第二當我們的系統是linux系統,我們在將“zsh”程序下載後,然後如果是需要將這個程序從一個主機發送到另一個主機上進行安裝,那麼我們需要使用Xshell工具,在命令行中執行一下命令:

[root@centos6 ~]# scp  /root/zsh-5.0.2-14.el7_2.2.x86_64.rpm  192.168.178.131:/root/

The authenticity of host '192.168.178.131(192.168.178.131)' can't be established.

RSA key fingerprint is64:8c:31:ff:e7:e2:58:31:1e:b7:b6:f2:75:fc:e0:8a.

Are you sure you want to continueconnecting (yes/no)? y

Please type 'yes' or 'no': yes

Warning: Permanently added'192.168.178.131' (RSA) to the list of known hosts.

[email protected]'s password: 需要輸入對方的主機的密碼

zsh-5.0.2-14.el7_2.2.x86_64.rpm                     100% 2434KB   2.4MB/s  00:00   

[root@centos6 ~]#

 

如果是我們將這個程序包拷貝到對方主機上的某個普通用戶的家目錄下:則對方主機IP前面需要加上這個普通用戶的名稱,並用@連接,複製普通用戶的家目錄,我們要注意是/home/USERNAME

 

[root@centos6 ~]# scp zsh-5.0.2-14.el7_2.2.x86_64.rpm [email protected]:/home/dong

[email protected]'s password:

zsh-5.0.2-14.el7_2.2.x86_64.rpm                     100% 2434KB   2.4MB/s  00:00   

[root@centos6 ~]#

 

3)升級zsh

[root@centos7 ~]# rpm -Uvh zsh-5.0.2-14.el7_2.2.x86_64.rpm

警告:zsh-5.0.2-14.el7_2.2.x86_64.rpm: V3 RSA/SHA256Signature, 密鑰 ID f4a80eb5: NOKEY

準備中...                         ################################# [100%]

正在升級/安裝...

  1:zsh-5.0.2-14.el7_2.2            ################################# [ 50%]

正在清理/刪除...

  2:zsh-5.0.2-14.el7                ################################# [100%]

[root@centos7 ~]# rpm -q zsh

zsh-5.0.2-14.el7_2.2.x86_64

[root@centos7 ~]#

 

 

卸載rpm包:

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

 

         大多數情況下選項“-e”都能完成卸載操作。

注意:我們在安裝,升級和查詢的時候後面是PACKAGE_FILE,這是時安裝程序包的路徑;但是卸載的時候是PACKAGE_NAME這是代表程序包的名稱。

 

         選項:

                   --allmatches:表示卸載所有匹配指定名稱的程序包的各版本;

                   --nodeps:忽略依賴關係

                   --test:測試卸載,dry run幹跑模式;

 

 

查詢:是一個非常重要的功能

                   格式:

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

                                                        rpm  -q 後面跟上[select-options][query-options]的子選項

 

         有兩類選項:

                   注意下面的各個選項都要與-q”選項結合使用

                            1[select-options]的常用選項:

                                               PACKAGE_NAME:查詢時,直接指明程序包名。這表示查詢指定的程                                                                            序包是否已經安裝及其版本。

                                               -a,--all:查詢所有已經安裝過的包,這是就不需要給包了。

                                                                 (當我們想查詢一個包是否已經安裝,但是我們只記得其中                                                                 的幾個字符,那麼這個“-a”選項就特別有用,我們就可以                                                         結合“grep”命令來進行查找。)

                                               -f,--file後面跟上一個文件路徑:這表示查詢指定文件是由哪個程序                                                                                                                    包生成的。

                                               -g,--group:表示查詢指定的包組中,包含了那些程序包。

                                               -p,--package:表示對未安裝的程序包進行查詢操作,一般查詢什麼,                                                                           他需要跟 [query-options][select-options]中的選項結合                                                                     起來使用。

                                               --whatprovidesCAPABILITY:查詢指定的功能,是由哪個程序包安裝。

                                               --whatrequiresCAPABILITY:查詢指定的功能,被誰所依賴。

 

                            2[query-options]常用選項:

                                                  --changelog:查詢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  PACAGE_FILE,  -qpc PACKAGE_FILE,.......

 

演示:“--provides”和“whatprovides”選項的用法:

[root@centos7 ~]# rpm -q --provides bash

/bin/bash

/bin/sh

bash = 4.2.46-19.el7

bash(x86-64) = 4.2.46-19.el7

config(bash) = 4.2.46-19.el7

[root@centos7 ~]# rpm -q --whatprovides bash

bash-4.2.46-19.el7.x86_64

[root@centos7 ~]# rpm -q --whatprovides 'config(bash)'                 //因爲括號在shell中有特殊                                                                                                                         的意義,所以使用單引號引起來                                                                                                                         表示強引用。

bash-4.2.46-19.el7.x86_64

[root@centos7 ~]#

 

 

 

校驗:

         格式:

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

 

         執行校驗操作時,他們表現的意義是什麼?

     --verify test:

 

      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@centos7 ~]# rpm -ivh zsh-5.0.2-14.el7_2.2.x86_64.rpm

警告:zsh-5.0.2-14.el7_2.2.x86_64.rpm: V3 RSA/SHA256Signature, 密鑰 ID f4a80eb5: NOKEY

準備中...                         ################################# [100%]

正在升級/安裝...

  1:zsh-5.0.2-14.el7_2.2            ################################# [100%]

[root@centos7 ~]# rpm -V zsh                  //校驗時我們用大寫“-V”選項,校驗沒有任何信息輸                                                                             出,說明我們這個程序包安裝成功

[root@centos7 ~]#

[root@centos7 ~]# rpm -ql zsh                 //查看zsh安裝了多少個文件

[root@centos7 ~]# file /usr/share/zsh/5.0.2/functions/zfparams  //隨便找一個文件看看是什                                                                                                                               麼格式

/usr/share/zsh/5.0.2/functions/zfparams: ASCII text

 [root@centos7 ~]# vim /usr/share/zsh/5.0.2/functions/zfparams  //編輯這個文件,然後在裏                                                                                                                                      面僅僅是加一個#

[root@centos7 ~]# rpm -V zsh                  //再次進行校驗,發現就報錯了

S.5....T.   /usr/share/zsh/5.0.2/functions/zfparams  // S.5....T.  這裏面的每一個點表示這一個屬性,點表示這個屬性沒有被修改過,如果這個屬性被更改了就表示這個屬性的特性,或者那個字符,S就表示大小的意思,S出現了就表示大小發生變化了,沒出現就表示大小沒有發生變化,比方說我們加了一個字符,就表示大小發生變化了,如果是我們僅僅是改了一個字符呢,就可能是大小沒有改變,但是任何信息改了,那麼他的MD5碼就發生改變了,這個5就表示數據指紋信息,

                  

 

(通過上面的演示例子我們發現,校驗的作用:當我們安裝一個程序包時,我們發現某個文件被修改了,但是我們自己確認,我們從來沒有改過,其實我們到現在爲止我們應該知道,在linux中有一個重要的法則,沒有消息就是最好的消息。他沒有告訴我們有任何錯,這表示我們再安裝一些程序是成功了,但如果不是加“-v小寫”出現的信息,我就要看一下,通常必須引起注意,) 

 

 

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

 

         來源合法性驗證:

         完整性驗證:

                   獲取並導入信任 的包製作者的祕鑰:

                                     (其實這個公鑰文件我們也可以去目錄“/etc/pki/rpm-gpg”下找,因爲這個在我們安裝安裝系統後,會自動將祕鑰複製到這個目錄下,)

                   對於cenots發行版來講:導入文件:

rpm  --import /etc/pki/rpm-gpg/ RPM-GPG-KEY-CentOS-7

 

驗證:

                   1)安裝次組織簽名的程序時,會自動執行驗證:

                   2)手動驗證:rpm  -K  PACKAGE_FILE

 

所有的數字簽名都是用自己的私鑰去加密自己程序包對應的數字特徵碼。

         數字簽名可以實現兩個功能:

                   1)來源合法性進行驗證

                   2)包的完整性進行驗證

 

我們也發現,單向加密和私鑰加密並不是對文件進行保密。

 

(我們現在拿到一個程序包,那麼怎樣去驗證這個程序包是合法的?

         首先這個程序包的製作者首先要信任他,這是第一點,那麼這個信任的機構做了程序包以後,要在這個程序包上加蓋自己的印籤,在程序上這就叫數字簽名,)

 

 

                   數字簽名:

         (那麼數字簽名是怎樣實現的呢?

                            我們之前講過一個加密方式叫非對稱加密,就是他的祕鑰是成對出現,一個叫公鑰一個叫私鑰,公鑰加密的只能使用與之配對的私鑰解密,反之亦然,那麼一個組織或個人在製作一個程序包以後,用自己的私鑰去簽名,放在這個包後面,公鑰就是公開的,所以我們拿着這個公鑰能夠解密出來,就可以說這就是,那我們加密的是什麼數據呢?我們不能加密整個文件,這樣人們就看不見這個文件了,這裏純粹就是簽名,我們加密的是程序包的校驗碼,什麼是校驗碼?校驗碼就是我們先利用單向加密將這個程序包的特徵碼算出來,我們知道特徵碼是固定的長度,不管我們的包有多大,特徵碼都那麼長,

         所以包的製作者先用單向加密將包的特徵碼計算出來,定長輸出,然後再用自己的私鑰去加密這個特徵碼,這就叫數字簽名,並把這個特徵碼附加在包後面,

         那誰能解密?拿到公鑰去解密,所以這裏的私鑰不是處於加密目的的,而是驗證目的的,用公鑰加密是做來源身份驗證的,那公鑰解密出來的數據有用嗎?

                   當然有用,我們可以用同樣的算法去計算這個文件的特徵碼,然後跟這個解密出來的特徵碼進行比對,一樣就表示包沒有被別人改過。

         這裏其實我們要明白,當我們只做的程序包,用單向加密算出特徵碼後,然後再用我們的私鑰要將這個特徵碼進行加密,那麼第三者是可以使用我們的公鑰將我們的加密的特徵碼進行解密的,第三者可以更改我們的程序包,並且他也可以更改我們的特徵碼,但是爲什麼一般不會改呢,因爲一旦改了特徵碼,他在加密只能使用他自己的私鑰進行加密,那麼我們的客戶用我們的公鑰去解密時,就發現這個包不是我們發的,所以就不使用我們的包了,所以很簡單一般特徵碼是不被改變的。)

 

合法獲得公鑰其實是最重要的一步:

         其實這一步很難,世界上沒有萬無一失的安全性,互聯網上其實是通過CA來實現的,CA叫簽證機構,或者叫第三方證書頒發機構,我們現在秩序知道我們需要假設通過一個合法的途徑來拿到公鑰。至於怎樣拿到在後面細講。

 

完整性驗證:

         如果只是對rpm包進行驗證的話,我們只需將rpm包的公鑰導入進去即可,對於光盤上rpm包的公鑰就在光盤上,我們切換到光盤的掛載目錄下,ls命令會看到一個文件“  RPM-GPG-KEY-CentOS-7

那麼只需將這個文件導入rpm 包後,以後在安裝程序包時就不會出現應該說“NOKEY”了

 

 

 

演示操作:

[root@centos7 ~]# rpm -ivh zsh-5.0.2-14.el7_2.2.x86_64.rpm

警告:zsh-5.0.2-14.el7_2.2.x86_64.rpm: V3 RSA/SHA256Signature, 密鑰 ID f4a80eb5: NOKEY

準備中...                         ################################# [100%]

正在升級/安裝...

  1:zsh-5.0.2-14.el7_2.2             #################################[100%]

[root@centos7 ~]# rpm -e zsh

[root@centos7 ~]# rpm --import /media/RPM-GPG-KEY-CentOS-7  //導入用“--import”選項

[root@centos7 ~]# rpm -ivh zsh-5.0.2-14.el7_2.2.x86_64.rpm   //再次安裝就不會出現NOKEY

準備中...                          #################################[100%]

正在升級/安裝...

  1:zsh-5.0.2-14.el7_2.2            ################################# [100%]

[root@centos7 ~]#

 

上面是自動進行校驗操作,下面我們也可以進行手動校驗操作:

[root@centos7 ~]# rpm -K zsh-5.0.2-14.el7_2.2.x86_64.rpm   //用選項大寫“-K

zsh-5.0.2-14.el7_2.2.x86_64.rpm: rsa sha1(md5) pgp md5 確定  //pgp:來源合法性;MD5                                                                                                                           完整性認證之前要將公鑰                                                                                                                              導入

[root@centos7 ~]#

 

 

數據庫重建:

 

這個數據庫是不能隨便破壞或者手動進行測試的。

我們知道使用命令“rpm  -qa”會顯示我們安裝了那些程序包,或者使用“rpm  -ql  程序名”會顯示這個程序安裝時產生的文件,那麼我們就想,他是怎樣知道我們的程序安裝了那些文件,這個rpm正是通過本地的記錄的一個數據庫來定義的。

 對於rpm這個命令來講他的數據庫就是“/var/lib/rpm

 

         rpm管理器數據庫路徑:/rpm/lib/rpm

                   查詢操作:通過此處的數據庫進行。

 

                  

         獲取幫助:

                   CentOS6man  rpm

                   CentOS7man  rpmdb

 

         CentOS7爲例:

                     rpm {--initdb|--rebuilddb} [-v] [--dbpathDIRECTORY] [--root DIRECTORY]

                                     --initdb:初始化數據庫,當前無任何數據庫可初始化創建一個新的;當前                                          有時不執行任何操作;

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

                               --dbpath DIRECTORY:表示地址創建數據庫的路徑

 

演示在指定的路徑下創建rpm數據庫

[root@centos7 ~]# mkdir /tmp/rpm

[root@centos7 ~]# rpm --initdb --dbpath=/tmp/rpm

[root@centos7 ~]# ls /tmp/rpm/

Basenames     __db.002 Group       Obsoletename  Requirename Triggername

Conflictname  __db.003 Installtid  Packages      Sha1header

__db.001      Dirnames Name        Providename   Sigmd5

[root@centos7 ~]#

[root@centos7 ~]# rpm --rebuilddb --dbpath=/tmp/rpm

[root@centos7 ~]# ls /tmp/rpm/              //重建後我們發現__db.002__db.003__db.001這些                                                                                文件沒有了,其實這些文件是進行事物操作的。 

Basenames     Group      Obsoletename  Requirename  Triggername

Conflictname  Installtid Packages      Sha1header

Dirnames      Name        Providename   Sigmd5

[root@centos7 ~]#

 

 

博客作業:rpm包管理功能全解;


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