程序包管理器
程序包管理器旨在消除手動安裝和更新,這對於Linux/Unix操作系統基爲有用。對於不同的Linux發行版,它們使用的程序包管理器也不盡相同,比如debian的dpt,dpkg,redhat的rpm等等。
程序包管理器將編譯好的應用程序和各組成文件打包成一個或幾個程序包文件,從而更方便的實現程序包的安裝、升級、卸載和查詢等管理操作。
每個程序包都是單獨實現的,包含了自身文件清單和安裝或卸載時運行的腳本,它們共用一個公共數據庫用來存放程序包的名稱和版本、依賴關係、功能說明、安裝生成的文件位置及校驗信息等等。
基於安全的考慮,一般推薦從可信任的平臺上下載程序包,並且檢查軟件包的合法性。
- 系統發行版的光盤或官方的文件服務器,也可以從鏡像站點上獲取,比如國內的http://mirrors.aliyun.com等
- 項目的官方站點
- 第三方組織,EPEL和一些包搜索引擎,例如http://pkgs.org,http://rpmfind.net/,http://rpm.pbone.net。
RPM
RPM Package Manager(PRM),最初是Red Hat Package Manager,現在是一個遞歸的縮寫。RPM最初是在1997年的時候由Erik Troan和Marc Ewing根據pms,rpp,pm的經驗編寫的。
RPM包命名規範
軟件包的製作流程一般是源代碼編譯、製作成對應的二進制格式、組織成爲一個或有限幾個“包”文件。
軟件包的命名包含了軟件提供商自身的源代碼版本號、rpm包的發行號以及後綴名.rpm。
源代碼組成格式一般是:name-VERSION.tar.gz
- name:源代碼的項目名稱,例如redis
- VERSION:通常由major(主版本).minor(次版本).release(修改號)組成,例如redis-3.0.2.tar.gz,後面就是源代碼的壓縮方式,通常爲tar.gz或tar.xz。
RPM有兩種包格式,分爲主包和次包,主包組成格式一般是:name-VERSION-release.arch.rpm,子包爲name-function-VERSION-release.arch.rpm,其中的name
和VERSION
均採用自源代碼。
- function:次包實現的功能,例如python-augeas-0.5.0-2.el7.noarch.rpm
- release.arch:rpm包的發行號,arch則代表了適用的平臺,常見的有noarch(平臺無關),i386,x64(amd64),ppc
CentOS系統RPM
RPM程序包管理,主要用於安裝、升級、卸載、查詢、校驗和數據庫維護(不建議使用)。
rpm [OPTIONS] [PACKAGE_FILE]
- 安裝: -i,--install
- 升級: -U,--update,-F --freshen
- 卸載: -e,--erase
- 查詢: -q,--query
- 校驗: -V,--verfify
- 數據庫維護: --rebuilddb,--initdb
GENERAL OPTIONS(共用選項)
-v
:verbose,詳細信息-vv
:更詳細的輸出
安裝
rpm {-i|--install} [install-options] PACKAGE_FILE ...
[install-options]:
- -h: hash marks輸出進度條;
- --test:測試安裝,檢查並報告依賴關係及衝突信息等;
- --nodeps:忽略依賴關係;不建議
- --replacepkgs:重新安裝
- --nosignature:不檢查包簽名信息,不檢查來源合法性
- --nodigest:不檢查包完整性信息
注意:rpm可以自帶腳本;
四類:--noscripts(禁止所有腳本執行)
- preinstall:安裝過程開始前運行的腳本,%pre, --nopre
- postinstall:安裝過程完成之後運行的腳本,%post,--nopost
- preuninstall:卸載過程真正開始執行之前的腳本,%preun,--noperun
- postuninstll:卸載過程完成之後運行的腳本,%postun,--nopostun
升級
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
- -U:升級或安裝;rpm -Uvh PACKAGE_FILE...
- -F:升級;rpm -Fvh PACKAGE_FILE...
- --oldpackage:降級;
- --force:強制升級;
注意:
- 不要對內核做升級操作;Linux支持多內核版本並存,因此,直接安裝新版本內核;
- 如果某原程序包的配置文件安裝後曾被修改過,升級時,新版本的程序提供的同一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)後提供。
卸載
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
- --allmatches:卸載所有匹配的指定名稱的程序包各個版本
- --nodeps:忽略依賴關係
- --test:測試卸載
查詢
rpm {-q|--query} [select-options] [query-options]
select-options
- PACKAGE_NAME:查詢指定的程序包是否已經安裝及其版本;
- -a,--all:查詢所有已經安裝過的包;
- -f FILE:查詢指定的文件由哪個程序安裝包安裝生成
- -p, --package PACKAGE_FILE:用於實現對未安裝的程序包執行查詢操作;
- --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程序包提供;
- --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個程序包依賴;
query-options
- --changelog:查詢rpm包的changelog
- -l,--list:程序包安裝生成的所有文件
- -i, --info:程序包相關的信息,版本號、大小、所屬的包組,等
- -c, --configfiles:查詢指定的程序包提供的配置文件
- -d, --docfiles:查詢指定的程序包提供的文檔
- --provides:列出指定的程序包提供的所有capability
- -R, --requires:查詢指定程序包所依賴關係
- --scripts:查詢指定程序包自帶的腳本片段;
校驗
rpm {-V|--verify} [select-options] [verify-options]
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:
包來源合法性驗證和完整性驗證
對於CentOS發行版來說rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
來源合法性驗證:通過數字簽名驗證
完整性驗證:
- 安裝此組織簽名的程序時,會自動執行驗證;
- 手動驗證:rpm -K PACKAGE_FILE
數據庫重建
rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY],rpm管理器數據庫路徑:/var/lib/rpm
- --initdb:初始化數據庫,當前無任何數據庫可初始化創建一個;當前有時不執行任何操作;
- --rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重建;
查詢操作:通過此處的數據庫進行;獲取幫助:CentOS6:man rpm,CentOs7:man rpmdb