全部的軟件都是由文件格式的程序代碼(即源代碼),通過編譯成爲一個可執行二進制文件;對於一個軟件來講,其包含二進制程序、庫文件、配置文件以及幫助文件。在應用中,每次要安裝程序時經過找源代碼而後去編譯成二進制文件,這個過程要花費大量的時間,因此就有了程序包管理器。程序包管理器的功能是:將編譯好的應用程序的各組文件打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、卸載和查詢等管理操做。php
咱們能夠將這種軟件包管理器稱爲手動安裝程序的軟件包管理器,爲何成爲手動安裝程序的軟件包管理器呢?
由於這種軟件包管理器,在軟件安裝的過程當中不能解決包之間的依賴管理,好比,A程序的運行要基於B程序的某些庫文件才能運行,因此在安裝A程序以前必須安裝A程序;固然也有可能出現這種狀況:B程序的運行也要基於A程序的某些庫文件才能運行,這樣就造成了先有雞仍是先有蛋的問題。前端
利用這種程序包管理器咱們只能手動解決包之間的依賴關係。所謂自動解決依賴關係,無非就是在某個程序安裝以前對該程序包文件進行分析看其都依賴哪些程序,而後將這些程序一併安裝,從而解決軟件包的依賴文件,咱們將自動解決依賴關係的工具稱爲解決依賴關係的前端工具。node
Linux發行版本主要分爲兩類:類RedHat和類Debain,不一樣的發行版本上所使用的程序包管理器各不相同,下圖是各發行版本所使用的程序包管理器:redis
一、程序包的組成清單(每一個程序包都單獨實現)數據庫
其中包含文件清單和安全或卸載時運行的腳本centos
二、數據庫(公共)安全
程序包管理器數據庫存放的位置在/var/lib/rpm/目錄下,其中包含程序包的名稱和版本,依賴關係,功能說明以及安裝生成的各文件的文件路徑及校驗碼信息等等。服務器
一、系統發行版的光盤或官方的文件服務器(或鏡像站點)ide
http://mirrors.aliyun.com http://mirrors.sohu.com http://mirrors.163.com
二、項目的官方站點函數
三、第三方組織:
(1) EPEL (2) 專門搜索rpm的搜索引擎 http://pkgs.org http://rpmfind.net http://rpm.pbone.net
四、本身作rpm包
在看rpm包命名格式以前先來看下源代碼的命名格式:
源代碼:name-VERSION.tar.gz 其中VERSION包含: major.minor.release
rpm包命名格式
name-VERSION-release.arch.rpm VERSION: major.minor.release --> 其爲源代碼的發行號 release.arch: rpm包的發行號 architecture: i386, x64(amd64), ppc, noarch redis-3.0.2-1.centos7.x64.rpm
拆包:主包和子包;Linux中的軟件包通常有一個主程序的安裝包,再就是子程序包,所謂的子程序包就是該軟件上的某一功能的安裝包,或者說是該程序的一個插件。
主包: name-VERSION-release.arch.rpm 子包: name-function-VERSION-release.arch.rpm
rpm程序包管理器主要實現的功能有:安裝、升級、查詢、校檢以及數據庫維護
rpm [OPTIONS] [PACKAGE_FILE]
-i, --install: 安裝
-U, -update, -F, --freshen: 升級
-e, --erase: 卸載
-q, --query: 查詢
-V, --verify: 校驗
--builddb, --initdb: 數據庫的建立
rpm {-i|--install} [install-options] PACKAGE_FILE ...
# rpm -ivh PACKAGE_FILE GENERAL OPTIONS -v: verbose,詳細信息 -vv: 更詳細的輸出
[install-options]
-h: hash marks 輸出進度條;每一個#表示2%的進度; --test: 測試安裝,檢查並報告依賴關係及衝突消息等; --nodeps: 忽略依賴關係; 注意:當忽略依賴關係安裝程序時,程序安裝完成後,有可能不能正常運行,因此該安裝選項不建議使用; --replacepkgs: 從新安裝; 好比說,將某程序的配置文件中信息修改後,想還原該配置文件,可是忘記了以前的配置,此時能夠將該配置文件刪除後,利用該安裝選項對該程序從新安裝來恢復其某個配置文件; --nosignature: 不檢查包簽名信息,不檢查包來源的合法性; --nodigest: 不檢查包完整性信息; --noscripts: 安裝時不執行腳本文件
注意:rpm能夠自帶腳本
rpm包中的腳本分四類: preinstall: 安裝過程開始以前運行的腳本,%pre,--nopre postinstall: 安裝過程完成以後運行的腳本,%post,--nopost preuninstall: 卸載過程真正開始執行以前運行的腳本,%preun,--nopreun postuninstall: 卸載過程完成以後運行的腳本,%postun,--nopostun
安裝命令演示
(1) 安裝一個rpm軟件包
(2) 忽略依賴關係安裝
安裝php的rpm包時出現依賴關係錯誤,此時能夠忽略依賴關係對軟件包進行安裝
(3) 測試安裝
(4) 從新安裝
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-U: 升級或安裝 -F: 升級 rpm -Uvh PACKAGE_FILE... rpm -Fvh PACKAGE_FILE...
[install-options]
--oldpackage: 降級 --foece: 強制升級
注意:
(1) 不要對內核作升級操做;Linux支持多內核版本並存,所以,直接安裝新版內核; (2)若是某原程序包的配置文件安裝後曾被修改過,升級時,新版本的程序提供一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)後提供;
rpm {-e|--erase} [--allmatches] [--justdb] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
--allmarches: 卸載全部匹配指定名稱的程序包的各版本; --nodeps: 忽略依賴關係; --test: 測試卸載,dry run模式
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, --require: 查詢指定程序包的依賴關係; --scripts: 查詢程序包自帶的腳本片斷;
查詢命令演示
(1) 查詢指定的安裝後的程序
(2) 查詢指定的文件由哪一個程序安裝包生成
(3) 查詢程序包安裝後生成的文件列表或者某程序的文件列表
(4) 列出指定程序包提供的全部CAPABILITY
(5) 查詢指定的CAPABILITY由哪一個包提供
(6) 查詢指定的CAPABILITY被哪一個包所依賴
(7) 查詢指定程序包的依賴關係
(8) 查詢程序包自帶的腳本片斷
軟件包的校驗通常是驗證其來源的合法性以及軟件包完整性的驗證;來源合法性驗證利用數字簽名奇數,完整性驗證利用單項函數加密技術。
軟件包校驗命令
rpm {-V|--verify} [select-options] [verify-options]
校驗過程:
(1) 首先獲取並導入信任的包製做者的密鑰
對於CentOS發行版來講,利用下面的命令進行密鑰的導入: # rpm -import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
(2) 驗證
a. 安裝此組織簽名的程序時,會自動執行驗證; b. 手動驗證:rmp -K PACKAGE_FILE
rpm管理器數據庫的路徑/var/lib/rpm/
獲取rpm數據庫工具的幫助
CentOS 6: man rpm CentOS 7: man rpmdb
數據庫重建的命令
rpm {--initdb|--rebuilddb}
--initdb: 初始化數據庫,當前無任何數據庫可實現初始化建立一個新的;當前有時不執行任何操做; --rebuilddb: 從新構建,經過讀取當前系統上全部已經安裝過的程序 包進行從新建立;