rpm包管理
1. rpm包管理器概述
源碼到程序包的轉換過程
rpm是Redhat公司針對自己的操作系統RHEL提出的一種管理軟件包的方法,rpm原來全稱爲RedHat Package Manager,後來由於rpm包管理器的使用方便以及Redhat公司採取各種商業策略,使得rpm成爲了工業標準,其他系統可借鑑使用rpm,因此rpm全稱後來改爲:RPM Package Manager。在系統上只要安裝了rpm包管理器,那麼只要符合rpm標準的程序包文件都可以實現更爲方便地安裝、升級、卸載和查詢等管理操作。
爲什麼要使用rpm?
Linux的哲學思想之一是“一個程序只做一件事,並且做好”。因此Linux經常通過使用衆多功能單一的程序來完成複雜任務,最常見的例子是管道命令的使用。而各個程序功能的單一,帶來的問題是各個程序文件之間的產生了極大的依賴性,這是一個需要解決的問題。此外,要安裝各種功能的程序,而各程序在安裝時的路徑、生成的文件各不相同,這給卸載某程序將帶來極×××煩,極不方便管理,以及對程序的版本的管理等。在Linux上只要安裝rpm包管理器即可解決以上問題,rpm包管理器可將編譯好的各個應用程序組成文件打包成一個或有限個rpm程序包,每個包中會記錄當前包的依賴性。一旦程序包安裝了之後,rpm會追蹤其各個文件的安裝路徑(包括程序運行時產生的臨時文件)。rpm包管理器就是通過這種方式來實現對rpm程序包的管理的,而對程序包的管理無外乎是安裝、升級、卸載、查詢等操作。
2. 程序包管理器的組成部分
程序包管理器由程序包組成清單和數據庫兩部分組成:
(1)程序包的組成清單(每個程序都單獨實現):
①文件清單
②安裝或卸載時運行的腳本
(2)數據庫(爲所有rpm程序包所共用):
①程序包的名稱和版本
②依賴關係
③功能說明
④安裝生成的各個文件的文件路徑及校驗碼信息
3. rpm包命名格式
rpm包有主包和支包(主包的子包)之分,支包作爲主包的功能性補充。其中rpm主包的命名格式爲:name-VERSION-release.arch.rpm。各個部分解釋如下:
name:程序名
VERSION:版本
VERSION由三部分組成:
①major:程序的主版本號
②minor:程序的次版本號
③release:程序的修訂號
release[.os].arch:代表rpm包的發行號
①release[.os]:rpm版本+操作系統
②arch:archetecture,支持的硬件架構。常見的硬件架構有i386, x64(amd64), ppc, noarch(支持任何架構)等
各組成部分示意圖如下:
舉個例子,zsh-5.0.2-25.el7.x86_64.rpm代表:該zsh程序包的主版本號爲5,次版本號爲0,修訂號爲2;rpm的版本號爲25,支持的操作系統是RHEL 7(CentOS 7),支持的硬件架構是x86_64。
對於支包來說,其命名格式爲:
name-function-VERSION-release.arch.rpm
常見的function有:devel, utils(工具程序), libs, ...
4. 獲取程序包的途徑
如何獲取rpm包呢?
(1)系統發行版的光盤或官方的文件服務器(或鏡像站點)
常見的鏡像網站如:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2)項目的官方站點
(3)第三方組織
(3)第三方組織
(a)EPEL
(b)搜索引擎
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
...
(4)自己製作rpm包
建議:檢查其合法性(來源合法性、程序包的完整性)
5. CentOS系統上rpm命令管理程序包
5.1. 安裝
語法格式:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
常用命令選項:
-v:verbose,輸出詳細的過程信息;
-vv:very verbose,輸出更爲詳細的過程信息;
安裝選項(install-options):
-h:hash marks輸出進度條;hash標記符爲#,每個#表示2%的進度;
--test:測試安裝,檢查並報告依賴關係及衝突信息等;相當於dry run;
--nodeps:忽略依賴關係,不建議使用;
--replacepkgs:重新安裝;
--noscripts:指定不運行腳本;
--nosignature:不檢查包簽名信息,即不檢查程序包的來源合法性;
--nodigest:不檢查包完整性信息;
用法:
rpm -ivh PACKAGE_FILE ...
注意:rpm可以自帶腳本
最多有四類腳本:(--noscripts可指定不運行這四類腳本)
preinstall:安裝過程開始之前運行的腳本,%pre;--nopre可指定不運行;
postinstall:安裝過程完成之後運行的腳本,%post;--nopost可指定不運行;
preuninstall:卸載過程真正開始執行之前運行的腳本,%preun;--nopreun可指定不運行;
postuninstall:卸載過程完成之後運行的腳本,%postun;--nopostun可指定不運行;
命令演示:
安裝zsh,首先掛載光盤:
[root@osyunwei ~]# mkdir /media/cdrom
[root@osyunwei ~]# mount /dev/sr0 /media/cdrommount: 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%]
5.2. 升級
語法格式:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
常用選項:
-U:升級或安裝;
-F:升級;
-v:同“安裝”;
-vv:同“安裝”.
安裝選項(install-options):
--oldpackage:降級 --> 某些程序升級後遇到不兼容的情況,此時需要降級;
--force:強制升級 --> 某些程序升級後會引起依賴性問題,此時可能會用到此選項;
其他安裝選項同“安裝”。
用法:
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
注意:
(1)Linux支持多內核版本並存,所以不要對內核做升級操作,因爲這樣有可能會導致無法“回滾”,建議直接安裝新版本內核即可。
(2)如果某原程序包的配置文件安裝後曾被修改過,則在升級時,新版本的程序提供的同一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)後提供;
命令演示:
查看當前已安裝的zsh的版本:
[root@osyunwei ~]# rpm -q zshzsh-4.3.11-4.el6.centos.2.x86_64
從網易鏡像站點下載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.225.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
發現有依賴關係導致無法升級。
此時若要強行升級可使用--nodeps選項:
[root@osyunwei ~]# rpm -Uvh --nodeps zsh-5.0.2-25.el7_3.1.x86_64.rpmwarning: 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%]
注意:忽略依賴性升級後程序不一定能正常運行!
再將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%]
5.3. 卸載
語法格式:
rpm {-e|--erase} [--allmatches] [--nodeps] [--test] PACKAGE_NAME ...
卸載選項(erase options):
--allmatches:卸載所有匹配指定名稱的程序包的各版本;
--nodeps:忽略依賴關係;
--test:測試卸載,dry run模式。
用法:
rpm -e PACKAGE_NAME
命令演示:
卸載已安裝的zsh程序包:
[root@osyunwei ~]# rpm -e zsh
如果沒有任何顯示就說明卸載成功了!
5.4. 查詢
語法格式:
rpm {-q|--query} [select-options] [query-options]
[select-options]:
PACKAGE_NAME:查詢指定的程序包是否安裝,及其版本;
-a, --all:查詢所有已經安裝過的包;
-f, --file FILE:查詢指定的文件由哪個程序包安裝生成;
-p, --package PACKAGE_FILE:用於實現對未安裝的程序包執行查詢操作;
--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程序包提供;
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴。
[query-options]:
--changelog:查詢rpm包的changelog;
-i, --info:程序包相關的信息,版本號、大小、所屬的包組等
-l, --list:程序包安裝生成的所有文件列表;
-c, --configfiles:查詢指定的程序包提供的配置文件;
-d, --docfiles:查詢指定的程序包提供的文檔;
--provides:列出指定的程序包提供的所有的CAPABILITY;
-R, --requires:查詢指定的程序包的依賴關係;
--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是否已經安裝:
[root@osyunwei ~]# rpm -qa | grep '^zsh'zsh-4.3.11-4.el6.centos.2.x86_64 //顯示已安裝zsh;
或:[root@osyunwei ~]# rpm -q zshzsh-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程序包的依賴關係:
[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 bashconfig(bash) = 4.1.2-40.el6bash = 4.1.2-40.el6
bash(x86-64) = 4.1.2-40.el6
(9)查看httpd程序包提供的所有的CAPABILITY:
[root@osyunwei ~]# rpm -q --provides httpdconfig(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 webserverhttpd-2.2.15-53.el6.centos.x86_64
(11)查詢指定的CAPABILITY (這裏爲bash)被哪個包所依賴:
[root@osyunwei ~]# rpm -q --whatrequires bashjline-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 <[email protected]>- added BuildRoot
* Tue Jun 03 1997 Erik Troan <[email protected]>- built against glibc
(13)查看程序包相關的信息,版本號、大小、所屬的包組等:
[root@osyunwei ~]# rpm -qi zsh
5.5. 校驗
用途:可檢查程序包中的數據是否被修改過。
語法格式:
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 zshS.5....T. c /etc/zshrc
顯然,文件/etc/zshrc的大小、md5值、時間戳(mtime)發生了變化。
5.6. 數據庫重建
默認rpm管理器的數據庫路徑爲/var/lib/rpm,剛纔的查詢操作正是通過此處的數據庫進行。
獲取幫助:
CentOS 6:man rpm
CentOS 7:man rpmdb
語法格式:
rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]
常用選項:
--initdb:初始化數據庫,當前無任何數據庫可初試化創建一個新的數據庫;當前有時不執行任何操作;
--rebuilddb:重新構建,通過遍歷讀取當前系統上所有已經安裝過的程序包進行重新創建;
命令演示:
在/tmp/mydb目錄下創建初始化數據庫:
[root@osyunwei ~]# rpm --initdb --dbpath /tmp/mydb[root@osyunwei ~]# ls /tmp/mydb/__db.001 __db.002 __db.003 __db.004 Packages
在/tmp/mydb目錄下重新創建數據庫:
[root@osyunwei ~]# rpm --rebuilddb --dbpath /tmp/mydb[root@osyunwei ~]# ls /tmp/mydb/Packages
注意:不一定能夠重建完整的數據庫,所以慎用該命令吧!
5.7. 包來源合法性驗證和完整性驗證
首先要了解一下什麼是數字簽名?
數字簽名就是用本地密鑰去加密對應數據的特徵碼。
程序包開發者將程序包製作好之後,採用單向加密算法對程序包進行計算,得到定長特徵碼,再用私鑰對這段定長特徵值進行加密,並將加密過的特徵碼附於程序包尾部,這就是數字簽名。程序使用者先得到開發者的公鑰,用於解密特徵碼,如果解密成功,說明來源合法;然後使用者在本地對該程序包用單向加密算法再次計算出定長特徵碼,如果使用者計算出的特徵碼和程序開發者提供的特徵碼相同,則說明程序數據完整。雖然用了兩種加密算法,但卻沒有保密性的概念,而是作爲驗證。
特徵碼有沒有被篡改的可能性?假設中間人得到程序包的特徵值後,想篡改特徵碼,但篡改後需要用本地私鑰進行加密,因此來源就不合法了,更不用談完整性了,所以特徵碼是無法修改的。
但存在一個問題,就是使用者如何獲得正確的公鑰?這要求下載公鑰的網站的正確性以及數據在網絡傳輸過程中的安全性,涉及網絡安全問題。
圖解數字簽名 :
對於CentOS發行版來說,假設已獲取正確的公鑰,那麼導入信任的包製作者的公鑰(或簽名密鑰)操作如下:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
兩種驗證方式:
(1)安裝此組織簽名的程序時,程序內部會自動執行驗證。
(2)手動驗證:rpm -K PACKAGE_FILE,同樣由程序內部自行執行校驗操作。
命令演示:
校驗zsh程序包的來源合法性及數據完整性:
[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 //校驗通過;