溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

rpm程序包管理器詳解

發(fā)布時間:2020-06-27 10:41:25 來源:網(wǎng)絡(luò) 閱讀:511 作者:iTab 欄目:數(shù)據(jù)庫

1. 程序包管理器的功能


    我們知道,由程序員編寫并提供的程序源代碼要轉(zhuǎn)換成目標(biāo)二進(jìn)制格式才能在計算機(jī)上運(yùn)行起來,但用戶要在平臺上使用時需要手動編譯安裝后才能使用,對于普通用戶來說有一定難度。因此為了降低普通用戶對應(yīng)用程序的使用難度,程序員可在提供源代碼的同時提供已在特定環(huán)境下編譯好的程序文件,只要用戶的平臺環(huán)境和程序員的平臺環(huán)境相同,就可以通過解壓程序員提供的二進(jìn)制格式文件即可使用,而無需自己手動編譯安裝。


    一個已編譯好的程序由二進(jìn)制程序、庫文件、配置文件和幫助手冊等組成,程序包管理器的功能就是將編譯好的應(yīng)用程序的各組成文件(二進(jìn)制程序、庫文件、配置文件、幫助文件等)打包成一個或幾個程序包文件,從而更方便地實現(xiàn)程序包的安裝、升級、卸載和查詢等管理操作。


2. 源碼到程序包的轉(zhuǎn)換過程

rpm程序包管理器詳解rpm程序包管理器詳解

3. rpm包管理器概述


    rpm是Redhat公司針對自己的操作系統(tǒng)RHEL提出的一種管理軟件包的方法,rpm原來全稱為RedHat Package Manager,后來由于rpm包管理器的使用方便以及Redhat公司采取各種商業(yè)策略,使得rpm成為了工業(yè)標(biāo)準(zhǔn),其他系統(tǒng)可借鑒使用rpm,因此rpm全稱后來改為:RPM Package Manager。在系統(tǒng)上只要安裝了rpm包管理器,那么只要符合rpm標(biāo)準(zhǔn)的程序包文件都可以實現(xiàn)更為方便地安裝、升級、卸載和查詢等管理操作。



4. 為什么要使用rpm?


    Linux的哲學(xué)思想之一是“一個程序只做一件事,并且做好”。因此Linux經(jīng)常通過使用眾多功能單一的程序來完成復(fù)雜任務(wù),最常見的例子是管道命令的使用。而各個程序功能的單一,帶來的問題是各個程序文件之間的產(chǎn)生了極大的依賴性,這是一個需要解決的問題。此外,要安裝各種功能的程序,而各程序在安裝時的路徑、生成的文件各不相同,這給卸載某程序?qū)順O×××煩,極不方便管理,以及對程序的版本的管理等。在Linux上只要安裝rpm包管理器即可解決以上問題,rpm包管理器可將編譯好的各個應(yīng)用程序組成文件打包成一個或有限個rpm程序包,每個包中會記錄當(dāng)前包的依賴性。一旦程序包安裝了之后,rpm會追蹤其各個文件的安裝路徑(包括程序運(yùn)行時產(chǎn)生的臨時文件)。rpm包管理器就是通過這種方式來實現(xiàn)對rpm程序包的管理的,而對程序包的管理無外乎是安裝、升級、卸載、查詢等操作。



5. 程序包管理器的組成部分


程序包管理器由程序包組成清單數(shù)據(jù)庫兩部分組成:

(1)程序包的組成清單(每個程序都單獨實現(xiàn)):

    ①文件清單

    ②安裝或卸載時運(yùn)行的腳本

(2)數(shù)據(jù)庫(為所有rpm程序包所共用):

    ①程序包的名稱和版本

    ②依賴關(guān)系

    ③功能說明

    ④安裝生成的各個文件的文件路徑及校驗碼信息



6. rpm包命名格式


    rpm包有主包支包(主包的子包)之分,支包作為主包的功能性補(bǔ)充。其中rpm主包的命名格式為:name-VERSION-release.arch.rpm。各個部分解釋如下:

