一、程序包管理概述
1.程序包語言
(1)系統級開發:一般直接調用硬件
C/C++:httpd, vsftpd, nginx
go語言
(2)應用級開發:java/Python/perl/ruby/php:
java: hadoop, hbase, (基於jvm虛擬機)
Python:openstack, (基於pvm虛擬機)
perl: (perl解釋器)
ruby: (ruby解釋器)
php: (php解釋器)
2.程序語言格式
(1)C/C++程序格式:
源代碼:文本格式的程序代碼;
編譯開發環境:編譯器、頭文件、開發庫
二進制格式:文本格式的程序代碼 --> 編譯器 --> 二進制格式(二進制程序、庫文件、配置文件、幫助文件)
(2)java/python程序格式:
源代碼:編譯成能夠在其虛擬機(jvm/pvm)運行的格式;
開發環境:編譯器、開發庫
二進制
3.項目構建工具:
c/c++: make
java: maven
4.程序包管理器:要完成安裝、升級、卸載、查詢、校驗(校驗爲Linux所有)功能
(1)功能
將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便地實現程序包的安裝、升級、卸載和查詢等管理操作;
(2)組成方式
1)程序包的組成清單(每個程序包都單獨實現):文件清單、 安裝或卸載時運行的腳本
2)數據庫(公共):/var/lib/rpm/
程序包的名稱和版本、依賴關係、 功能說明、安裝生成的各文件的文件路徑及校驗碼信息...
(3)不同系列Linux所用程序包管理器:
debian:dpt, dpkg, ".deb"
redhat:redhat package manager, rpm, ".rpm"; rpm is package manager;
S.u.S.E:rpm, ".rpm",
Gentoo:ports
ArchLinux:
5.包的命名格式
(1)源代碼:name-VERSION.tar.*z
VERSION:major.minor.release 主版本號.次版本號.發行號
(2)RPM包:name-VERSION-release.arch.rpm
VERSION:major.minor.release
release.arch:rpm包的發行號,arch 平臺號
6.RHEL製作RPM包時會拆包:主包和支包,方便安裝所需要組件而非全部
主包:name-VERSION-release.arch.rpm
支包:name-function-VERSION-release.arch.rpm
function(功能):devel, utils, libs, ...
7.程序包管理器前端工具:自動解決依賴關係;
yum:rhel系列系統上rpm包管理器的前端工具;
apt-get (apt-cache):deb包管理器的前端工具;
zypper:suse的rpm管理器前端工具;
dnf:Fedora 22+系統上rpm包管理器的前端工具,yum的升級版;
8.獲取程序包的途徑:
(1)系統發行版的光盤或官方的文件服務器(或鏡像站點):
http://mirrors.aliyun.com、http://mirrors.sohu.com、http://mirrors.163.com
(2)各個項目自己的官方站點
(3)第三方組織:
1) EPEL等可靠地開源社區組織
2) 搜索引擎:http://pkgs.org、 http://rpmfind.net 、http://rpm.pbone.net
(4)自動編譯二進制代碼、製作
二、RPM方式管理(CentOS 7.1爲例講解)
rpm命令:rpm [OPTIONS] [PACKAGE_FILE]
安裝:-i, --install
升級:-U, --update, -F, --freshen
卸載:-e, --erase
查詢:-q, --query
校驗:-V, --verify
數據庫維護:--builddb, --initdb
前提:掛載官方鏡像CentOS-7-x86_64-Everything-1503-01.iso,RPM包位置Packages目錄
Last login: Mon Dec 21 06:57:01 2015 from 172.16.250.39
[root@localhost ~]# mkdir /media/cdrom #創建掛載點目錄
mkdir: 無法創建目錄"/media/cdrom": 文件已存在
[root@localhost ~]# mount /dev/cdrom /media/cdrom #掛載光盤
mount: /dev/sr0 寫保護,將以只讀方式掛載
[root@localhost ~]#
1.安裝:
(1)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:不檢查包完整性信息;
注意:rpm可以自帶腳本;
四類:--noscripts
preinstall:安裝過程開始之前運行的腳本,%pre , --nopre
postinstall:安裝過程完成之後運行的腳本,%post , --nopost
preuninstall:卸載過程真正開始執行之前運行的腳本,%preun, --nopreun
postuninstall:卸載過程完成之後運行的腳本,%postun , --nopostun
(2)實例演示
1)[root@localhost Packages]#rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm #安裝zsh程序,顯示過程
2)[root@localhost Packages]# rpm -ivh --test zsh-5.0.2-7.el7.x86_64.rpm
[root@localhost Packages]# rpm -ql zsh
測試安裝zsh,並不會真正的安裝。查看zsh程序安裝所生成的所有文件列表顯示無程序
3)[root@localhost Packages]# rpm -ivh --nosignature zsh-5.0.2-7.el7.x86_64.rpm
安裝時不檢驗簽名信息,此處則不再顯示警告信息,NOKEY
5)[root@localhost Packages]# rpm -ivh --nodigest zsh-5.0.2-7.el7.x86_64.rpm
安裝時不檢查安裝包的完整性,直接強制安裝
一般除非在十分確定自己做什麼和相信此程序視乎纔會使用
6)[root@localhost Packages]# rpm -ivh --test php-mysqlnd-5.4.16-23.el7_0.3.x86_64.rpm
[root@localhost Packages]# rpm -ivh --nodeps php-mysqlnd-5.4.16-23.el7_0.3.x86_64.rpm
#測試安裝 php-mysqlnd,需要安裝php-pdo(x86-64),直接安裝會報錯,安裝不了
#--nodeps 參數會忽略安裝包之間的依賴關係,但時安裝後很大可能不能正常使用,癡肥依賴關係實際上用不到,如.doc的幫助文檔等
2.升級:
(1)rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-U:升級或安裝 -Uvh; rpm -Uvh PACKAGE_FILE ...
-F:純粹升級,必須存在老版本,不支持安裝操作 -Fvh rpm -Fvh PACKAGE_FILE ...
--oldpackage:降級;
--force:強制升級;
注意:
1) 不要對內核做升級操作;Linux支持多內核版本並存,可直接安裝新版本內核;
2) 如果某原程序包的配置文件安裝後曾被修改過,升級時,新版本的程序提供的同一個配置文件 不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)後提供;
(2)實例演示
1)[root@localhost Packages]# rpm -e zsh
[root@localhost Packages]# rpm -F zsh-5.0.2-7.el7.x86_64.rpm
[root@localhost Packages]# rpm -U zsh-5.0.2-7.el7.x86_64.rpm
#卸載zsh程序包
#用 -F參數升級安裝zsh程序細胞,查詢結果顯示無法安裝
# -C 參數則在當不存在原有安裝包的時候能夠安裝該程序
2)將zsh-4.3.10版本升級到zsh-5.0.2版本
[root@localhost /]# rpm -q zsh #查看當前系統上的zsh程序
未安裝軟件包 zsh #顯示當前系統上未安裝zsh相關程序
[root@localhost /]# rpm -ivh zsh-4.3.10-9.el6.x86_64.rpm #安裝4.3.10版本
警告:zsh-4.3.10-9.el6.x86_64.rpm: 頭V3 RSA/SHA1 Signature, 密鑰 ID c105b9de: NOKEY
準備中... ################################# [100%]
正在升級/安裝...
1:zsh-4.3.10-9.el6 ################################# [100%]
[root@localhost /]# rpm -q zsh #顯示當前zsh版本信息
zsh-4.3.10-9.el6.x86_64
[root@localhost /]# cd /media/cdrom/Packages/ #移動到光盤鏡像5.0版本位置
[root@localhost Packages]# rpm -F zsh-5.0.2-7.el7.x86_64.rpm #升級安裝更高版本
警告:zsh-5.0.2-7.el7.x86_64.rpm: 頭V3 RSA/SHA256 Signature, 密鑰 ID f4a80eb5: NOKEY
[root@localhost Packages]# rpm -q zsh #顯示當前zsh版本信息
zsh-5.0.2-7.el7.x86_64
3.卸載:
(1)rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
--allmatches:卸載所有匹配指定名稱的程序包的各版本;
--nodeps:忽略依賴關係
--test:測試卸載,dry run模式
(2)實例演示
1)[root@localhost Packages]#rpm -e --test zsh #測試卸載zsh
[root@localhost Packages]#rpm -ql zsh #查看zsh程序安裝所生成的所有文件列表
結論:--test不會真的卸載程序
2)[root@localhost Packages] rpm -e zsh
#卸載程序
4.查詢:
(1)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包的changlog;
-l, --list:程序安裝生成的所有文件列表;
-i, --info:程序包相關的信息,版本號、大小、所屬的包組,等;
-c, --configfiles:查詢指定的程序包提供的配置文件;
-d, --docfiles:查詢指定的程序包提供的文檔;
--provides:列出指定的程序包提供的所有的CAPABILITY;
-R, --requires:查詢指定的程序包的依賴關係;
--scripts:查看程序包自帶的腳本片斷;
用法總結:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE, ...d
(2)實例演示
1)[root@localhost Packages]# rpm -ql php-mysqlnd
#查詢程序安裝所以生成的所有文件列表
2)[root@localhost Packages]# rpm -qi zsh
#顯示程序的相關信息
顯示內容註解:
[root@localhost Packages]# rpm -qi zsh
Name : zsh #安裝包名稱
Version : 5.0.2 #版本號
Release : 7.el7 #發行號
Architecture: x86_64 #所編譯的安裝平臺64位架構平臺
Install Date: 2015年12月22日 星期二 09時30分50秒 #安裝日期
Group : System Environment/Shells #屬在組:系統環境的shell中的一種
Size : 5834441 #程序大小
License : MIT #許可證:麻省理工大學
Signature : RSA/SHA256, 2014年07月04日 星期五 13時54分12秒, Key ID 24c6a8a7f4a80eb5 #簽名
Source RPM : zsh-5.0.2-7.el7.src.rpm #安裝源碼RPM包
Build Date : 2014年06月10日 星期二 10時47分02秒 #RPM包創建時間
Build Host : worker1.bsys.centos.org #創建的主人
Relocations : (not relocatable) #重新安置
Packager : CentOS BuildSystem <http://bugs.centos.org> #製作人
Vendor : CentOS #賣主
URL : http://zsh.sourceforge.net/ # 文件所在URL
Summary : Powerful interactive shell # 簡介:強大的交互式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.
3)[root@localhost Packages]# rpm -qd zsh #查看包所提供文檔位置
4)[root@localhost Packages]# rpm -qc zsh #顯示zsh相關的配置文件的位置
5)[root@localhost Packages]# rpm -q --changelog zsh #查詢zsh的改變日誌
# 從近到遠顯示出該程序每次改版更新的相關信息
6)[root@localhost Packages]# rpm -q --provides zsh #顯示程序包所提供的功能
7)[root@localhost Packages]# rpm -qR zsh #顯示安裝包所要依賴的庫及其他相關
8)[root@localhost Packages]# rpm -q --scripts zsh #顯示程序包自帶的運行腳本片段
此處有四類腳本中的三類:
#postinstall scriptlet (using /bin/sh):安裝完成會後執行腳本
#preuninstall scriptlet (using /bin/sh):卸載開始之前執行腳本
#postuninstall scriptlet (using /bin/sh):卸載完成之後執行腳本
9)[root@localhost Packages]# rpm -q --whatprovides zsh
#顯示zsh功能是被哪個程序包所提供
10)[root@localhost Packages]# rpm -q --whatrequires zsh
#查詢功能被哪個所依賴,此處zsh未被系統上安裝的包做依賴
5.校驗:
(1)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 #MD5校驗碼是否改變
D Device major/minor number mismatch #設備的主次版本號是否錯配
L readLink(2) path mismatch # readlink路徑是否錯配
U User ownership differs #用戶本身關係
G Group ownership differs # 用戶組本身關係
T mTime differs # 修改時間modify time
P caPabilities differ
(2)實例演示
測試安裝的程序的校驗信息
[root@localhost Packages]# rpm -ivh --nodeps php-5.4.16-23.el7_0.3.x86_64.rpm
[root@localhost Packages]# rpm -V php
# 忽略依賴關係安裝php程序,此處爲了測試使用
#測試程序的校驗信息
6.包來源合法性驗正和完整性驗證:
(1) 檢驗方式
數字簽名:用私鑰加密對應程序的特徵碼
(2) 獲取並導入信任的包製作者的密鑰:
1)對於CentOS發行版來說:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
2)對於官方光盤內祕鑰導入:[root@localhost cdrom]# rpm --import RPM-GPG-KEY-CentOS-7
此處的RPM-GPG-KEY-CentOS-7爲光盤內適配當前系統的光盤所自帶的驗證祕鑰,不同系統不同
當祕鑰導入到系統之後,再次安裝後會自動執行驗證,此時不會警告NOKEY
(3)驗證:
1) 安裝此組織簽名的程序時,會自動執行驗證;
2) 手動驗正:rpm -K PACKAGE_FILE
在導入祕鑰的CentOS7.1上驗證
在未導入祕鑰的CentOS 6.7 系統上驗證
7.數據庫重建:
(1)rpm管理器數據庫路徑:/var/lib/rpm/
查詢操作:通過此處的數據庫進行;
(2)獲取幫助:CentOS命令查詢位置不同
CentOS 6:man rpm
CentOS 7:man rpmdb
(3)rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化數據庫,當前無任何數據庫可實始化創建一個新的;當前有時不執行任何操作;
--rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建;
[--dbpath DIRECTORY] :指明建立位置
(4)實例演示
1)在指定目錄下/rpmdb下初始化一個rpm的數據庫
注意:此時的庫是沒用的,所以大小和原來的庫不同
2)查看/var/lib/rpm