您好,登錄后才能下訂單哦!
1. 程序包管理器的功能
我們知道,由程序員編寫并提供的程序源代碼要轉換成目標二進制格式才能在計算機上運行起來,但用戶要在平臺上使用時需要手動編譯安裝后才能使用,對于普通用戶來說有一定難度。因此為了降低普通用戶對應用程序的使用難度,程序員可在提供源代碼的同時提供已在特定環境下編譯好的程序文件,只要用戶的平臺環境和程序員的平臺環境相同,就可以通過解壓程序員提供的二進制格式文件即可使用,而無需自己手動編譯安裝。
一個已編譯好的程序由二進制程序、庫文件、配置文件和幫助手冊等組成,而程序包管理器的功能就是將編譯好的應用程序的各組成文件(二進制程序、庫文件、配置文件、幫助文件等)打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、卸載和查詢等管理操作。
2. 源碼到程序包的轉換過程
3. rpm包管理器概述
rpm是Redhat公司針對自己的操作系統RHEL提出的一種管理軟件包的方法,rpm原來全稱為RedHat Package Manager,后來由于rpm包管理器的使用方便以及Redhat公司采取各種商業策略,使得rpm成為了工業標準,其他系統可借鑒使用rpm,因此rpm全稱后來改為:RPM Package Manager。在系統上只要安裝了rpm包管理器,那么只要符合rpm標準的程序包文件都可以實現更為方便地安裝、升級、卸載和查詢等管理操作。
4. 為什么要使用rpm?
Linux的哲學思想之一是“一個程序只做一件事,并且做好”。因此Linux經常通過使用眾多功能單一的程序來完成復雜任務,最常見的例子是管道命令的使用。而各個程序功能的單一,帶來的問題是各個程序文件之間的產生了極大的依賴性,這是一個需要解決的問題。此外,要安裝各種功能的程序,而各程序在安裝時的路徑、生成的文件各不相同,這給卸載某程序將帶來極×××煩,極不方便管理,以及對程序的版本的管理等。在Linux上只要安裝rpm包管理器即可解決以上問題,rpm包管理器可將編譯好的各個應用程序組成文件打包成一個或有限個rpm程序包,每個包中會記錄當前包的依賴性。一旦程序包安裝了之后,rpm會追蹤其各個文件的安裝路徑(包括程序運行時產生的臨時文件)。rpm包管理器就是通過這種方式來實現對rpm程序包的管理的,而對程序包的管理無外乎是安裝、升級、卸載、查詢等操作。
5. 程序包管理器的組成部分
程序包管理器由程序包組成清單和數據庫兩部分組成:
(1)程序包的組成清單(每個程序都單獨實現):
①文件清單
②安裝或卸載時運行的腳本
(2)數據庫(為所有rpm程序包所共用):
①程序包的名稱和版本
②依賴關系
③功能說明
④安裝生成的各個文件的文件路徑及校驗碼信息
6. 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, ...
7. 獲取程序包的途徑
如何獲取rpm包呢?
(1)系統發行版的光盤或官方的文件服務器(或鏡像站點)
常見的鏡像網站如:
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系統上rpm命令管理程序包
8.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/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:強制升級 --> 某些程序升級后會引起依賴性問題,此時可能會用到此選項;
其他安裝選項同“安裝”。
用法:
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
注意:
(1)Linux支持多內核版本并存,所以不要對內核做升級操作,因為這樣有可能會導致無法“回滾”,建議直接安裝新版本內核即可。
(2)如果某原程序包的配置文件安裝后曾被修改過,則在升級時,新版本的程序提供的同一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
命令演示:
查看當前已安裝的zsh的版本:
[root@osyunwei ~]# rpm -q zsh zsh-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.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
發現有依賴關系導致無法升級。
此時若要強行升級可使用--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%]
注意:忽略依賴性升級后程序不一定能正常運行!
再將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:忽略依賴關系;
--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:查詢所有已經安裝過的包;
-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 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程序包的依賴關系:
[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)查看程序包相關的信息,版本號、大小、所屬的包組等:
[root@osyunwei ~]# rpm -qi zsh
8.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 zsh S.5....T. c /etc/zshrc
顯然,文件/etc/zshrc的大小、md5值、時間戳(mtime)發生了變化。
8.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
注意:不一定能夠重建完整的數據庫,所以慎用該命令吧!
8.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 //校驗通過;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。