系統管理之程序包管理(1):
程序包管理是運維人員的基本工作素質之一。在操作系統上,不斷的安裝,卸載,配置應用程序包,讓不同程序包運行提供不同的服務;利用某種工具完成某些操作的過程。這就要求運維工作人員熟悉安裝,管理應用程序包。 在linux上,程序包主要有兩種:tar,rpm包。
一、程序包概述:
-
系統接口
API:Application Program Interface 應用編程接口
ABI:APPlication Binary Interface 應用二進制接口
不同操作系統,API兼容,ABI不一定相同(windows與linux不兼容)
Unix-like:(程序后綴名的區別)
ELF
windows:
exe;msl
-
跨平臺程序
平臺不同,二進制程序的類型不同,借助庫級別的虛擬化;運行跨系統的二進制程序
linux:WinE
windows:cywin
-
開發語言分類
系統級開發語言:C/C++ go : httpd,vsftpd,nginx
應用級開發語言:JAVA/python/perl/ruby/PHP/go:
java:hadoop ,hbase,(jvm虛擬機) j虛擬機 c/c++研發
python:openstack (pvm虛擬機)
perl: (rvm解釋器)
復雜應用程序糅合不同級別開發語言,系統級語言寫程序核心,應用級輔助類的工具程序
-
語言程序格式
C/C++程序格式:
源代碼:文本格式的程序代碼
編譯開發環境:編譯器,頭文件,開發庫
二進制程序:文本格式的程序代碼–>編譯器–>二進制程序(二進制程序,庫文件,配置文件,幫助文件)
java/python程序格式:
源代碼:編譯成能夠在其虛擬機(jvm/pvm)運行的格式;
開發環境:編譯器,開發庫,
二進制格式:文本格式的程序代碼–>編譯器–>二進制程序(二進制程序,庫文件,配置文件,幫助文件)
-
項目構建工具:
借助配置文檔,自動決定程序包的編譯順序,依賴關系
依賴于開發環境
c/c++:make
java:maven
二、程序包管理器概論:
-
程序包的構建過程:
源代碼–>目標二進制格式–>把(二進制程序,庫文件,配置文件,幫助文件)組織成為一個或幾個包文件;
-
程序包管理器類型:
deblan: dpt(命令dpkg) 程序包以“.deb”為后綴
redhat: redhat package manager:rpm(命令rpm) 程序包以“.rpm””為后綴
Su.S.E: rpm包,(命令rpm) 與redhat的rpm包的路徑格式不兼容
Gentoo:ports
ArchLinux: 輕量級Linux
-
程序包命名格式:
源代碼:
name-VERSION.tar.gz
VERSION:major.minor.release(主版本號.次版本號.發行號)
例:mysql-5.0.2.tar.gz
rpm包:
name-VERSION-release.arch.rpm
VERSION:major.minor.release(主版本號.次版本號.發行號)
release.arch:rpm包的發行號.操作系統的平臺架構類型
release.os: 操作系統類型 (rhat,centos,el7)
arch:i386,X64,ppc,noarch(適用全部平臺,java編寫)
例:redis-3.0.2-1.centos7.x64.rpm
拆包:拆除多余功能的包,按需安裝程序包內的包,分主包和子包
主 包:name-VEESION-release.arch.rpm
php-5.4.16-36.el7_1.x86_64.rpm
子包:name-function-CERSION-release.arch.rpm
php-bcmath-5.4.16-36.el7_1.x86_64.rpm
-
程序包依賴關系:
包之間:可能存在依賴關系,甚至循環依賴
x,y,z
x–>y,z
y–>a,b,c
c–>D
安裝某個主包,必須安裝主包依賴的副包
解決依賴關系,使用rpm前端工具
-
庫文件:
ldd命令 查看軟件包的庫依賴性
查看二進制程序所依賴的庫文件:
ldd /PATH/TO/BINARY_FILE
管理及查看本機裝載的庫文件:
ldconfig
/sbin/ldconfig -p: 顯示本機已經緩存的所有可用庫文件名及文件路徑映射關系
配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
緩存文件: /etc/ld.so.cache
-
程序包前端工具:
yum:rhel系列上 rpm包管理器的前端工具
agt-get(apt-cache):deb包管理器的前端工具
zypper:suse的rpm管理器前段工具
dnf: Fedora 22+系統上rpm包管理器的前端工具
-
程序包管理器介紹:
功能:將編譯好的應用程序的各組成文件打包成一個或幾個程序包文件,從而更方便的實現 安裝,卸載,查詢,校驗功能
1.程序包的組成清單(每個程序包都獨立實現)
文件清單
程序包的元數據(名稱,版本,依賴性,描述)
安裝或卸載時運行的腳本
2.數據庫(公共)
存儲程序包的名稱和版本
依賴關系
功能說明
包安裝生成后的各文件的文件路徑及校驗碼信息;
注意:/var/lib/rpm/ centos程序庫的存放位置
-
獲取程序包的途徑:
(1)系統發行版的光盤或官方的文件服務器(或鏡像站點)
http://mirrors.aliyun.com/
http://mirrors.sohu.com
http://mirrors.163.com
(2)項目的官方站點
http://www.zabbix.com
(3)第三方組織 社區組織維護
Fedora-EPEL:
Rpmforge:RHEL推薦,包很全
(4)搜索引擎:不安全
http://pkgs.org
http://rpmfind.net/
http://sourceforge.net/
(5)自已動手,豐衣足食
建議:對網上下載的程序包進行md5校驗,檢查其完整性,合法性
來源合法性:
程序包的完整性;
三、centos7系統上rpm命令管理程序包:
安裝,升級卸載,查詢和校驗,數據庫維護
rpm命令:
rpm [OPTIONS] [PACKAGE_FILE]
安裝:-i,–install
升級:-U,–update,–freshen
卸載:-e,–erase
查詢:-q
校驗:-V
數據庫維護:–builddb,–initdb
-
安裝:
rpm {-i|–install} [install-options] PACKAGE_FILE…
rpm -ivh PACKAGE_FILE..
GENERAL OPTIONS:
-v:詳細信息
-VV:更詳細的輸出
[install-options]:
-h:hash marks 輸出進度條;每個#表示2%的進度
–test:測試安裝,檢查并報告依賴關系及沖突消息,并不真正安裝程序
–nodeps:忽略依賴關系,強制安裝 ,但程序不一定能使用 不建議
–replacepkgs重新安裝
—replacefiles 重新安裝,忽略重復文件
–nosignature:不檢查報名簽名信息,不檢查來源合法性
–nodigest:不檢查包的完整性信息 (校驗 MD5)
–justdb:更新數據庫,但不重新安裝
–noscripts 不執行全部程序包腳本
注意:rpm可以自帶腳本
腳本分四類:(特定的腳本的參數,可以單獨選擇)
preinstall:安裝過程開始之前運行的腳本,%pre –nopre
postinstall:安裝過程完成之后運行的腳本 $post –nopost
preuninstall:卸載過程真正開始前運行的腳本 $preun –nopreun
postuninstall:卸載過程中運行的腳本 $postun –nopreun
-
升級:原文件丟失
rpm {-U|–upgrade} [install-options] PACKAGE_FILE..
rpm {-F|-freshen} [install-options] PACKAGE_FILE..
[PTIONS]
-U:有舊版本升級或原程序不存在執行安裝
-F:只執行升級
rpm -Uvh PACKAGE_FILE..
rpm -Fvh PACKAGE_FILE.
[install-options]:
–oldpackage:降級安裝舊版本
–force:強制;新版本的程序包不滿足老版本的依賴關系 ,強制安裝或強制升級,忽略依賴關系,也可配合rpm -ivh選項
注意:
(1)不要對內核kernel做升級操作 linux支持多內核并存,因此,直接安裝新版本內核即可
(2)如果某原程序包的配置文件安裝后曾被修改過,升級時,新版本的程序提供的同一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重名命為(FILEname.rpmnew)后提供
-
卸載:
rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts][–notriggers] [–test] PACKAGE_NAME …
–allmatches:卸載所有匹配指定名稱的程序包的各版本
–nodeps:強制忽略依賴關系
–test:測試卸載:dry run模式
-
查詢:
rpm {-q|–query} [select-options] [query-options] PACKAGE_NAME …
select-options:
PACKAGE_NAME :查詢指定程序包是否安裝及安裝信息
-a:所有已安裝的程序包列表
-f:查詢指定的文件由那個程序包安裝
-g:查詢指定包組中包含哪些包
-p:對未安裝的程序包執行查詢操作;
–whatprovides CAPABILITY:查詢指定的CAPABILITY由那個程序包提供;
–whatrequires CAPABILITY:查詢指定的CAPABILITY被那個程序包所依賴;
query-options:
–changelog:查詢rpm包的changlog
-l:rpm包生成的所有文件列表
-i:查詢程序包相關的信息,版本號,大小,所屬包組等等
-c:查詢指定的程序包提供的配置文件
-d:查詢指定的程序包提供的幫助文檔
–provides:列出指定的程序包提供的所有的CAPABILITY. 在確定–whatprovides CAPABILITY
-R:查詢指定程序包的依賴關系
–scripts:查詢指定程序包自帶的腳本片段
哪個包所依賴
rpm2cpio 包文件|cpio –itv 預覽包內文件
rpm2cpio 包文件|cpio –id “ *.conf” 釋放包內文件
用法:
-ql ,-qd,-qc,-qi,-qa PACKAGE_NAME
-qp{i,c,d,f} PACKAGE_FILE :未安裝程序的詳細信息
-
校驗:
rpm {-V|–verify} [select-options] [verify-options] 程序名
只要改變服務下的任意文件,使用-V校驗,都可看到修改信息
例:修改httpd的配置文件,校驗httpd服務
[root@wen-7 ~]# rpm -qc httpd /etc/httpd/conf.d/autoindex.conf /etc/httpd/conf.d/userdi ....... [root@wen-7 ~]# vim /etc/sysconfig/httpd[ root@wen-7 ~]# rpm -V httpd S.5....T. c /etc/httpd/conf/httpd.conf S.5....T. c /etc/sysconfig/httpd
顯示信息的含義:
S file Size differs 文件大小
M Mode differs (includes permissions and file type) 權限
5 digest (formerly MD5 sum) differs MD5
D Device major/minor number mismatc 主次設備號不配備
L readLink(2) path mismatch 路徑不匹配
U User ownership differs 屬主匹配
G Group ownership differs 屬組比匹配
T mTime differs 時間戳改變
P caPabilities differ
-
數據庫重建:
rpm管理器數據庫路徑:/var/lib/rpm/ 該目錄嚴重保護,全額備份
查詢操作:通過此處的數據庫進行;
NAME
rpmdb – RPM Database Tool
SYNOPSIS
rpm {–initdb|–rebuilddb} [-v] [–dbpath DIRECTORY] [–root DIRECTORY]
–initdb:初始化數據庫,當前無任何數據庫可初始化創建一個新的,當前有時,不執行任何操作
–rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建(不管如何,直接重建)
例:
[root@wen-7 ~]# mkdir /tmp/rpm [root@wen-7 ~]# rpm --initdb --dbpath=/tmp/rpm/ [root@wen-7 ~]# ls /tmp/rpm/ Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5 Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername [root@wen-7 ~]# rpm --initdb --dbpath=/tmp/rpm/ [root@wen-7 ~]# ls /tmp/rpm/ Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5 Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername [root@wen-7 ~]# rpm --rebuilddb --dbpath=/tmp/rpm/ [root@wen-7 ~]# ls /tmp/rpm/ Basenames Dirnames Installtid Obsoletename Providename Sha1header Triggername Conflictname Group Name Packages Requirename Sigmd5
-
程序包 來源合法性和完整性驗證:
來源合法性驗證:RSA
完整性驗證:SHA256
公鑰加密:
對稱加密:加密、解密使用同一密鑰;
非對稱加密:密鑰是成對兒的
public key: 公鑰,公開所有人
secret key: 私鑰, 不能公開
獲取并導入信任的包制作者的公鑰:
rpm -K|checksig rpmfile 檢查包的完整性和簽名
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7發行版光盤提供: RPM-GPG-KEY-CentOS-7
rpm -qa gpg-pubkey
對于Centos發行版來說:rpm-import /etc/pki/rpm-gpg/RPM-GPG-KEY-centos-7
驗正:
(1)安裝此組織簽名的程序時,會自動執行驗證
(2)手動驗證:rpm- k PACEAGE-FILE
實戰:
1.某程序的某文件被破壞,為了保留原來其他文件的配置,只恢復單個文件.
[root@wen-7 ~]#rpm -q --whatprovides zsh 查看指定功能所依賴的包(針對文件丟失情況,不知道文件名稱) zsh-4.3.10-9.el6.x86_64 [root@wen-7 ~]# rpm -qf /usr/share/zsh 或查看某個文件所依賴的包 (針對文件未丟失,僅損壞) systemd-219-19.el7.x86_64 pulseaudio-6.0-7.el7.x86_64 zsh-4.3.10-9.el6.x86_64 [root@wen-7 ~]# cp zsh-4.3.10-7.el6.x86_64.rpm ~ #復制包文件 root@wen-7 ~]# rpm2cpio zsh-4.3.10-7.el6.x86_64.rpm | cpio -itv #查看包內文件 [root@wen-7 ~]# rpm2cpio zsh-4.3.10-7.el6.x86_64.rpm | cpio -id /usr/share/zsh # 提取包內的某個文件,至當前目錄 [root@wen-7 ~]# ll usr/share/ #查看提取出的文件, 總用量 0 drwxr-xr-x 3 root root 23 8月 21 14:52 doc drwxr-xr-x 2 root root 124 8月 21 14:52 info drwxr-xr-x 3 root root 17 8月 21 14:52 man drwxr-xr-x 4 root root 40 8月 21 14:52 zsh [root@wen-7 share]# cp -r zsh /usr/share/ #復制文件至原來位置(即提取出的文件的路徑) [root@wen-7 share]# ll /usr/share/zsh # 查看原來位置的文件是否復制成功 總用量 0 drwxr-xr-x 4 root root 36 8月 21 14:56 4.3.10 drwxr-xr-x 2 root root 6 8月 21 14:56 site-functions
2.安裝程序包
[root@wen-7 base]# rpm -ivh zsh-html-4.3.10-7.el6.x86_64.rpm -ivh :安裝程序,顯示詳細信息,并顯示進度條 警告:zsh-html-4.3.10-7.el6.x86_64.rpm: 頭V3 RSA/SHA1 Signature, 密鑰 ID c105b9de: NOKEY 準備中... ################################# [100%] 正在升級/安裝... 1:zsh-html-4.3.10-7.el6 ################################# [100%] [root@wen-7 base]# rpm -qi zsh-html #查詢程序包的相關信息 Name : zsh-html Version : 4.3.10 Release : 7.el6 Architecture: x86_64 Install Date: 2016年08月21日 星期日 15時01分03秒 [root@wen-7 base]# rpm -ivh --test zd1211-firmware-1.4-4.el6.noarch.rpm --test : 測試安裝 測試安裝情況,不真正安裝 警告:zd1211-firmware-1.4-4.el6.noarch.rpm: 頭V3 RSA/SHA256 Signature, 密鑰 ID c105b9de: NOKEY 準備中... ################################# [100%] [root@wen-7 base]# rpm -qi zd1211-firmware 未安裝軟件包 zd1211-firmware [root@wen-7 base]# rpm -ivh --test zd1211-firmware-1.4-4.el6.noarch.rpm 警告:zd1211-firmware-1.4-4.el6.noarch.rpm: 頭V3 RSA/SHA256 Signature, 密鑰 ID c105b9de: NOKEY 準備中... ################################# [100%] [root@wen-7 base]# rpm -qi zd1211-firmware 未安裝軟件包 zd1211-firmware [root@wen-7 base]# rpm -ivh --nosignature zd1211-firmware-1.4-4.el6.noarch.rpm --nosigbature: 不檢查包的來源合法性,無頭V3 RSA/SHA256 準備中... ################################# [100%] 正在升級/安裝... 1:zd1211-firmware-1.4-4.el6 ################################# [100%]
3.升級程序包
[root@wen-7 base]# rpm -U zlib-1.2.3-29.el6.x86_64.rpm 升級某程序包,程序包不存在則執行安裝 [root@wen-7 base]# rpm -U --force zlib-1.2.3-29.el6.x86_64.rpm 強制升級 ,不關心依賴關系,(可能強制升級單個程序包.但不能使用) [root@wen-7 base]# rpm -U --oldpackage --force zlib-1.2.3-29.el6.x86_64.rpm :強制降級某程序包,安裝舊版本 可以不強制
4.卸載程序包
[root@wen-7 base]# rpm -e zsh 命令加上程序包名 直接卸載 [root@wen-7 base]# rpm -qi zsh 未安裝軟件包 zsh [root@wen-7 base]# rpm -e zlib 不能直接卸載有依賴關系的程序包 錯誤:依賴檢測失敗: libz.so.1()(64bit) 被 (已安裝) libxml2-2.9.1-5.el7_1.2.x86_64 需要 libz.so.1()(64bit) 被 (已安裝) info-5.1-4.el7.x86_64 需要 libz.so.1()(64bit) 被 (已安裝) libpng-2:1.5.13-5.el7.x86_64 需要 libz.so.1()(64bit) 被 (已安裝) librevenge-0.0.2-2.el7.x86_64 需要 [root@wen-7 base]# rpm -e --nodeps zlib 如果想卸載某個有依賴關系的程序包,需使用--nodeps 選項,強制卸載某程序包,但不建議使用,會破壞某工具的使用 [root@wen-7 base]# rpm -e --test --nodeps zlib 測試卸載 ,不真實卸載 [root@wen-7 base]# rpm -e --allmatches zlib 卸載所有匹配指定名稱的程序包的各版本
回顧:
rpm命令實現程序管理:
安裝:-ivh –nodepsd,–replacepkgs
卸載:-e,–nodeps
升級:-Uvh,-Fvh –nodeps,–oldpackage
查詢:-q,-qa,-qf,-qi,-qd,-qc,-q –scripts,-q –changlog,-q –provides,-q –requires
校驗:-v
導入GPG密鑰:–import,-K,–nodigest,–nosignature
數據庫重建:–initdb ,–redilddb
以上是對程序包管理的概論和對rpm命令的總結,依據此文檔可以Centos6.8或7.2系統做練習,熟悉rpm的系列命令。下節將介紹程序包管理之Yum工具的介紹,歡迎閱讀,參考。
原創文章,作者:wencx,如若轉載,請注明出處:http://www.www58058.com/38261