過去,許多 Linux 程序以源代碼的形式發行,用戶把源代碼構建為所需的程序或程序集;源代碼還附帶必需的手冊頁、配置文件等等?,F在,大多數 Linux 發行商使用稱為包 的預構建的程序或程序集,包便于在發行版上安裝。
rpm 最開始是Red Hat Package Manager 之意,原用在Red Hat Linux一款軟件包管理器,先在已被許多其他Linux 發行商使用,成為主流包管理器,rpm包的文件格式也寫進Linux標準庫中,所以rpm 現在遞歸意為RPM Package Manager。rpm的誕生使得在Linux上管理軟件包變得方便許多,rpm功能強大,可完成構建、安裝、查詢、校驗、升級和卸載軟件包。
一、軟件包介紹
一個標準的rpm包里面包含包描述文件,依賴性,程序文件,文檔說明,安裝和卸載時運行的腳本。
安裝一個rpm包,編譯生成的程序文件,以及配置文件,幫助文件等將按照Linux文件層級結構標準來放置,這都是由腳本控制完成。那么我們獲取一個rpm包的來源可靠性變得十分重要,一般來講有以下幾個安全獲取路徑:
-
Linux發行商光盤及鏡像網站
如國內鏡像站點:http://mirrors.aliyun.com
-
項目官方網站
-
EPEL源,Extra Packages for Enterprise Linux 官方網址為:https://fedoraproject.org/wiki/EPEL
-
rpm包搜索引擎
rpm包命名格式
name-version-release.arch.rpm
version構成:major.minor.release
release:一般指OS,如el6,el7
arch:架構
x86:i386,i486, i586, i686
x86_64:x64, x86_64, amd64
powerPC:ppc
與平臺無關:noarch
一個軟件項目通常會被拆分成主包和支包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 開發子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
zip-3.0-10.el7.x86_64.rpm
二、rpm數據庫
rpm包管理器的運行依賴它的數據庫,數據庫文件路徑為/var/lib/rpm。數據庫記錄了:
1、已安裝的程序包名稱和版本信息,依賴關系
2、安裝生成文件路徑
3、軟件包的校驗碼信息
一旦數據庫信息丟失了,就不能正常進行升級,查詢,卸載,校驗等操作。
數據庫操作命令
rpm --initdb #如果不存在數據庫,則建立一個新數據庫 rpm --rebuilddb #根據已安裝包的頭文件信息,重新構建數據庫。如果一個數據庫文件全部丟失,連已安裝的包都無法找到,該命令無作用
三、rpm命令使用說明
rpm 命令的使用必需指定一種模式,安裝,升級,卸載,查詢,校驗,以及數據庫維護等。
所有模式下的常用選項
1)–quiet
打印少量信息,通常只顯示出錯誤信息
2)-v
打印細節信息
3)-vv
打印比-v更為詳細的信息
4)–dbpath
使用指定的數據庫路徑
5)–root
使用指定的路徑作為根路徑。通常在救援模式下使用此選項
1、合法性檢測
在執行安裝,升級等操作的時,rpm默認會檢測包來源合法性及包完整性,首先包來源合法性要先檢測通過,包的來源合法性沒有通過,其包特征碼信息無法保障真實性,再去校驗也毫無意義。
包來源合法性通過驗證數字簽名來校驗,數字簽名使用非對稱加密算法RSA加密,校驗需要導入公鑰,如果沒有公鑰,會有提示
獲取包制作者公鑰后,rpm –import /path/key 導入公鑰
Centos6,7 在/etc/pki/rpm-gpg/下已存放光盤包校驗所需的公鑰
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
導入正確公鑰后,將不會出現nokey提示
rpm -q gpg-pubkey #查詢已導入的公鑰 rpm -qi gpg-pubkey #查詢導入公鑰詳細信息 [root@centos7 Packages]$ rpm -q gpg-pubkey gpg-pubkey-f4a80eb5-53a7ff4b gpg-pubkey-b6792c39-53c4fbdd [root@centos7 Packages]$ rpm -e gpg-pubkey-b6792c39-53c4fbdd #刪除指定一個公鑰 [root@centos7 Packages]$ rpm -q gpg-pubkey gpg-pubkey-f4a80eb5-53a7ff4b
2、安裝
rpm -i [install-options] PACKAGE_FILE...
常用install-options
-h 顯示進度條,hash marks形式
常用安裝命令:rpm -ivh file
[root@centos7 Packages]$ rpm -ivh tree-1.6.0-10.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:tree-1.6.0-10.el7 ################################# [100%]
–replacepkgs 重新安裝
rpm -ivh --replacepkgs tree-1.6.0-10.el7.x86_64.rpm
–nodeps 忽略依賴關系
安裝前不檢查依賴關系,直接安裝
–nosignature 不校驗包簽名信息
–nodigest 不校驗包特征提取碼
–test 不安裝軟件,只是顯示檢查并報告潛在的問題
3、升級
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... #升級或安裝軟件包,如果是升級一個軟件,則會移除其他版本的文件
rpm {-F|--freshen} [install-options] PACKAGE_FILE ... #只對軟件包進行升級操作,如果沒有舊版本程序,則不執行
升級模式的命令和安裝模式命令的附加選項相同,再介紹幾個常用選項
–oldpackage 允許進行降級操作
rpm -ivh --oldpackage xxx.rpm
–force 強制操作,等同于–replacepkgs, –replacefiles, and –oldpackage
注意:
1)不要對內核進行升級操作,升級會刪掉原有的內核;Linux支持多內核并存,直接安裝即可。
2)如果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配置文件并不會直接
覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
4、查詢
rpm {-q|--query} [query-options][select-options]
先講解一下 [select-options],該選項返回的值都是rpm包名
PACKAGE_NAME 查詢已安裝的該命名的包
[root@centos7 Packages]$ rpm -q bash bash-4.2.46-19.el7.x86_64 [root@centos7 Packages]$ rpm -q zsh zsh-5.0.2-14.el7.x86_64
-a 查詢所有已安裝的包
[root@centos7 Packages]$ rpm -qa |grep .*sh- #經常搭配grep使用,模糊查找包 zsh-5.0.2-14.el7.x86_64 bash-4.2.46-19.el7.x86_64 openssh-clients-6.6.1p1-22.el7.x86_64 tcsh-6.18.01-8.el7.x86_64
-f 查詢指定的文件是由哪個包生成的
[root@centos7 Packages]$ rpm -qf /bin/sh bash-4.2.46-19.el7.x86_64
-p 查詢一個未安裝rpm包的信息,經常需要配合[query options]使用
[root@centos7 Packages]$ rpm -qp xcb-util-devel-0.4.0-2.el7.x86_64.rpm #單獨使用返回包名 xcb-util-devel-0.4.0-2.el7.x86_64 [root@centos7 Packages]$ rpm -qpd xcb-util-devel-0.4.0-2.el7.x86_64.rpm #配合-d 查詢文檔 /usr/share/doc/xcb-util-devel-0.4.0/NEWS
–whatprovides CAPBILITY 查詢此能力由哪個已安裝的包提供,能力也可以是文件
[root@centos7 Packages]$ rpm -q --whatprovides tree tree-1.6.0-10.el7.x86_64
–whatrequires CAPBILITY 查詢該能力被哪些已安裝的包所依賴
[root@centos7 Packages]$ rpm -q --whatrequires bash dracut-033-359.el7.x86_64 initscripts-9.49.30-1.el7.x86_64 lvm2-2.02.130-5.el7.x86_64 mariadb-5.5.44-2.el7.centos.x86_64 rsyslog-7.4.7-12.el7.x86_64 jline-1.0-8.el7.noarch PackageKit-command-not-found-1.0.7-5.el7.centos.x86_64 kpatch-0.1.10-4.el7.noarch bash-completion-2.1-6.el7.noarch
[query-options]
-l 查詢程序包安裝生成的列表
-i 查詢程序包內含信息
-c 只列出配置文件列表
-d 只列出文檔文件列表
–provides 查詢該包提供哪些能力
[root@centos7 Packages]$ 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
-R,–requires 查詢該包依賴哪些能力
–scripts 查看該包自帶的腳本片段
5、校驗
此模式校驗是指比較指定包已安裝的文件信息與rpm數據庫存儲的元數據對應的信息
rpm {-V|--verify} [select-options] [verify-options]
[root@centos7 Packages]$ rpm -V zsh #手動修改過配置文件,校驗結果如下 S.5....T. c /etc/zshrc
校驗結果九個位代表意義如下
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
6、卸載
rpm {-e|--erase}[--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
–allmatches 卸載所有匹配包名的所有版本程序
–nodesp 不檢查依賴關系,直接卸載。強制卸載的含義
[root@centos7 Packages]# rpm -evv tree D: loading keyring from pubkeys in /var/lib/rpm/pubkeys/*.key D: couldn't find any keys in /var/lib/rpm/pubkeys/*.key D: loading keyring from rpmdb D: opening db environment /var/lib/rpm cdb:0x401 D: opening db index /var/lib/rpm/Packages 0x400 mode=0x0 D: locked db index /var/lib/rpm/Packages D: opening db index /var/lib/rpm/Name 0x400 mode=0x0 D: read h# 1521 Header SHA1 digest: OK (5d09d886c3b9240f03006ab41d0cdd44dce7a723) D: added key gpg-pubkey-b6792c39-53c4fbdd to keyring D: read h# 1522 Header SHA1 digest: OK (489efff35e604042709daf46fb78611fe90a75aa) ...
原創文章,作者:cutemsyu,如若轉載,請注明出處:http://www.www58058.com/39865