linux系统管理员在管理操作系统时,管理操作系统上的软件几乎是系统管理员必备的功能。在早期debain发行版中,debain的开发人员为开发了一款名叫dpkg的软件包管理器。后来redhat的开发人员仿照dpkg开发了一个和dpkg功能类似,但功能比其更强大的一款名叫rpm(RPM is Package Manager)的软件包管理器。目前rpm软件包管理器已经是linux界软件包管理器的工业标准。由于linux中的大多数功能复杂的软件都是由众多功能单一软件组合起来实现的。因此,当我们用rpm管理器给linux安装软件包时。往往会产生依赖关系。例如:我们在安装A时,A依赖B,B依赖C,C又依赖D,据此你在安装A的时候,就不得不把B、C、D都自己一个个的手动装上。更有趣的是我们在安装A时,A依赖B,B依赖C,C依赖D,D又依赖A,从而形成了循环依赖导致A软件包安装不上去。很显然我们需要一种方式来解决linux安装软件包时产生的依赖关系,centos上的yum和debain上的apt-get工具就能解决软件安装时产生的依赖关系。下面我们详细介绍一下centos上的rpm和yum工具。
rpm(RPM is Package Manager):是redhat和centos等linux操作系统上的软件包管理工具,现已成为linux界软件包管理器的工业标准。主要提供了安装、卸载、升级、查询、校验、数据库管理等功能。rpm的使用场景及其具体用法如下如下:
rpm软件包命名格式:
name-[subname]-major-minor-src_release.rpm_release.arch.rpm
name:软件包的名称
subname:软件包的子包名称
major:用于编译此rpm包的源码包的主版本号
minor:用于编译此rpm包的源码包的次版本号
src_release:用于编译此rpm包的源码包的修订号
rpm_release:编译此rpm的修订号(表示第几次用同一个源码编译成软件包,其中还包括此软件包使用的os)
arch:表示此软件包编译时用到的CPU架构(常见的有i386、x86_64)
示例:httpd-2.2.3-91.el5.centos.i386.rpm
安装软件包
rpm [option] /path/to/package_file
-i:安装
-v:显示安装详细信息
-h:以#号显示安装进度,每个#号代表2%的安装进度
组合用法:rpm -ivh /path/to/package_file
--nodeps:安装时忽略依赖关系。(此方式安装的软件可能运行不了)
--test:测试安装,不是真正的安装。
--replacepkgs:重新安装(如果原有配置文件作了修改,很有可能不执行替换,而是将应该安装生成的配置文件重命名为 .rpmnew)
卸载软件包
rpm [option] package_name
-e:卸载(如果包的配置文件安装后曾被改动过,卸载时,此文件将不会卸载,而是被重命名并保留,例如warning: /etc/zprofile saved as /etc/zprofile.rpmsave.)
--nodeps:卸载时忽略依赖关系(卸载后,依赖次软件包的程序可能无法正常运行)
升级软件包
rpm [option] /path/to/package_file
-Uvh:升级或安装,如果旧版本的软件包不存在,则安装此软件包;如果旧的软件包存在,则升级旧软件包。
-Fvh:纯升级,如果旧版本的软件包不存在,则不安装此软件包;如果旧的软件包存在,则升级旧软件包。
注意:不应该对内核执行升级操作,而是安装。系统允许多内核并存
查询软件包相关信息
rpm [option] package_name
-q 查询某包是否安装
-qa 查询所有已经安装的包
-qi 查询包的描述信息
-ql 查询某包安装生成了哪些文件
-qc 查询某包安装生成了哪些配置文件
-qd 查询某包安装生成了哪些帮助文件
rpm -q --scripts package_name 查询程序包的相关脚本
脚本有四类:
preinstall:安装前脚本
postinstall: 安装后脚本
preuninstall: 卸载前脚本
postuninstall: 年前后脚本
rpm [option] /path/to/package_file
-qf 查询某文件是由哪个包安装生成的
-qpi:查询未安装包的描述信息
-qpl:查询未安装包的安装文件列表
-qpc:查询未安装包的配置文件及其路径
-qpd:查询未安装包的帮助文件及其路径
校验:用于检查包安装生成的文件属性是否发生变化
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
某属性无变化,显示为.
rpm包来源合法性及完整性检验:
前提:在当前系统上导入包的制作者的公钥
导入:
rpm --import /path/to/key_file
rpm -qa gpg-pubkey*:显示所有已经导入的gpg格式的公钥 rpm -qi gpg-pubkey-NAME:显示密钥的详细信息
检查包:安装过程中会自动执行
手动检查:
rpm -K /path/to/package_file
rpm --checksig /path/to/package_file
rpm -K --nodigest:不检查包完整性:
rpm -K --nosignature:不检查来源合法性
rpm数据库重建:
数据库目录:/var/lib/rpm
rpm --initdb:初始化
如果事先没有库,会新建一个;如果有,则不新建; rpm --rebuilddb: 重建
直接重建,覆盖原有的数据库
yum(yellowdog update manager):yum是centos或redhat系统上软件包安装时自动解决依赖关系的工具。其工作原理如下图
首先yum客户端在命令行中执行yum命令安装程序时,然后客户端会根据其本地定义的yum配置文件中的baseurl找到yum仓库,并将其的repodata元数据下载下来缓存到本地,在本地对其进行解压分析并解决将要安装的软件的依赖关系,从而决定安装此程序需要安装哪些依赖包。最后根据分析结果到指定的yum仓库下载需要安装的包及其依赖包到本地,并调用rpm软件包管理器进行安装。
yum客户端命令的用法:
yum list:列出yum仓库及仓库中的软件包
yum repolist:列出本地可用的yum仓库但不列出yum仓库的软件包
yum install package_name:安装软件包(centos 6以上的版本,在安装仓库中的包时,自动解决依赖关系。centos 5中对应的选项为 localinstall)
yum reinstall package_name:重新安装软件包
yum grouplist package_name:安装软件包组
yum remove package_name:卸载软件包
yum update package_name:升级软件包
yum downgrade package_name:给软件包降级
yum info package_name:查看软件包的描述信息
yum clean {metadata|packages|all}:清除yum缓存
注:客户端的yum缓存在/var/cache/yum/$basearch/$releasever目录中
$basearh:表示当前系统的CPU基本平台,常见的有(i386、x86_64)。
$releasever:表示当前系统发行版的主版本号。
这两个变量也可以在yum客户端的配置文件中使用
yum客户端配置文件的基本格式
[repo-id]
baseurl=http://mirrors.163.com/centos/5/os/i386/ #yum仓库的url路径(要指到repodata目录的父目录)
enabled={1|0} #配置此yum仓库是否启用。启用为1,不启用为0
gpgcheck={1|0} #配置是否启用gpg来验证软件包的来源合法性和完整性。启用为1,不启用为0(与gpgkey一同使用)
gpgkey=http://mirrors.163.com/centos/5/os/i386/RPM-GPG-KEY-CentOS-5 #指定当前仓库中软件包制作者的公钥的url路径
cost=1000 #访问此仓库的花销,默认为1000,值越小,优先级越高
如何配置yum源
首先要把完成同一功能的软件包放到指定目录,然后使用createrepo /rpm/dir/命令给目录中的软件包创建元数据,元数据保存在软件包存放的目录中的repodata目录中,其中保存了当前仓库中的各个软件包的名称、描述信息、其是否已被安装、包组及其描述信息和各个软件包之间的依赖关系等信息。然后安装http或ftp或nfs服务将软件包所在的目录对外发布即可。