我們知道計(jì)算機(jī)上運(yùn)行的程序都是通過(guò)開(kāi)發(fā)工具來(lái)制作而成的,而程序員直接編寫(xiě)的純文本文檔稱為源代碼,由于計(jì)算機(jī)識(shí)別的是二進(jìn)制程序,因此在編寫(xiě)完源代碼之后,如果想讓計(jì)算機(jī)運(yùn)行此源代碼,必須要把源代碼編譯成計(jì)算機(jī)能夠讀懂的二進(jìn)制程序。對(duì)于用戶來(lái)說(shuō),編譯源代碼并不容易。因此,為了讓用戶能夠簡(jiǎn)單使用程序,程序員可在提供源代碼的同時(shí)提供已在生產(chǎn)環(huán)境下編譯好的程序文件,只要生產(chǎn)環(huán)境相同,就可以使用該程序了,而無(wú)需自己手動(dòng)編譯安裝。
1 源代碼編譯二進(jìn)制過(guò)程

二進(jìn)制應(yīng)用程序的組成部分:二進(jìn)制文件、庫(kù)文件、配置文件、幫助文件
而程序包管理器的功能就是將編譯好的應(yīng)用程序的各組成文件打包成一個(gè)或幾個(gè)程序包文件,從而更方便地實(shí)現(xiàn)程序包的安裝、升級(jí)、卸載和查詢等管理操作。
2 rpm包管理器的由來(lái)
早期,rpm包管理工具是Redhat公司針對(duì)自己的操作系統(tǒng)RHEL提出的,全稱為RedHat Package Manager,后來(lái)由于rpm包管理器的使用方便以及Redhat公司采取各種商業(yè)策略,使得rpm成為了工業(yè)標(biāo)準(zhǔn),后來(lái)包括Fedora,Centos,Suse等知名廠商也引用了該工業(yè)標(biāo)準(zhǔn)。,因此rpm全稱后來(lái)改為:RPM Package Manager。在各個(gè)廠商中流行起來(lái)。
3 rpm包管理器功能
我們知道,安裝一個(gè)軟件,可能需要依賴其他的軟件才能使用,即軟件屬性相依的問(wèn)題,那我們?nèi)绾谓鉀Q依賴問(wèn)題呢?此時(shí),rpm包管理器就可以派上用場(chǎng)了,它可以很好的解決軟件包之間的依賴問(wèn)題。rpm包管理器可將編譯好的各個(gè)應(yīng)用程序組成文件打包成一個(gè)或有限個(gè)rpm程序包,每個(gè)包中會(huì)記錄當(dāng)前包的依賴性。一旦程序包安裝了之后,rpm會(huì)追蹤其各個(gè)文件的安裝路徑。rpm包管理器就是通過(guò)這種方式來(lái)實(shí)現(xiàn)對(duì)rpm程序包的管理的,而對(duì)程序包的管理無(wú)外乎是安裝、升級(jí)、卸載、查詢等操作。
程序包管理器有:
| 發(fā)行版代表 | 軟件管理機(jī)制 | 使用命令 |
|---|---|---|
| debian | dpkg 包管理器 | deb |
| redhat | rpm 包管理器 | rpm |
| Fedora(+18之后 ) | dnf 包管理器 | dnf |
4 rpm包管理器的組成部分
程序包管理器由程序包組成清單和數(shù)據(jù)庫(kù)兩部分組成:
(1)程序包的組成清單(每個(gè)程序都單獨(dú)實(shí)現(xiàn)):
***文件清單
***安裝或卸載時(shí)運(yùn)行的腳本
(2)數(shù)據(jù)庫(kù)(為所有rpm程序包所共用):
***程序包的名稱和版本
***依賴關(guān)系
***功能說(shuō)明
***安裝生成的各個(gè)文件的文件路徑及校驗(yàn)碼信息
5 rpm包命名格式
** 源代碼:name-VERSION.tar.gz|bz2|xz**
** rpm 包命名方式:name-VERSION-release.arch.rpm**
name-VERSION-release.arch.rpm
例: :bash-4.2.46-19.el7.x86_64.rpm
VERSION: major.minor.release
release :release.OS
常見(jiàn)的arch: :
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平臺(tái)無(wú)關(guān):noarch
6 程序包的來(lái)源途徑
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
7 rpm命令管理程序包之安裝、卸載、升級(jí)、查詢、校驗(yàn)、數(shù)據(jù)庫(kù)維護(hù)
rpm包安裝
rpm {--install} [install-options] PACKAGE_FILE
>{--install}
>> -i :安裝軟件
-v:顯示詳細(xì)的安裝過(guò)程
-vv:顯示更為詳細(xì)的安裝過(guò)程
-h:以# 顯示程序包管理執(zhí)行進(jìn)度
Preparing... ################################# [100%]
package lrzsz-0.12.20-36.el7.x86_64 is already installed
[install-options]
--test: 測(cè)試安裝,但不真正 執(zhí)行安裝,即dry run 模式
--nodeps :忽略依賴關(guān)系
--replacepkgs | replacefiles
--nosignature: 不檢查來(lái)源合法性
--nodigest :不檢查包完整性
--noscripts :不執(zhí)行 程序包腳本
.... %pre: ; 安裝前腳本; --nopre
.... %post: ; 安裝后腳本; --nopost
....%preun: ; 卸載前腳本; --nopreun
....%postun: 卸載后腳本; --nopostun
需要依賴關(guān)系才可以安裝
error: Failed dependencies:
httpd-tools = 2.4.6-45.el7.centos is needed by httpd-2.4.6-45.el7.centos.x86_64`
**可以使用--nodeps解決依賴關(guān)系**
```[root@centos7 ~]#rpm -ivh /run/media/root/CentOS\ 7\ x86_64/Packages/httpd-2.4.6-45.el7.centos.x86_64.rpm --nodeps
Preparing... ################################# [100%]
Updating / installing...
1:httpd-2.4.6-45.el7.centos ################################# [100%]`
**rpm包升級(jí)**
**rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...**
**rpm {-F|--freshen} [install-options] PACKAGE_FILE ...**
>upgrade :安裝有舊版程序包,則“升級(jí)”
.....如果不存在舊版程序包,則“安裝”
freshen :安裝有舊版程序包,則“升級(jí)”
.....如果不存在舊版程序包,則不執(zhí)行升級(jí)操作
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
--oldpackage :降級(jí)
--force: 強(qiáng)行安裝
**升級(jí)安裝**
```[root@centos7 ~]#rpm -Uvh /run/media/root/CentOS\ 7\ x86_64/Packages/lrzsz-0.12.20-36.el7.x86_64.rpm
Preparing... ################################# [100%]
`
**rpm包查詢**
** rpm {-q|--query} [select-options] [query-options]**
> [select-options]
>>-a: 所有包
-f: 查看指定的文件由哪個(gè)程序包安裝生成
-p rpmfile :針對(duì)尚未安裝的程序包文件做查詢操作
--whatprovides CAPABILITY :查詢指定的 CAPABILITY由哪個(gè)包所提供
--whatrequires CAPABILITY :查詢指定的 CAPABILITY 被
哪個(gè)包所依賴
> [query-options]
>>--changelog :查詢r(jià)pm 包的changelog
-c: 查詢程序的配置文件
-d: 查詢程序的文檔
-i: information
-l: 查看指定的程序包安裝后生成的所有文件
--scripts :程序包自帶的腳本
--provides: 列出指定程序包所提供的CAPABILITY
-R: 查詢指定的程序包所依賴的CAPABILITY
**查詢安裝包信息**
```[root@centos7 ~]#rpm -qi httpd
Name : httpd
Version : 2.4.6
Release : 45.el7.centos
Architecture: x86_64
Install Date: Sun 11 Jun 2017 10:07:51 PM CST
Group : System Environment/Daemons
Size : 9807149
License : ASL 2.0
Signature : RSA/SHA256, Mon 21 Nov 2016 02:14:03 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : httpd-2.4.6-45.el7.centos.src.rpm
Build Date : Tue 15 Nov 2016 02:06:40 AM CST
Build Host : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://httpd.apache.org/
Summary : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.`
**rpm包校驗(yàn)**
** rpm {-V|--verify} [select-options] [verify-options]**
>常見(jiàn)用法:rpm -V PACKAGE_NAME
當(dāng)沒(méi)有輸出結(jié)果是表示軟件來(lái)源完整性O(shè)K
**當(dāng)有相應(yīng)的結(jié)果輸出是表明:**
>>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
> **導(dǎo)入所需要公鑰**
>> rpm -K|checksig rpmfile 檢查包的完整性和簽名
rpm --import / etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7 發(fā)行版光盤(pán)提供: RPM-GPG-KEY-CentOS-7
**rpm數(shù)據(jù)包重建**
> rpm {--initdb|--rebuilddb}
>> initdb: 初始化
如果 事先不存在數(shù)據(jù)庫(kù),則新建之
否則 ,不執(zhí)行任何操作
rebuilddb :重建已 安裝的包頭的數(shù)據(jù)庫(kù) 索引目錄