由於Linux是開源的系統,所有在Linux上運行的程序有很多不同的作者提供源代碼,這些程序包有C語言、C++語言、perl語言、python語言、或ruby語言等其他語言。對於不同語言的程序包,他們的安裝方式不同,不同的語言開發的程序需要不同的API(應用接口),對於用戶來說,非常之不方便,而且使新的用戶望而卻步。操作系統發行商主要負責通過自己的方式,將程序編程成程序包,給用戶直接使用,而且程序包之間還存在依賴關係,如A依賴B才能安裝,B又依賴C安裝,因此係統發行商開發出了程序包管理器。
程序在編譯之前都是源代碼,編譯之後轉換爲二進制程序,還有幫助文件、配置文件、庫文件四個部分組成。在linux系統中這四個部門會存放於如下目錄中:
二進制程序: /bin , /sbin , /usr/bin , /usr/sbin , /usr/local/bin ,/ user/loacl/sbin , /opt/bin ,/opt/sbin;
庫文件: /lib , /lib64 , /usr/lib , /usr/lib64 , /usr/loacl/lin , /usr/local/lib64;
配置文件: /etc , /etc/DIR , /usr/share/{etc,,conf};
幫助文件: /usr/share/man , /usr/share/doc , /usr/loacl/share/man。
注意:有些特殊的應用程序可能會將執行文件放置於libexec目錄。也可以單獨安裝在某一目錄下。
程序包管理器對應用程序打包成特定的格式,對兼容的程序包直接進行安裝、卸載、升級、查詢。常見的包管理器有:. deb的Debian和和Red Hat的.rpm。
程序包的格式爲(rpm格式的):appname-VERSION-ARCH-RELEASE .ARCH .rpm ,其中VERSION爲版本號有major:主版本號和minor:次版本號; RELEASE:發行號,包自身的修訂號,有時候還會包含適用於os信息,比如bash-4.3.2-2.centos6.x86_64.rpm中的2.contos6爲release號;ARCH爲適用的平臺,如x86:i386、i586、i686、x86_64、amd64等,如顯示noarch則此程序包與平臺無關都可以兼容。由於一個程序包中蘊含多種功能,有些功能不常用,所以程序包有分包機制,可以安裝自己需要的,一般主包都會安裝,分爲核心包(主包)和子包(支包),核心包的命名與源項目的命名一致,子包的命名爲源項目名稱附加子包中文件提供的功能組成如下:
php-pecl-apc.x86_64(主包)、php-pecl-apc-devel.i686(子包)、php-pecl-apc-devel.x86_64(子包)
獲取程序包的途徑主要有四種,系統的發行光盤、程序包的官方站點、第三方組織或通過搜索引擎。、 Centos系統上程序rpm包管理有四個方式,安裝、升級、卸載、查詢、檢驗。下面講一下常用的命令。
安裝:
rpm {-i | --install } [install-option] PACKAGE_FILE1…
-h : hash ,以#來顯示安裝進度
- v,--verbose: 顯示安裝過程中的詳細信息:
-ivvh:在選項中加v可以更詳細的顯示此程序包安裝的哪些文件,具體進度
-ivvvh:可以添加多個v
安裝時常用的組合:-ivh(查看以#顯示的安裝進度) , -ivvh
--test :不執行真正的安裝過程,而僅報告依賴關係及衝突信息等;
例如:[root@localhost Packages]# rpm -i zsh-4.3.10-7.el6.x86_64.rpm 安裝此程序包後,沒有回饋其它信息,說明已經安裝成功,可以通過which命令查看,是否已經安裝了zsh。
例如通過-ivh選項可查看安裝進度
[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
例如:使用--test選項來測試安裝;
[root@localhost Packages]# rpm -ivh --test zsh-4.3.10-7.el6.x86_64.rpm
Preparing... ########################################### [100%]
此外,由於程序包是由衆多目的的小程序組成,所以程序包之間存在的依賴性關係很強,譬如A需要B安裝,B還需要C完成等,程序包之間的依賴關係非常複雜。
例如:安裝php-5.3.3-38.el6.x86_64.rpm需要依賴php-cli(x86-64)和php-common(x86-64)。
[root@localhost Packages]# rpm -ivh --test php-5.3.3-38.el6.x86_64.rpm
error: Failed dependencies:
php-cli(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64
php-common(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64
可以通過選項---nodeps來忽略依賴關係,副作用能夠安裝成功,但未必能夠運行成功。若一不小心刪除了某些文件,可以通過--replacepkgs選項來覆蓋安裝此程序包,還可以通過--force強制安裝。
還能夠通過選項來升級程序包
升級:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
-U:升級或安裝
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-F:升級
組合: -Uvh ,-Fvh與安裝選項一樣在選項中加v可以顯示詳細的升級或安裝的信息,與安裝類似還有 --test(安裝測試)、--nodeps(忽略依賴關係安裝)、--force(強制安裝)或者 --oldpackage(用於降級到舊版本)。不過需要注意的是,一定不要對內核執行升級,Linux允許多內核共存,所以可以直接安裝多個不同版本的內核。如果程序包的配置文件安裝後曾被修改,升級時,新版本的配置文件不會覆蓋老版本的配置文件;而是把新版本的配置文件重命名(加後綴.rpmnew)後保存。
卸載:
移除已經安裝的程序包
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
簡單用法: rpm -e PACKAGE_NAME...
--allmatches: 如果一個程序包同時安裝多個版本,則此選項一次全部卸載;
--test :測試卸載;
--nodeps:忽略依賴關係;
注意:如果程序包的配置文件安裝後曾被修改,卸載時,此文件通常不會被刪除,而是被重命名(加後綴.rpmsave)後留存;
查詢:
查詢某包是否已經安裝,以及檢查安裝的所有包,還可以查看某包的詳細信息;
rpm {-q|--query} [select-options] [query-options]
[select-options] :
1、查詢某包或某些包是否安裝
rpm -q PACKAGE_NAME
2、查詢已經安裝的所有包
rpm -qa
3、查詢某個文件是由哪個包安裝生成;
rpm -qf /PATH/TO/SOMEFILE
4、查詢尚未安裝的包文件的相關信息
-p
rpm -qpi PACKAGE_FILE
[query-options] :
1、查詢某包的簡要說明信息;
rpm -qi PACKAGE_NAME
例如 : rpm -qi zsh
2、查詢某包安裝生成的文件列表;
rpm -ql PACKAGE_NAME
3、查詢某包安裝完成後生成的所有配置文件
rpm -qc PACKAGE_NAME
4、查詢某報安裝完成生成的所有幫助文件
rpm -qd PACKAGE_NAME
5、查詢某包製作時隨版本變化的changelog信息;
rpm -q --changelog PACKAGE_NAME
6、查詢某包提供的capabilities
rpm -q --provides PACKAGE_NAME
7、查詢包所依賴的capabilities
rpm -q --requires PACKAGE_NAME
8、查詢某包安裝或卸載時執行腳本;
rpm -q --scripts PACKAGE_NAME
腳本有四類:
preinstall :安裝過程開始之前執行的腳本;
postinstall : 安裝過程完成之後執行的腳本;
preuninstall :卸載開始之前執行的腳本
postuninstall: 卸載過程完成之後執行的腳本;
例如:查詢zsh的簡要信息;
[root@localhost Packages]# rpm -qi zsh
Name : zsh Relocations: (not relocatable)
Version : 4.3.10 Vendor: CentOS
Release : 7.el6 Build Date: Mon 25 Nov 2013 01:40:59 AM CST
Install Date: Sat 11 Apr 2015 05:08:33 PM CST Build Host: c6b9.bsys.dev.centos.org
Group : System Environment/Shells Source RPM: zsh-4.3.10-7.el6.src.rpm
Size : 5009102 License: BSD
Signature : RSA/SHA1, Mon 25 Nov 2013 03:33:46 AM CST, Key ID 0946fca2c105b9de
Packager : CentOS BuildSystem <http://bugs.centos.org>
URL : http://zsh.sunsite.dk/
Summary : A powerful interactive shell
Description :
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor. Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements. Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.
校驗:
查詢包安裝之後生成的文件是否發生了改變;
rpm {-V|--verify} [select-options] [verify-options]
常見用法:rpm -V PACKAGE_NAME
[root@localhost Packages]# rpm -V zsh
S.5....T. c /etc/zshrc
S表示文件大小更改,5表示校驗碼也更改了,T表示修改時間戳,.表示未修改。
文件改變信息的返回值所代表修改的含義:
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
程序包的合法性驗證:
來源合法
由我們信任的製作者提供;
依賴於:製作者的數據簽名,簽名是作者使用自己的私鑰加密程序包的特徵碼進行的;
內容合法
包未被二次修改, 完整性檢驗成功
依賴於:製作者提供的程序特徵碼:
驗證方式:安裝者用同樣的特徵碼提取算法提取程序包的特徵碼,並與原作者提供的相比較
驗證其光盤中程序包的來源及完整性
rpm --import /path/to/RPM-GPG-KEY-FILE
例如:# rpm --import RPM-GPG-KEY-Centos-6 導入含有公鑰的文件
驗證: rpm {-k | --checksig } PACKAGE_FILE
--nosignature :不檢查來源合法性
--nodigest : 不檢查完整性
[root@localhost cdrom]# rpm --import RPM-GPG-KEY-CentOS-6
[root@localhost cdrom]# cd Packages/
[root@localhost Packages]# rpm -K zsh-4.3.10-7.el6.x86_64.rpm
zsh-4.3.10-7.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
如上示例,通過從光盤鏡像文件獲取的含有公鑰的文件,驗證zsh-4.3.10-7.el6.x86_64.rpm此程序包的來源的合法性,如上驗證md5碼OK。
rpm管理器數據庫:/var/lib/rpm
重建數據庫:
rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY]
--initdb: 初始化數據庫,即數據庫完全不存時,可新建之;
--rebuilddb: 無論當前數據存在與否,都會直接重建此庫;
小結,此文講述了rpm的基本管理:安裝、升級、卸載、查詢和校驗;還有程序包的合法性的驗證以及數據庫的管理。