name:程序名

VERSION:版本

    VERSION由三部分組成:

    ①major:程序的主版本號

    ②minor:程序的次版本號

    ③release:程序的修訂號

release[.os].arch:代表rpm包的發(fā)行號

    ①release[.os]:rpm版本+操作系統(tǒng)

    ②arch:archetecture,支持的硬件架構(gòu)。常見的硬件架構(gòu)有i386, x64(amd64), ppc, noarch(支持任何架構(gòu))等


各組成部分示意圖如下:

rpm程序包管理器詳解

舉個例子,zsh-5.0.2-25.el7.x86_64.rpm代表:該zsh程序包的主版本號為5,次版本號為0,修訂號為2;rpm的版本號為25,支持的操作系統(tǒng)是RHEL 7(CentOS 7),支持的硬件架構(gòu)是x86_64。


對于支包來說,其命名格式為:

name-function-VERSION-release.arch.rpm

常見的function有:devel, utils(工具程序), libs, ...



7. 獲取程序包的途徑


如何獲取rpm包呢?

(1)系統(tǒng)發(fā)行版的光盤或官方的文件服務(wù)器(或鏡像站點)

    常見的鏡像網(wǎng)站如:

    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)自己制作rpm包

建議:檢查其合法性(來源合法性、程序包的完整性)



8. CentOS系統(tǒng)上rpm命令管理程序包


8.1. 安裝

語法格式:

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


常用命令選項:

    -v:verbose,輸出詳細(xì)的過程信息;

    -vv:very verbose,輸出更為詳細(xì)的過程信息;


安裝選項(install-options):

    -h:hash marks輸出進(jìn)度條;hash標(biāo)記符為#,每個#表示2%的進(jìn)度;

    --test:測試安裝,檢查并報告依賴關(guān)系及沖突信息等;相當(dāng)于dry run;

    --nodeps:忽略依賴關(guān)系,不建議使用;

    --replacepkgs:重新安裝;

    --noscripts:指定不運(yùn)行腳本;

    --nosignature:不檢查包簽名信息,即不檢查程序包的來源合法性;

    --nodigest:不檢查包完整性信息;


用法:

    rpm -ivh PACKAGE_FILE ...


注意:rpm可以自帶腳本

最多有四類腳本:(--noscripts可指定不運(yùn)行這四類腳本)

preinstall:安裝過程開始之前運(yùn)行的腳本,%pre;--nopre可指定不運(yùn)行;

postinstall:安裝過程完成之后運(yùn)行的腳本,%post;--nopost可指定不運(yùn)行;

preuninstall:卸載過程真正開始執(zhí)行之前運(yùn)行的腳本,%preun;--nopreun可指定不運(yùn)行;

postuninstall:卸載過程完成之后運(yùn)行的腳本,%postun;--nopostun可指定不運(yùn)行;


命令演示:


安裝zsh,首先掛載光盤:

[root@osyunwei ~]# mkdir /media/cdrom
[root@osyunwei ~]# mount /dev/sr0 /media/cdrom
mount: block device /dev/sr0 is write-protected, mounting read-only


用rpm下載zsh:

[root@osyunwei ~]# cd /media/cdrom/Packages/
[root@osyunwei Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.2.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]


8.2. 升級

語法格式:

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

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


常用選項:

    -U:升級或安裝;

    -F:升級;

    -v:同“安裝”;

    -vv:同“安裝”.


安裝選項(install-options):

    --oldpackage:降級 --> 某些程序升級后遇到不兼容的情況,此時需要降級;

    --force:強(qiáng)制升級 --> 某些程序升級后會引起依賴性問題,此時可能會用到此選項;

    

    其他安裝選項同“安裝”。


用法:

    rpm -Uvh PACKAGE_FILE ...

    rpm -Fvh PACKAGE_FILE ...


注意:

(1)Linux支持多內(nèi)核版本并存,所以不要對內(nèi)核做升級操作,因為這樣有可能會導(dǎo)致無法“回滾”,建議直接安裝新版本內(nèi)核即可。

