(注:此博文源于夜归人的博客)
程序包管理,rpm、yum的使用
程序包管理的相关概念:
<<===============================================================================================>>
软件包的组成部分:
1、二进制程序:可执行文件
通常安装在 /bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin, /usr/local/sbin 目录之下
2、库文件:
程序的运行依赖于库文件,Linux的核心库是glibc,某些软件也会将自己的核心文件封装成库文件,
以供其他程序调用或二次开发。
Linux下的库分为静态库和动态库,静态库通常以".a"结尾,动态库通常以".so"结尾。
通常安装在 /usr/lib, /usr/lib64, /var/lib, /usr/local/lib 目录下
★库文件也是可执行程序,但不能直接执行,因为库文件没有执行入口,只能被其他文件调用执行。
调用的两种方式:
开发调用:二进制格式的库
运行调用:文本格式的头文件
函数(参数)头文件 /usr/include, /usr/local/include
#inclue stdio.h
链接程序所要查找动态格式的共享对象库时的路径:
/etc/ld.so.conf
/etc/ld.so.conf.d/*.conf
ldd:用于查看程序或者库文件所依赖的共享库列表
ldd [OPTION]... FILE...
例如:
[root@CentOS7 ~]# ldd /bin/cat
linux-vdso.so.1 => (0x00007fffa5ffe000)
libc.so.6 => /lib64/libc.so.6 (0x00007f013c418000)
/lib64/ld-linux-x86-64.so.2 (0x00007f013c7e2000)
3、配置文件:通常是纯文本文件,用来定义程序的特性。
通常存放在:/etc, /usr/etc, /usr/local/etc 或指定的路径下(配置文件一般无需额外配置)
4、帮助文档:man手册、info文件、README、INSTALL、ChangeLog
man COMMAND
到某路径下查找与命令同名的,通常以.gz结尾的压缩文件的名字
/usr/share/man/
man 的配置文件: /etc/man.config
★总结:如果是指定路径安装程序
例如:/usr/local/nginx
二进制程序:bin、sbin
库:lib
头文件:include
配置文件:etc、conf
帮助文件:man
软件包管理器的两个重要功能:
1、数据库:
软件名和版本
安装生成的各文件路径及校验码
各软件包之间的依赖关系
提供功能性说明
rpm -qi FILENAME
2、提供程序组成格式:
文件清单
安装或卸载时运行的脚本
常见的软件包管理器:
Debian系列:dpkg (DebianPackager) 管理 以.deb 结尾的软件包。
“Debian”的“Linux ”发行版都使用 “dpkg”,例如 “Ubuntu”、“Knoppix ”等。
RedHat系列: rpm ( RPM isPackage Manager ) 管理 以.rpm 结尾的软件包。
以前是RedHat Package Manager的缩写,现在包括OpenLinux、S.u.S.E.以及TurboLinux等
Linux的分发版本都有采用该包管理器,算是公认的行业标准了。
包管理器的基本功能:
制作程序包
安装程序包
查询程序包
升级程序包
卸载程序包
校验程序包
数据库管理
应用程序的安装方式
1、使用包管理器:便捷、易用
2、包管理器的前端工具:yum
3、简单打包的二进制格式:展开到特定路径下
4、使用源代码编译:
rpm包命名格式:
源程序:PackageName-version.tar.{gz|bz2|xz}
version:major.minor.release
通常版本号(Version)有三个:major.minor.release——主版本号.次版本号.发行号
主版本号:是程序的主要功能发生了巨大的改变时才使用;
次版本号:是在程序的部分功能有重大改变时使用;
发行号:是在修复了一些bug,调整了一些属性后进行的升级。
rpm包:name-version-release.arch.rpm
RPM包的Version号和源程序的版本号需要保持一致,这里的release号通常包含rpm的制作发行号,
和源程序本身没有关系,并且这个Release号可能会标明所适用的操作系统平台。
arch指的是安装在哪种主机平台上,常见的主机平台有:
i686、x86_64、amd64、ppc(powerPC)、noarch(不依赖平台)等。
如:bash-4.3.2-6.el6.x86_64.rpm
表明这是一个bash程序包;其源程序的主版本号为4,次版本号是3,发行号2;
它是第6次修正的RPM包;这个包用在RedHat6的Enterprise版上;适用于x86_64的主机平台。
有些没有指定arch的rpm包,可能是通用版本
如:nginx.1.4.16-5.rpm
rpm包的分包:
将程序的某些功能做成独立的包,让用户选择安装
一个程序可能会有许多功能,其中不少功能是用不上的,如某些程序提供了头文件,用来供程序员
进行二次开发,而普通用户根本不需要对该程序进行二次开发,所以只需要安装该程序的配置文件
和二进制文件就即可。
RPM包可以分为主包(核心包)和分包(支包),其中主包的包名遵循RPM包的基本命名规则。
如:主包:bash-4.3.2-2.el6.x86_64.rpm
支包:bash-hello-4.3.2-2.el6.x86_64.rpm
bash-world-4.3.2-2.el6.x86_64.rpm
DNS: bind, bind-devel, bind-libs, bind-utils
程序包来源合法性验证:
源程序:通过md5或sha1验证码验证
rpm包:发行商提供的合法性是可信的
验证包完整性:校验码
验证来源合法:公钥
获取rpm包的途径:
1、发行商的光盘或站点服务器
以CentOS为例:
2、fedora-EPEL
3、项目的官方站点
4、搜索引擎:
rpm包管理器的使用:
<<======================================【rpm管理:安装】======================================>>
rpm包管理:安装
rpm {-i|--install} [install-options] PACKAGE_FILE ...
-v verbose
-vv
-vvv
-h hash,以#的个数显示安装进度,一个#表示2%的进度;
--test: 仅测试,不真正执行安装过程
每个rpm包都提供一个或多个capability,安装一个程序包时可能需要依赖或被别的包所依赖
如果存在依赖:
解决依赖关系:
忽略依赖关系: --nodeps
重新安装: --replacepkgs
原来的配置文件不会被覆盖,新安装的配置文件将会重命名为以.rpmnew为后缀的文件
实例1:安装程序包
实例2:测试安装程序包
实例3:安装程序包时忽略依赖关系
实例4:重新安装已安装过的程序包
<<====================================【rpm管理:卸载】====================================>>
rpm包管理:卸载
rpm -e或--erase
rpm -e package_name
如果卸载被其他程序所依赖的包
1、把依赖者一同卸载;
2、忽略依赖关系;
--nodeps
--noscrips: 卸载时不运行脚本
3、不再卸载
实例:卸载已安装的程序包
实例:卸载时忽略依赖关系
<<======================================【rpm管理:查询】======================================>>
rpm包管理:查询
查询所有已安装的包:rpm -qa
查询某单个包是否安装: rpm -q package_name
查询包安装之后在当前系统生成的文件列表: rpm -ql package_name
查询某文件是哪个包安装生成的: rpm -qf /PATH/TO/SOMEFILE
查询包安装后生成的帮助文档: rpm -qd package_name
查询包安装后生成的配置文件: rpm -qc package_name
查询包的描述信息:rpm -qi package_name
查询包相关的脚本: rpm -q --scripts package_name
脚本有四类:
preinstall: 安装前脚本
postinstall: 安装后脚本
preuninstall: 卸载前脚本
postuninstall: 卸载后脚本
查询尚未安装的rpm包文件:rpm -qp
查询安装后会生成的文件列表:rpm -qpl /PATH/TO/package_file
查询其简单描述信息: rpm -qpi /PATH/TO/package_file
实例1:查询 lsof-4.82-5.el6.x86_64程序包安装后生成的文件列表
实例2:查询/usr/share/man/man8/lsof.8.gz文件是由哪个包安装所生成的
实例3:查询程序包安装后生成有哪些帮助文档
实例4:查询程序包安装后生成的配置文件
实例5:查询程序包安装完后生成的脚本
实例6:查询bash程序包的描述信息
Name:软件名称
Relocations:在安装时是否可指定安装路径(重定位)
Version:版本号
Vendor:提供商
Release:rpm的发行号
BuildDate:rpm包的制作日期
InstallDate:安装时间
Build Host:在哪个系统上制作的rpm包
Group:包组
SourceRPM:源码的rpm包
Size:包大小
License:许可证
Signature:数字签名(验证来源合法性和包完整性)
Packager:包的制作者
URL:获取源码的网址
Summary:简要说明
Description:略详细的说明
<<======================================【rpm管理:升级】======================================>>
rpm包管理:升级
rpm -U: 升级或安装,如果有旧版程序包,则升级,如果没有,则安装
rpm -F: 仅升级,如果有旧版程序包,则升级,如果没有,则不安装
rpm {-Uvh|-Fvh} /PATH/TO/package_file
--nodeps: 忽略依赖关系
--oldpackage: 降级
--force: 强行安装
注意: 不要对内核执行升级操作
多版本内核可并存,因此,要执行安装操作
实例1:升级程序包,升级过程中提示有依赖关系时忽略,继续更新
实例2:把刚升级的程序包降级为原来的版本
<<======================================【rpm管理:校验】======================================>>
rpm包管理:校验
检查包安装后生成的文件是否被修改过
rpm -V package_name
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
校验软件包来源合法性和完整性
包完整性:通过单向加加密机制(md5|sha1)
来源合法性:通过公钥加密机制(RSA)
导入制作者的公钥:CentOS发行版的公钥在iso文件中
导入命令:rpm --import /PATH/TO/gpg-key-file
检查: rpm -K /PATH/TO/package_file
rpm --checksig /PATH/TO/package_file
--nosignature: 不检查来源合法性
--nodigest:不检查完整性
实例1:分别对程序包安装后生成的文件进行改名和修改操作,然后验证
实例2:导入公钥验证软件包的来源合法性和完整性
<<================================【rpm管理:数据库重建】================================>>
rpm包管理:数据库重建
数据库:/var/lib/rpm/
重建:
rpm --initdb:初始化
如果事先不存在一个数据库,则新建
rpm --rebuilddb:重建
直接重建数据,会覆盖原有的库
程序包的依赖关系:
<<===============================================================================================>>
由于许多程序包之间存在这依赖关系,例如A依赖B,而B又依赖X、Y...
所以使用rpm管理器安装或卸载程序时会有诸多不便,很可能安装一个程序包之后由于所依赖的另外一个程序
包没有安装,造成安装失败,或是卸载程序把被其他程序包依赖的包卸载了,导致其他程序无法运行等……
因此为了解决这一问题,后来便有了程序包的前端管理器,它会自动处理程序包之间的依赖关系
前端管理器:
Debian:apt-get
RedHat:yum (Yellowdog Update Modifed)
dnf:下一代解决依赖关系的程序包前端管理器
文件服务器(共享rpm包):通过yum所支持的文件共享机制,将各rpm包通过文件服务共享
repository:仓库
1、各rpm包
2、依赖关系、程序包安装后所能生成文件列表等元数据文件
yum客户端:
1、配置文件:指定各可用的yum仓库
2、缓存元数据: yum会到各可用yum仓库获取元数据,并缓存至本地
3、分析元数据:根据具体操作请求完成元数据分析,可能包括检查依赖关系,文件列表等信息
4、执行具体操作
客户端配置文件指定对应服务器的访问方式
http http://server/path/to/repo
nfs nfs://server/nfs_path
file file:///path/to/repository
yum程序的配置文件:
<<===============================================================================================>>
要使用yum管理应用程序,首先得配置其可用的yum仓库,保存在配置文件中
/etc/yum.conf
/etc/yum.repos.d/
配置文件格式:
由两段组成,类似windows的ini配置文件
[main]:主配置段
[repo]:仓库配置段
[root@CentOS-6 ~]# cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever #缓存目录
keepcache=0 #删除缓存中已安装的rpm包
debuglevel=2 #调试级别
logfile=/var/log/yum.log #日志文件
exactarch=1 #必须跟当前主机的版本完全精确匹配才安装
obsoletes=1 #过去的,废弃的
gpgcheck=1 #是否检验其来源合法性及数据包完整性
plugins=1 #是否支持插件
installonly_limit=5 #
bugtracker_url= #追踪bug保存的位置
distroverpkg=centos-release
定义一个仓库指向(配置repo):
[repo_ID]
name=仓库描述信息
baseurl=仓库的访问路径
# mirrorlist=SCHEME://HOSTNAME/PATH/TO/MIRROR_LIST_FILE
enabled={1|0}
gpgcheck={1|0}
gpgkey=公钥文件(可以在本地,也可以是服务器端路径)
cost=定义此仓库的开销,默认为1000
例:
repo文件:
[base]
name=CentOS-6 - Base - 163.com
baseurl=http://mirrors.163.com/centos/6/os/x86_64/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
yum配置文件中可用的四个宏:
$releasever: #程序的版本,对yum而言指的是redhat-release版本,只替换为主版本号,RedHat6.5,则替换为6
$arch: #系统CPU架构
$basearch: #系统基本架构,如i686,i586等的基本架构为i386
$YUM0-9: #在系统中定义的环境变量,可以在yum中使用
★宏的作用是变量替换,如:想让不同系统架构都使用同一个repo(通用版本)。
[base]
name=CentOS-$releasever -Base - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
<<=========================================【yum命令】=========================================>>
yum命令
格式:
yum [options] [command] [package ...]
yum的各命令:
repolist [all|enabled|disabled]: 列出所有可用yumrepo
clean [all|packages|metadata|expire-cache|rpmdb|plugins]: 清理缓存
makecache: 生成缓存
list [all|installed|available]: 列出rpm包
info package_name: 列出包的描述信息
install package_name ... : 安装指定的程序包
reinstall package_name ... : 重新安装指定的程序包
chek-update package_name: 检查可升级的程序包
downgrade package_name: 降级
update package_name: 升级指定的程序包
★直接update 程序包名,将会升级到最新的版本,
如果有多个版本,想升级到指定的版本号,要明确指定版本号
erase|remove package_name... :卸载时所依赖的包也将一并卸载
whatprovides|provides /PATH/TO/SOMEFILE: 查询指定文件由哪个包安装生成
history: yum的历史
search KEYWORD:搜索程序包
★安装本地包:
install /PATH/TO/package_file
手动禁止检查来源及完整性: --nogpgcheck
如:
yum install /tmp/finger-0.17-40.el6.x86_64 --nogpgcheck
grouplist: 列出所有包组
groupinstall "group_name": 安装指定的包组
groupremove "group_name" : 卸载指定的包组
groupinfo "package_name": 显示包组相关信息
三个跟开发相关的包组:
Desktop Platform Development :有图形程序时需安装此组
Server Platform Development :服务器平台开发包组
Developmetn tools:开发包组
★提示:
如果系统为CentOS 5,常用的开发包组为"DevelopmentTools" 和 "Development Libraries"
如果系统为CentOS 6,常用的开发包组为"DevelopmentTools" 和 "Server Platfrom Development"
实例1:查看当前系统上所有可用的yum源
实例2:卸载指定的程序包
实例3:检测指定的程序包是否有更新,然后更新程序包
实例4:对指定的程序包进行降级处理
降级完后查看版本:
<<========================================【制作yum源】========================================>>
制作yum源
yum repositories
文件服务器
/PATH/TO/REPO
repodata/
repomd.xml
使用发行版光盘当本地yum仓库:
1、先禁用当前可用的yum仓库,(可把repo配置文件改名)然后执行 yum clean all 命令清空
2、创建一个 local-media-repo 配置文件
[CentOS 6.7 ISO]
name=CentOS 6.7 x86_64 release iso file
baseurl=file:///media/
enable=1
gpgcheck=1
gpgky=file:///RPM-GPG-KEY-CentOS-6
创建本地yum仓库
crepodata是一个目录,里面包含了yum仓库索引文件和rpm包的一些信息。
创建本地yum仓库时使用createropo命令,它会自动创建repodata目录及目录内的数据库文件
createrepo /PATH/DirName
实例:
使用发行版光盘当本地yum仓库
1、先禁用当前可用的yum仓库(修改当前yum仓库配置文件后缀名)
2、插入光盘-->挂载-->
3、在/etc/yum.repo.d/目录下创建repo配置文件local-media-repo,并编辑
4、使用yum repolist 验证,查看当前系统可用yum仓库