yum 配置以及常用 rpm 命令

2020-07-01 linux

在 CentOS 中,会通过 YUM 或者 RPM 进行软件包的管理,不过 RPM 不能很好的解决软件之间的依赖关系,所以目前使用较多的是 YUM 源。

介绍常用的管理命令,基本的 RPM 规范,常见的错误处理,例如镜像地址配置、本地源设置、强制安装包等等。

centos power logo

简介

其中 Redhat Package Manager, RPM 是由 RedHat 公司提供的软件包管理器,可以实现软件包的安装、查询、卸载、升级以及校验等,相关的数据会保存在 /var/lib/rpm 目录下,但 rpm 不能很好的解决软件之间的依赖关系。

在安装时,通常系统文件存放在 /bin/sbin/lib 目录下,而第三方软件会存放在 /usr/local/bin/usr/local/sbin/usr/local/lib/usr/share/man/usr/local/share/man (后两者为帮助文件) 。

RPM 包通常有一个通用的命名方式:name-version-release.arch.rpm

  • name: 表示包的名称,包括主包名和分包名;
  • version: 表示包的版本信息;
  • release: 用于标识 rpm 包本身的发行号,可还包含适应的操作系统;
  • arch: 表示主机平台,noarch 表示此包能安装到所有平台上面。

gd-devel-2.0.35-11.el6.x86_64.rpmgd 是这个包的主包名;devel 是这个包的分包名;2.0.35 是表示版本信息,2 为主版本号,0 表示次版本号,35 为源码包的发行号也叫修订号; 11.el6 中的 11 是 rpm 的发行号,el6 表示 RHEL6;x86_64 是表示适合的平台。

为了解决各个包之间的依赖关系,可以采用 Yellowdog Updater Modified, YUM 进行管理,该软件是由 Seth Vidal 开发,用于管理 RPM 包。

源配置

CentOS 中官方的源只包含了有限的安装包,为此需要安装一些常用的三方源。当然,也可以自己手动创建 Yum 仓库,主要采用了 createrepo,用于生成 repodata 软件信息仓库。

可以通常如下命令查看源列表的配置。

# yum repolist                                            // 查看现在可用的源列表
# yum repolist all                                        // 查看所有的源列表
# yum --enablerepo=epel install mysql                     // 从指定源列表下载

接下来看看如何配置第三方的源。

使用三方源

配置完成后可以通过 yum repolist all 命令查看三方源是否生效,通过 yum list software 查看相应的软件。对于一些 RPM 包,也可以从 pkgs.org 或者 www.rpmfind.net 查找相应的软件包,以及与该软件包相关的依赖。

注意:如果在安装过程中出现 error: Failed dependencies 可以使用 --nodeps --force 选项强制安装,不过此时有可能导致部分功能失效。

另外,关于 CentOS 的第三方源,可以参考 CentOS Wiki 中给出的参考意见。

国内官方源

也就是一些 CentOS 的镜像,常见的有 mirrors.aliyun.comcentos.ustc.edu.cnmirrors.163.commirrors.sohu.com,只需要修改基本数据源中的 URL 配置选项。

阿里云提供了很多的三方仓库,例如 EPEL RPMFusion 等。

EPEL, Extra Packages for Enterprise Linux

EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目,详细内容可以参考 EPEL-Wiki

安装源,其中对应的版本需要根据当前的版本自行选择。

# rpm -Uvh http://mirrors.ustc.edu.cn/epel/beta/7/x86_64/epel-release-7-0.2.noarch.rpm
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/beta/7/x86_64/epel-release-7-0.2.noarch.rpm
# rpm -Uvh https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm

接下来时导入证书,当然这步也可以在通过 yum 安装时根据提示自动导入。

# rpm -import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

rpmforge

可以从 pkgs.repoforge.org 或者 apt.sw.be 下载。

# rpm -Uvh http://apt.sw.be/redhat/el7/en/x86_64/rpmforge/RPMS/rpmforge-release-xxx.rpm

nux-dextop

直接从 nux-dextop-release*rpm 上查找安装最新的配置,通常 mplayer 会包含在该三方源中。

使用本地源

可以通过如下方法使用本地源,也就是下载的包含安装包的 ISO 镜像。

对于 VMware 需要通过如下方法挂载,[Setting] -> [Hardware] -> [CD/DVD] -> 右边 Device 里勾选 Connected,在 Use ISO image file 里选择 ISO 文件后确定即可。