(2)如果某原程序包的配置文件安裝后曾被修改過,則在升級時,新版本的程序提供的同一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;


命令演示:


查看當(dāng)前已安裝的zsh的版本:

[root@osyunwei ~]# rpm -q zsh
zsh-4.3.11-4.el6.centos.2.x86_64


從網(wǎng)易鏡像站點下載zsh-5.0.2-25.el7_3.1.x86_64.rpm程序包:

[root@osyunwei ~]# wget http://mirrors.163.com/centos/7/updates/x86_64/Packages/zsh-5.0.2
25.el7_3.1.x86_64.rpm


用rpm升級zsh:

[root@osyunwei ~]# rpm -Uvh zsh-5.0.2-25.el7_3.1.x86_64.rpm 
warning: zsh-5.0.2-25.el7_3.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5
: NOKEY
error: Failed dependencies:
libc.so.6(GLIBC_2.14)(64bit) is needed by zsh-5.0.2-25.el7_3.1.x86_64
libc.so.6(GLIBC_2.15)(64bit) is needed by zsh-5.0.2-25.el7_3.1.x86_64

發(fā)現(xiàn)有依賴關(guān)系導(dǎo)致無法升級。


此時若要強(qiáng)行升級可使用--nodeps選項:

[root@osyunwei ~]# rpm -Uvh --nodeps zsh-5.0.2-25.el7_3.1.x86_64.rpm
warning: zsh-5.0.2-25.el7_3.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5
: NOKEY
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]

注意:忽略依賴性升級后程序不一定能正常運(yùn)行!


再將zsh降級:

[root@osyunwei ~]# cd /media/cdrom/Packages/
[root@osyunwei Packages]# rpm -Uvh --oldpackage zsh-4.3.11-4.el6.centos.2.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]



8.3. 卸載

語法格式:

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


卸載選項(erase options):

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

    --nodeps:忽略依賴關(guān)系;

    --test:測試卸載,dry run模式。


用法:

    rpm -e PACKAGE_NAME


命令演示:


卸載已安裝的zsh程序包:

[root@osyunwei ~]# rpm -e zsh

如果沒有任何顯示就說明卸載成功了!



8.4. 查詢

語法格式:

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


[select-options]:

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

    -a, --all:查詢所有已經(jīng)安裝過的包;

    -f, --file FILE:查詢指定的文件由哪個程序包安裝生成;

    -p, --package PACKAGE_FILE:用于實現(xiàn)對未安裝的程序包執(zhí)行查詢操作;

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

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


[query-options]:

    --changelog:查詢rpm包的changelog;

    -i, --info:程序包相關(guān)的信息,版本號、大小、所屬的包組等

    -l, --list:程序包安裝生成的所有文件列表;

    -c, --configfiles:查詢指定的程序包提供的配置文件;

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

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

    -R, --requires:查詢指定的程序包的依賴關(guān)系;

    --scripts:查看程序包自帶的腳本片段。


用法:

    rpm -qi PACKAGE

    rpm -qf FILE

    rpm -qc PACKAGE

    rpm -qd PACKAGE

    rpm -qpi PACKAGE_FILE

    rpm -apl PACKAGE_FILE

    rpm -qpc PACKAGE_FILE


列了這么多個選項,不如來個實例吧!


(1)查看zsh是否已經(jīng)安裝:

[root@osyunwei ~]# rpm -qa | grep '^zsh'
zsh-4.3.11-4.el6.centos.2.x86_64    //顯示已安裝zsh;
或:
[root@osyunwei ~]# rpm -q zsh
zsh-4.3.11-4.el6.centos.2.x86_64    //顯示已安裝zsh;


(2)查詢/etc/fstab由哪個程序包安裝生成:

[root@osyunwei ~]# rpm -qf /etc/fstab 
setup-2.8.14-20.el6_4.1.noarch


(3)列出安裝httpd生成的所有文件列表:

[root@osyunwei ~]# rpm -ql httpd


(4)列出httpd程序包的依賴關(guān)系:

