Linux程序包的管理需要依赖程序包管理工具,程序包管理工具可以实现程序的安装、升级、卸载、查询和校验,等等相关操作。本文主要介绍使用rpm和yum实现程序包的管理。
- rpm程序包管理基础
(1) rpm程序包的命名格式
(2) 如何获取rpm程序包?- rpm命令
(1) 安装
(2) 升级
(3) 卸载
(4) 查询
(5) 校验
(6) rpm数据库管理
(7) rpm命令的相关示例- yum命令
(1) yum仓库
(2) yum的配置文件
(3) 通过yum命令管理程序
(4) yum仓库配置示例
(5) yum命令的相关示例
1、rpm程序包管理基础
(1) rpm程序包的命名格式
rpm程序包通常分为主程序包和程序包分支,命名格式分别如下:
- 主程序包命名格式
NAME-VERSION-RELEASE.ARCH.rpm - 程序包分支命名格式
NAME-FUNCTION-VERSION-RELEASE.ARCH.rpm
命名中各字段的含义:
NAME:程序包名,与源代码的名称一致
VERSION: major.minor.release,版本信息,与源代码的版本信息一致,如4.3.2(主版本号.次版本号.发行号)
RELEASE:rpm程序包自身的发行号,与源代码的发行号无关,是制作rpm包的不同修订版本,RELEASE还包括此rpm包适用的系统,如4.3.2-2.centos7
ARCH:支持的cpu架构,如:i386、x86_64
FUNCTION:用于描述程序包分支的功能
这里贴一张图来加深理解,出处不详:
(2) 如何获取rpm程序包?
系统发行版的光盘或官方的文件服务器(或其他镜像站点)。
系统自带的程序包可以光盘或光盘镜像文件获取。
如:http://mirrors.aliyun.com | http://mirrors.sohu.com | http://mirrors.163.com程序项目的官方站点。
如:http://www.zabbix.comEPEL
EPEL(Extra Packages for Enterprise Linux)是由Fedora Special Interest Group维护的Enterprise Linux(RHEL、CentOS)中经常用到的包。rpm搜索引擎
如:http://pkgs.org | http://rpmfind.net | http://rpm.pbone.net自己制作rpm包
建议在网上获取rpm包后,检查其合法性(来源合法性和程序包完整性)
2、rpm命令
Linux发行版如RedHat、SuSE系列目前都是用rpm来实现程序包管理。
rpm的全称是Redhat Package Manager,由RedHat研发,后形成标准后,成为Rpm is Package Manager,这是rpm的新定义。
程序包管理器的功能是将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方面地实现程序包的安装、升级、卸载和查询等管理操作,它由两部分组成:
- 程序包的组成清单
这是基于个体的,每个程序包都有一个自己的清单,其中有程序包中的文件清单、安装或卸载时运行的脚本,等等。 - 程序包管理器的数据库
这是公共的,数据库中记录各程序包的名称和版本、依赖关系、程序包的功能说明、安装生成的各文件路径及校验码信息,等等。
在CentOS中,各数据库文件存放在/var/lib/rpm/下。
接下来详细描述如何通过rpm命令实现rpm程序包的安装、升级、卸载、查询和校验,以及rpm数据库维护。
rpm命令的用法总结简化后如下:
rpm [OPTIONS] [GENERAL_OPTIONS] [PACKAGE_FILE | PACKAGE_NAME]
- 通过OPTIONS来指定要进行的操作:
安装:-i,--install
升级:-u,--update,或-F,--freshen
卸载:-e,--erase
查询:-q,--query
校验:-V,--verify
数据库管理:--builddb,--initdb
- 通过GENERAL_OPTIONS来自定义操作过程
-v: verbose, 详细信息
-vv:更详细的输出-_-||
- 通过程序包文件名和程序包名来指定作用对象
PACKAGE_FILE是文件名,需要程序包文件的完整名称;
PACKAGE_NAME是程序名,只需指定程序包名中的NAME。
(1) 安装
- 语法格式
rpm {-i|--install} [install-options] PACKAGE_FILE...
安装需要指定程序包的文件名。
安装rpm包的常用固定格式为:
rpm -ivh PACKAGE_FILE...
表示安装过程中显示进度条和详细信息。
install-options包括:
- -h:hash marks,输出进度条,用#表示,每个#表示2%的进度;
- --test:测试安装,检查并报告依赖关系及冲突消息等;
- --nodeps:忽略依赖关系,不建议;
- --replacepkgs:重新安装,(不会替代配置文件);
- --noscripts:不执行rpm自带的所有脚本(共四种,可分别单独禁用);
- --nosignature: 不检查包签名信息,即不检查来源合法性;
- --nodigest:不检查包完整性信息。
这里强调一下,rpm的自带脚本分为四种,分别为:
- %pre:preinstall,安装过程开始之前运行的脚本,单独禁用使用install options中的--nopre;
- %post:postinstall,安装过程完成之后运行的脚本,单独禁用使用install options中的--nopost;
- %preun:preuninstall,卸载过程真正开始执行之前运行的脚本,单独禁用使用install options中的--nopreun;
- %postun:postuninstall,卸载过程完成之后运行的脚本,单独禁用使用install options中的--nopostun
(2) 升级
- 语法格式
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
这里需要注意一下-U和-F的区别:
-U表示升级或安装
指定的程序已安装时,则执行升级;若未安装,则安装。-F表示仅升级,不安装
即程序未安装时,则不进行任何操作。
升级需要指定的也是程序包的文件名。
升级rpm包的常用固定格式为:
rpm -Uvh PACKAGE_FILE...
rpm -Fvh PACKAGE_FILE...
在升级过程中显示进度条和详细信息。
rpm安装的install-options同样适用于此,下面是两个额外的选项:
- --oldpackage:降级
- --force:强制升级
关于程序升级有两点需要注意:
- 不要对内核做升级操作,Linux支持多内核版本并存,因此直接安装新版本内核即可;
- 升级时,如果某程序包的配置文件安装后曾被修改过,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名后提供。
(3) 卸载
- 语法格式
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME...
卸载需要指定的是程序名。
常用的选项:
- --allmatches: 卸载所有匹配指定名称的程序包的各版本;
- --nodeps: 忽略依赖关系;
- --test:测试卸载,dry run模式。
(4) 查询
- 语法格式
rpm {-q|--query} [--select options] [--query options] [PACKAGE_NAME]
select options用于指定要查询的对象或范围,包括:
- PACKAGE_NAME: 查询指定的程序包是否已经安装,及其版本
- -a,--all:查询所有已安装的包;可以配合grep查询记不清包名的程序;
- -f FILE,--file FILE:查询指定的文件由哪个程序包安装生成
- -p,--package:用于实现对未安装的程序包执行查询操作;
- --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;
- --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
query options用来指定要查询什么内容,包括:
- -changelog:查询rpm包的changelog;
- -l,--list:程序安装生成的所有文件列表;
- -i,--info:程序包相关的信息,版本号、大小、所属的包组,等;
- -c,--configfiles:查询指定的程序包提供的配置文件;
- -d,--docfiles:查询指定的程序包提供的文档;
- --provides:列出指定的程序包提供的所有CAPABILITY;
- -R,--requires:查询指定程序包的依赖关系;
- --scripts:查询指定的程序包自带的脚本片段;
rpm查询的常用固定组合:
查询已安装的程序(指定程序名):
- rpm -qf FILE
- rpm -qi PACKAGE_NAME
- rpm -qc PACKAGE_NAME
- rpm -ql PACKAGE_NAME
- rpm -qd PACKAGE_NAME
查询未安装的程序(指定程序包的文件名)
- rpm -qpi PACKAGE_FILE
- rpm -qpc PACKAGE_FILE
- rpm -qpl PACKAGE_FILE
- rpm -qpd PACKAGE_FILE
- ...
(5) 校验
- 语法格式
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
- U User ownership differs,属主不匹配;
- G Group ownership differs,属组不匹配;
- T mTime differs,修改时间不匹配;
- P caPabilities differ,程序包所提供的功能不匹配。
(6) rpm数据库管理
rpm程序包管理器的数据库路径为:/var/lib/rpm/,rpm管理操作就是基于此目录下的数据库文件进行的。
- 语法格式
rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]
选项含义:
- --initdb:初始化数据库-当前无任何数据库时,可初始化创建一个新的;当时有数据库,则不执行任何操作;
- --rebuild:重新构建,通过读取系统上所有已经安装过的程序包进行重新创建。
(7) rpm命令的相关示例
- rpm安装示例:
安装光盘上的gnome-desktop3
[root@localhost Packages]# rpm -ivh /mnt/cdrom/Packages/gnome-desktop3-3.14.2-2.el7.x86_64.rpm
warning: /mnt/cdrom/Packages/gnome-desktop3-3.14.2-2.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
error: Failed dependencies:
gnome-themes-standard is needed by gnome-desktop3-3.14.2-2.el7.x86_64
提示依赖的程序包没有安装,忽略依赖关系直接安装:
[root@localhost Packages]# rpm -ivh --nodeps /mnt/cdrom/Packages/gnome-desktop3-3.14.2-2.el7.x86_64.rpm
warning: /mnt/cdrom/Packages/gnome-desktop3-3.14.2-2.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:gnome-desktop3-3.14.2-2.el7 ################################# [100%]
安装完成。使用rpm直接安装需要手动解决很多依赖关系,有时会绕的找不到北,后面用yum安装会方便快捷很多。
也可以一次安装多个rpm包,后面的程序包文件名用“,”逗号隔开。 - rpm查询示例:
查看系统上是否安装了unzip程序
[root@localhost Packages]# rpm -q unzip \\这里只需给出程序名即可
unzip-6.0-15.el7.x86_64
列出unzip程序所提供的目录和文件:
[root@localhost Packages]# rpm -ql unzip
/usr/bin/funzip
/usr/bin/unzip
/usr/bin/unzipsfx
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/share/doc/unzip-6.0
/usr/share/doc/unzip-6.0/BUGS
/usr/share/doc/unzip-6.0/LICENSE
/usr/share/doc/unzip-6.0/README
/usr/share/man/man1/funzip.1.gz
/usr/share/man/man1/unzip.1.gz
/usr/share/man/man1/unzipsfx.1.gz
/usr/share/man/man1/zipgrep.1.gz
/usr/share/man/man1/zipinfo.1.gz
可以看到安装unzip后都在系统上创建了哪些目录和文件。
查看unzip程序的详细说明:
[root@localhost Packages]# rpm -qi unzip
Name : unzip \\程序名
Version : 6.0 \\程序版本
Release : 15.el7 \\程序发行号
Architecture: x86_64 \\支持的硬件平台
Install Date: Tue 13 Feb 2018 05:06:57 PM CST \\安装时间
Group : Applications/Archiving \\所属的包组
Size : 365506 \\程序大小
License : BSD \\授权方式
Signature : RSA/SHA256, Thu 19 Mar 2015 04:52:16 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : unzip-6.0-15.el7.src.rpm \\程序包的文件名
Build Date : Thu 19 Mar 2015 04:25:08 AM CST \\打包的时间
Build Host : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem
Vendor : CentOS
URL : http://www.info-zip.org/UnZip.html
Summary : A utility for unpacking zip files
Description : \\以下是更详细的程序描述
The unzip utility is used to list, test, or extract files from a zip archive. Zip archives are commonly found on MS-DOS systems. The zip utility, included in the zip package, creates zip archives. Zip and unzip are both compatible with archives created by PKWARE(R)'s PKZIP for MS-DOS, but the programs' options and default behaviors do differ in some respects.
Install the unzip package if you need to list, test or extract files from a zip archive.
找出unzip程序的说明文档和手册:
[root@localhost Packages]# rpm -qd unzip
/usr/share/doc/unzip-6.0/BUGS
/usr/share/doc/unzip-6.0/LICENSE
/usr/share/doc/unzip-6.0/README
/usr/share/man/man1/funzip.1.gz
/usr/share/man/man1/unzip.1.gz
/usr/share/man/man1/unzipsfx.1.gz
/usr/share/man/man1/zipgrep.1.gz
/usr/share/man/man1/zipinfo.1.gz
可以看到在/usr/share/man/man1/目录下有一些关于unzip的man手册,使用man 1 unzip可以查看这些手册中的相关说明。
还可以查询已安装程序包的依赖关系,比如查询之前安装的gnome-desktop3的依赖关系:
[root@localhost Packages]# rpm -qR gnome-desktop3
/sbin/ldconfig
/sbin/ldconfig
gnome-themes-standard
gsettings-desktop-schemas >= 3.5.91
libX11.so.6()(64bit)
libXext.so.6()(64bit)
libXrandr.so.2()(64bit)
以下省略...
可以看到gnome桌面依赖很多东西,所以手动使用rpm解决依赖关系非常费力。
查询是/bin/bash由哪个程序所提供:
[root@localhost Packages]# rpm -qf /bin/bash
bash-4.2.46-19.el7.x86_64
如果误删了某个文件,又不知道这个文件由哪个程序所提供,还是可以使用-qf选项来查询的,因为相关信息都存在rpm数据库中。
获取一个rpm包,在安装前,查询它的依赖关系,可以加上-p选项,比如查询tree工具的依赖关系:
[root@localhost Packages]# rpm -qpR tree-1.6.0-10.el7.x86_64.rpm
warning: tree-1.6.0-10.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1
注意这里需要给出程序包的文件路径。
查询系统上以c开头的程序有几个:
[root@localhost ~]# rpm -qa | grep ^c | wc -l
48
3、yum命令
百科中的定义:
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
可以将Yum当作一个C/S架构的服务,客户端是yum命令,服务器端就是yum的仓库指向。所以要使用yum,首先得有yum仓库,并且在本地的yum配置文件中指明仓库的位置。
(1) yum仓库
yum仓库(yum repository,又称yum repo),其中存储了:
- 众多rpm程序包;
所以yum仓库首先是一个文件服务器。 - 程序包的相关元数据文件。
元数据文件存放在repodata这个特定的目录下,而yum配置文件中仓库的位置就是指定repodata目录所在的位置。
可以自己创建yum仓库,创建命令:
createrepo [options]
(2) yum的配置文件
yum的配置文件主要有两类:
- /etc/yum.conf
这是yum命令的配置文件,为所有yum仓库提供公共配置。
# man 5 yum.conf \\查看yum.conf配置文件的详细说明
- /etc/yum.repos.d/*.repo
/etc/yum.repos.d/目录下所有以.repo结尾的文件,用于指定yum仓库指向的配置文件,每个文件中可以指定多个yum仓库。
*.repo配置文件中,仓库指向的定义:
- [repositoryID]
yum仓库的标识- name=Name for this repository
yum仓库的名字- baseurl=url://path/to/repository/ (等号左右没有空格)
yum仓库的url,即repodata目录所在的位置
在指定url时,某个站点会包含多个适用于不同系统的yum仓库,它们的路径会按系统版本和支持的平台等来命名,如果通过手动指定会因系统的不同而比较繁琐,且容易出错,所以yum的repo配置文件中定义了一些可用的变量:
- $releasever:当前OS的发行版的主版本号;
- $arch:平台
- $basearch:基础平台
- $YUM0-$YUM9:自定义
这些变量会获取系统版本和平台,自动补全到url路径中去。
- enabled={1|0}
是否启动(未指定的话,默认启动)- gpgcheck={1|0}
是否检查来源合法性和完整性- repo_gpgcheck={1|0}
是否检查repo元数据- gpgkey=URL
指明密钥文件- enablegroups={1|0}
是否支持在此仓库上执行组,来批量管理程序包- failovermethod={roundrobin|priority}
baseurl指向多个时,如何挑选(默认为roundrobin,随机挑选);- cost=1000
默认都为1000
(3) 通过yum命令管理程序
语法格式
yum [options] [command] [package ...]
常用的command
- repolist - 显示仓库列表
yum repolist [all|enabled|disabled]
可以显示全部、已启用和未启用的(默认显示已启用的)
- list - 显示程序包
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]
可以根据通配符进行匹配显示。
- install - 安装程序包
yum install package1 [package2] [...]
默认安装最新版本
yum reinstall package1 [package2] [...]
重新安装
- update - 升级程序包(如果不指定程序包,会升级所有已安装的程序)
yum update [package1] [package2] [...]
- downgrade - 降级程序包
yum downgrade [package1] [package2] [...]
- check-update - 检查可用升级
- remove | erase - 卸载程序包
yum remove | erase package1 [package2] [...]
- info - 查看程序包信息
- provides | whatprovides - 查看指定的特性(或文件)是由哪个程序包所提供:
yum provides | whatprovides feature1 [feature2] [...]
- clean - 清理本地缓存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all]
- makecache - 构建缓存
yum makecache [fast]
- search - 以指定的关键字搜索程序包名及summary信息
yum search string1 [string2] [...]
- deplist - 查看指定包所依赖的capabilities
yum deplist package1 [package2] [...]
- history - 查看yum事务历史
yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
- 包组管理的相关命令
yum grouplist [hidden] [groupwildcard] [...]
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]
常用的options
- --nogpgcheck:禁止进行gpg check(即使配置文件中指定gpgcheck=1,也可以禁止);
- -y:自动回答为“yes”;
- -q:--quiet:静默模式;
- --enablerepo=repoidglob:临时启用此处指定的repo;
- --disablerepo=repoidglob:临时禁用此处指定的repo;
- --noplugins:禁用所有插件;
(4) yum仓库配置示例
-
如何使用光盘或镜像文件当作本地yum仓库
- 首先挂载光盘或镜像文件至某目录
[root@localhost ~]# mount -rt iso9660 /dev/cdrom /mnt/cdrom/
- 在/etc/yum.repos.d/下创建.repo结尾的配置文件,并按格式配置
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# vim Local.repo
[local]
name=CentOS7 local reposity
baseurl=file:///mnt/cdrom/
enable=1
gpgcheck=0
- 首先挂载光盘或镜像文件至某目录
-
配置网络上的yum仓库为yum源
以配置mirrors.aliyun.com为例:
[root@localhost ~]# cd /etc/yum.repos.d/
根据系统版本下载repo文件
[root@localhost yum.repos.d]# wget http://mirrors.aliyun.com/repo/Centos-7.repo
--2018-05-21 14:07:53-- http://mirrors.aliyun.com/repo/Centos-7.repo
Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 124.238.245.105, 124.238.245.101, 124.238.245.104, ...
Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|124.238.245.105|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2573 (2.5K) [application/octet-stream]
Saving to: ‘Centos-7.repo’
100%[============================================================================================>] 2,573 --.-K/s in 0s
2018-05-21 14:07:53 (79.0 MB/s) - ‘Centos-7.repo’ saved [2573/2573]
查看yum仓库,aliyun的yum仓库已添加成功
[root@localhost yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
repo id repo name status
base/7/x86_64 CentOS-7 - Base - mirrors.aliyun.com 9,911
extras/7/x86_64 CentOS-7 - Extras - mirrors.aliyun.com 291
updates/7/x86_64 CentOS-7 - Updates - mirrors.aliyun.com 539
repolist: 10,741
(5) yum命令的相关示例
- 搜索mysql相关程序包:
[root@localhost yum.repos.d]# yum search mysql
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
========================================================= N/S matched: mysql ``=========================================================
MySQL-python.x86_64 : An interface to MySQL
akonadi-mysql.x86_64 : Akonadi MySQL backend support
apr-util-mysql.x86_64 : APR utility library MySQL DBD driver
以下省略
- 查看mdadm程序的相关信息:
[root@localhost yum.repos.d]# yum info mdadm
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Installed Packages
Name : mdadm
Arch : x86_64
Version : 3.3.2
Release : 7.el7
Size : 928 k
Repo : installed
以下省略
- 列出yum仓库中可提供升级的本机程序:
[root@localhost ~]# yum list updates | less
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Updated Packages
ImageMagick.x86_64 6.7.8.9-15.el7_2 base
ImageMagick-perl.x86_64 6.7.8.9-15.el7_2 base
MySQL-python.x86_64 1.2.5-1.el7 base
以下省略
- 列出哪个程序提供了/bin/zsh这个文件
[root@localhost bin]# yum provides /bin/zsh
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
zsh-5.0.2-14.el7.x86_64 : Powerful interactive shell \\程序包名和程序简介
Repo : local \\在哪个yum仓库
Matched from:
Filename : /bin/zsh
以下省略