CentOS 中使用的 yum 源配置文件保存在 /etc/yum.repos.d 目录下,主要包括了两个配置文件 CentOS-Base.repoCentOS-Media.repo;其中,前者是配置网络 yum 源的,而后者是用来配置本地 yum 源。

----- 对于VM来说,也可以使用Share Folder
# mount /dev/cdrom /media/cdrom
# mount -o loop /mnt/hgfs/Share/CentOS-xxx-xxx-bin-DVD.iso /media/cdrom/
# vi /etc/yum.repos.d/iso.repo
[c6-media]
name=CentOS-$releasever - Media      # 自定义名称
baseurl=file:///media/cdrom/         # 可以指定多个路径
        file:///media/cdrom2/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

----- 清除缓存
# yum clean all

----- 证书也可以使用如下方式安装
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
# yum --enablerepo=c6-media install mysql-server                   # 本地和网络
# yum --disablerepo=\* --enablerepo=c6-media install mysql-server  # 只使用本地光盘

原生本地源

如上的 ISO 镜像文件中,已经包含了索引文件 (位于 repodata 文件夹),如果自己创建本地镜像,例如平时收藏的 RPM 软件包或者集成测试等,此时需要通过 createrepo 创建索引文件。

当然,如过没有 createrepo 命令,则需要安装 createrepo.xxx.rpm 包。

----- 1. 创建本地yum仓库目录
$ mkdir -p /share/CentOS/7/local/x86_64/RPMS

----- 2. 创建索引&更新缓存
$ createrepo /share/CentOS/7/local/x86_64
$ yum makecache

----- 3. 创建本地repo文件
$ cat<<-"EOF">/etc/yum.repos.d/CentOS-Local.repo
[local]
name=CentOS-$releasever - local packages for $basearch
baseurl=file:///share/CentOS/$releasever/local/$basearch
enabled=1
gpgcheck=0
protect=1
EOF

另外,可以参考 How to create public mirrors for CentOSCreate Local Repos

常用命令

如下列举一些常用的命令。

----- 查看仓库源列表信息,可以先将/var/cache/yum/中的Cache清理
# yum repolist                                            // 可以是all disabled enabled
# yum repoinfo                                            // 以及源的信息

----- 查看软件信息
# rpm -q kernel                                           // 查看安装包的全名
# rpm -ql kernel                                          // 查看已安装软件包含有的文件
# rpm -qi kernel                                          // 查看已安装软件包的摘要信息
# rpm -qa | grep software                                 // 查看是否安装了software
# rpm -qf /usr/sbin/ifcfg                                 // 查看某文件属于那个包
# rpm -qc iproute                                         // 查看生成了那些配置文件
# rpm -qd iproute                                         // 查看生成了那些帮助文件
# rpm -qpi iproute.rpm                                    // 查看rpm包的信息
# rpm -qpl iproute.rpm                                    // 查看rpm包中含有的软件列表
# yum info mysql                                          // 查看包信息

----- 搜索软件
# yum search package                                      // 搜索package

----- 安装软件
# rpm --checksig foobar.rpm                               // 校验PGP Signature,查看完整性和来源
# rpm -qpR foobar.rpm                                     // 查看依赖
# rpm -ivh --nodeps --force foobar.rpm                    // 强制安装,如果其它软件包未安装,则不能工作
# yum -y install foobar                                   // 默认为 yes ,通常用于脚本文件,不需要交互

----- 只下载软件,如下命令包含在yum-utils包中
# yumdownloader PACK                                      // 使用yum自带软件
# yum -y install yum-downloadonly                         // 通过yum-downloadonly插件
# yum -y install --downloadonly --downloaddir=/tmp/ PACK  // 直接使用

----- 安装软件包群,很多被打包成Group的软件,可以通过如下命令查看、安装
# yum grouplist
# yum groupinstall 'MySQL Database'
# yum groupupdate 'MySQL Database'
# yum groupremove 'MySQL Database'

----- 卸载软件
# rpm -evv --nodeps foobar                                // 不需要指定到foobar.rpm
# yum -y remove foobar

----- 升级软件包
# rpm -Uvh foobar.rpm                                     // 如果新版本不工作,仍可以使用之前的版本
# yum check-update                                        // 查看可升级的软件包
# yum update foobar                                       // 升级特定的软件
# yum update                                              // 升级所有软件