[root@osyunwei ~]# rpm -qR httpd
/bin/bash  
/bin/sh  
.....(省略).....
libz.so.1()(64bit)  
rpmlib(CompressedFileNames) <= 3.0.4-1
.....(省略).....
rpmlib(VersionedDependencies) <= 3.0.3-1
rtld(GNU_HASH)  
system-logos >= 7.92.1-1
rpmlib(PayloadIsXz) <= 5.2-1


(5)查看httpd程序包提供的文檔:

[root@osyunwei ~]# rpm -qd httpd
/usr/share/doc/httpd-2.2.15/ABOUT_APACHE
/usr/share/doc/httpd-2.2.15/CHANGES
/usr/share/doc/httpd-2.2.15/LICENSE
/usr/share/doc/httpd-2.2.15/NOTICE
/usr/share/doc/httpd-2.2.15/README
/usr/share/doc/httpd-2.2.15/VERSIONING
/usr/share/man/man8/apachectl.8.gz
/usr/share/man/man8/htcacheclean.8.gz
/usr/share/man/man8/httpd.8.gz
/usr/share/man/man8/rotatelogs.8.gz
/usr/share/man/man8/suexec.8.gz


(6)查詢httpd程序包提供的配置文件:

[root@osyunwei ~]# rpm -qc httpd
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
/var/www/error/HTTP_BAD_GATEWAY.html.var
/var/www/error/HTTP_BAD_REQUEST.html.var
.....(以下省略).....


(7)查看httpd程序包自帶的腳本片段:

[root@osyunwei ~]# rpm -q --scripts httpd


(8)列出bash程序包提供的所有的CAPABILITY:

[root@osyunwei ~]# rpm -q --provides bash
config(bash) = 4.1.2-40.el6
bash = 4.1.2-40.el6
bash(x86-64) = 4.1.2-40.el6


(9)查看httpd程序包提供的所有的CAPABILITY:

[root@osyunwei ~]# rpm -q --provides httpd
config(httpd) = 2.2.15-53.el6.centos
httpd-mmn = 20051115
httpd-suexec = 2.2.15-53.el6.centos
.....(中間省略).....
mod_vhost_alias.so()(64bit)  
webserver  
.....(以下省略).....


(10)查詢指定的CAPABILITY (這里為webserver)由哪個程序包提供:

[root@osyunwei ~]# rpm -q --whatprovides webserver
httpd-2.2.15-53.el6.centos.x86_64


(11)查詢指定的CAPABILITY (這里為bash)被哪個包所依賴:

[root@osyunwei ~]# rpm -q --whatrequires bash
jline-0.9.94-0.8.el6.noarch
initscripts-9.03.53-1.el6.centos.x86_64
dracut-004-409.el6.noarch
lvm2-2.02.143-7.el6.x86_64
rsyslog-5.8.10-10.el6_6.x86_64
cronie-1.4.4-15.el6_7.1.x86_64
autofs-5.0.5-122.el6.x86_64
eclipse-pde-3.6.1-6.13.el6.x86_64


(12)查看bash的更新日志(changelog):

[root@osyunwei ~]# rpm -q --changelog bash
...
* Fri Oct 17 1997 Donnie Barnes <djb@redhat.com>
- added BuildRoot
* Tue Jun 03 1997 Erik Troan <ewt@redhat.com>
- built against glibc


(13)查看程序包相關(guān)的信息,版本號、大小、所屬的包組等:

[root@osyunwei ~]# rpm -qi zsh

rpm程序包管理器詳解



8.5. 校驗

用途:可檢查程序包中的數(shù)據(jù)是否被修改過。


語法格式:

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


用法:

    rpm -V PACKAGE_NAME


校驗屬性:

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


命令演示:


修改zsh程序包的配置文件,首先查看zsh程序包的配置文件有哪些:

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


用vim修改/etc/zshrc文件,在首行添加一個'#'字符,然后再用-V選項檢驗:

[root@osyunwei ~]# vim /etc/zshrc
[root@osyunwei ~]# rpm -V zsh
S.5....T.  c /etc/zshrc

