系统管理之程序包管理(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.178linux.com/38261