----- 清除/更新Cache
# yum clean all                                           // 默认会保存在/var/cache/yum
# yum makecache                                           // 通常在修改/etc/yum/repos.d目录下配置文件之后

----- 获得源码,需要安装yum-utils工具,提供了yumdownloader
# vi /etc/yum.repos.d/CentOS-Source.repo                  // 将enabled设置为1
# yum clean all                                           // 清空缓存
# yum makecache                                           // 使修改生效
# rpm -qf `which mysql`                                   // 查看对应安装包
# yumdownloader --source mariadb                          // 下载源码包,不加--source则只下载
# rpm2cpio coreutils-8.4-19.el6_4.2.src.rpm | cpio -ivd   // 解压rpm包

----- 列出软件
# yum list | less                                         // 列出所有可安装的软件包
# yum list updates                                        // 列出所有可更新的软件包
# yum list installed                                      // 列出所有已安装的软件包
# yum list extras                                         // 列出所有已安装但不在 Yum Repository 內的软件包
# yum list [package]                                      // 列出所指定的软件包

----- 其它
# yum shell                                               // 交互环境,可以执行多条命令
# yum history                                             // 查看历史
# rpm -Vp xxx.rpm                                         // 与数据库中的版本校验 (Verify)
# rpm -Va                                                 // 校验所有的
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6      // 导入 GPG key
----- 查询未安装软件包的依赖关系
$ rpm -qRp vim-common-6.3.046-2.el4.1.x86_64.rpm
----- 查询已安装软件包的依赖关系
$ rpm -qR vim-common-6.3.046-2.el4.1

----- 数据库出错,通过下述命令重建
# rm /var/lib/rpm/__db*
# rpm --rebuilddb
# rpmdb_verify Packages

yum makecache 会把服务器的包信息下载到本地电脑缓存起来,配合 yum -C search xxx 使用,不用上网检索就能查找软件的相关信息。

其它

Yum Lock

如果在通过 yum 安装软件时出现,Another app is currently holding the yum lock 错误,主要是为了防止 RPM 许同时运行造成冲突。

如果确认没有 yum 同时运行,那么可以通过 cat /var/run/yum.pid 查看占用的进程的 PID ,通过 rm -f /var/run/yum.pid 删除,重新安装。

优先级

在使用时,最好先安装 yum-priorities 插件,该插件用来设置 yum 在调用软件源时的顺序,因为官方提供的软件源,都是比较稳定和被推荐使用的,因此,官方源的顺序要高于第三方源的顺序。

# yum install yum-priorities

安装后需要设置 /etc/yum.repos.d/ 目录下的 *.repo 相关文件,例如 CentOS-Base.repoepel.reponux-dextop.repo 等,在这些文件中配置优先级 priority=N (N为1到99的正整数,数值越小优先级越高),一般第三的软件源设置的优先级大于 10 。

Baseurl VS. MirrorList

/etc/yum.repo.d 目录下,基本上每个仓库的配置文件都包含了这两个配置项,例如:

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/

另外,在 /etc/yum.conf 文件中看到如下配置项,实际上就是缓存。

cachedir=/var/cache/yum/$basearch/$releasever

如果打开 mirrorlist 的配置项,实际上是一堆的 baseurl;而 baseurl 必须要指向 YUM 仓库上的 repodata 目录,该目录保存了 RPM 安装时的依赖信息。

当需要配置三方的仓库时,就需要修改 baseurl 的值。

强制升级包

当一个软件打上 Patch 并制作 RPM 包之后,如果希望本地安装、测试,那么就可能会遇到如下的一些问题。

同名同版本

已经安装好的包,需要重新安装同名而且同版本的包,那么可以使用下面的命令强制安装。

rpm -ivh --replacepkgs package-1.2.3-34.el7.x86_64.rpm

回退到老包

也就是需要安装一个版本号较老的包。

rpm -Uvh --oldpackage package-1.2.1-34.el7.x86_64.rpm

当然,其实也可以使用 YUM 安装,这样就不需要再记住上面的包,也就是直接使用 yum localinstall package-1.2.3-34.el7.x86_64.rpm 命令即可。

常见报错

证书问题

详细报错为 Peer's Certificate issuer is not recognized,可以通过如下方式禁用证书检查。

# vim /etc/yum.conf
sslverify=0

# yum clean all && yum makecache