顯然,文件/etc/zshrc的大小、md5值、時間戳(mtime)發(fā)生了變化。



8.6. 數(shù)據(jù)庫重建


默認(rèn)rpm管理器的數(shù)據(jù)庫路徑為/var/lib/rpm,剛才的查詢操作正是通過此處的數(shù)據(jù)庫進(jìn)行。


獲取幫助:

    CentOS 6:man rpm

    CentOS 7:man rpmdb


語法格式:

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

    

常用選項:

    --initdb:初始化數(shù)據(jù)庫,當(dāng)前無任何數(shù)據(jù)庫可初試化創(chuàng)建一個新的數(shù)據(jù)庫;當(dāng)前有時不執(zhí)行任何操作;

    --rebuilddb:重新構(gòu)建,通過遍歷讀取當(dāng)前系統(tǒng)上所有已經(jīng)安裝過的程序包進(jìn)行重新創(chuàng)建;


命令演示:


在/tmp/mydb目錄下創(chuàng)建初始化數(shù)據(jù)庫:

[root@osyunwei ~]# rpm --initdb --dbpath /tmp/mydb
[root@osyunwei ~]# ls /tmp/mydb/
__db.001  __db.002  __db.003  __db.004  Packages


在/tmp/mydb目錄下重新創(chuàng)建數(shù)據(jù)庫:

[root@osyunwei ~]# rpm --rebuilddb --dbpath /tmp/mydb
[root@osyunwei ~]# ls /tmp/mydb/
Packages

注意:不一定能夠重建完整的數(shù)據(jù)庫,所以慎用該命令吧!



8.7. 包來源合法性驗證和完整性驗證



首先要了解一下什么是數(shù)字簽名?

    數(shù)字簽名就是用本地密鑰去加密對應(yīng)數(shù)據(jù)的特征碼。

    程序包開發(fā)者將程序包制作好之后,采用單向加密算法對程序包進(jìn)行計算,得到定長特征碼,再用私鑰對這段定長特征值進(jìn)行加密,并將加密過的特征碼附于程序包尾部,這就是數(shù)字簽名。程序使用者先得到開發(fā)者的公鑰,用于解密特征碼,如果解密成功,說明來源合法;然后使用者在本地對該程序包用單向加密算法再次計算出定長特征碼,如果使用者計算出的特征碼和程序開發(fā)者提供的特征碼相同,則說明程序數(shù)據(jù)完整。雖然用了兩種加密算法,但卻沒有保密性的概念,而是作為驗證。

    特征碼有沒有被篡改的可能性?假設(shè)中間人得到程序包的特征值后,想篡改特征碼,但篡改后需要用本地私鑰進(jìn)行加密,因此來源就不合法了,更不用談完整性了,所以特征碼是無法修改的。

    但存在一個問題,就是使用者如何獲得正確的公鑰?這要求下載公鑰的網(wǎng)站的正確性以及數(shù)據(jù)在網(wǎng)絡(luò)傳輸過程中的安全性,涉及網(wǎng)絡(luò)安全問題。


圖解數(shù)字簽名rpm程序包管理器詳解

rpm程序包管理器詳解

對于CentOS發(fā)行版來說,假設(shè)已獲取正確的公鑰,那么導(dǎo)入信任的包制作者的公鑰(或簽名密鑰)操作如下:

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


兩種驗證方式:

(1)安裝此組織簽名的程序時,程序內(nèi)部會自動執(zhí)行驗證。

(2)手動驗證:rpm -K PACKAGE_FILE,同樣由程序內(nèi)部自行執(zhí)行校驗操作。



命令演示:


校驗zsh程序包的來源合法性及數(shù)據(jù)完整性:

[root@osyunwei Packages]# rpm -K zsh-4.3.11-4.el6.centos.2.x86_64.rpm 
zsh-4.3.11-4.el6.centos.2.x86_64.rpm: rsa sha1 (md5) pgp md5 OK    //校驗通過;





向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI