Linux常用命令--rpm与yum

摘要

  • 在Linux发行版中,几乎每一个发行版都有自己的软件包管理系统。

  • 常见的有适用于debianUbuntu等系统的dpkgapt-get以及它们的前端aptitude,以及适用于RedHatFedora系统的rpm以及它的前端yum

  • CentOS系统从属于RedHat系列,其软件包管理系统有RPM和YUM,本文基于CentOS8(x86_64)介绍它们的使用方法。

  • 从CentOS 8开始,系统默认的软件包管理器是dnf,系统提供的yum命令仅为dnf命令的软链接。dnfdandified yum的简称,是基于rpm软件包的Linux发行版本的软件包管理器。

RPM

  • RPM,全称RPM Package Manager,是由Red Hat推出的软件包管理系统,现在在各种发行版中普遍适用。

  • RRM软件包是将程序源代码经过编译和封装以后形成的包文件,在软件包里面会封装软件的二进制程序、配置文件、帮助手册、库文件以及头文件等。

  • rpm默认安装,但是RPM存在依赖关系问题

rpm参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rpm [options] /path/to/rpmfile
  
option:
  -i|--install: 安装指定软件
  -v|--verbose: 显示安装过程
  -e|--erase: 卸载指定的软件
  -h|--hash: 以#的方式显示安装进度条,一个#为2%
  -q|--query: 查询rpm相关信息
  --nodeps: 不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意,这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。
  --test: 测试安装。不会实际安装,只是检测一下依赖性。
  -U: 升级+安装(如果之前有安装则升级,如果之前没有安装则安装)
  -F: 升级(如果之前有安装则升级,如果之前没安装则不做任何操作)
  --replacepkgs: 替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。
  --replacefiles: 替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报"某个文件已经存在"的错误,从而导致软件无法安装。使用这个选项可以忽略这个报错而覆盖安装。
  --force: 在软件包的安装或升级过程中,如果出现某个文件已经安装或者某一个软件已经安装时
   可以使用 --force 选项强制安装,等同于 --replacepkgs --replacefiles --oldpackage 同时使用

安装rpm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 这里以安装jdk举例,先下载jdk的rpm包
curl -o ./jdk-17_linux-x64_bin.rpm https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
# -ivh 安装rpm包,建议安装前先查询当前系统是否已经安装了相关的软件包
rpm -ivh jdk-17_linux-x64_bin.rpm
# --test 只对安装进行测试,不实际安装
rpm -ivh --test jdk-17_linux-x64_bin.rpm
# --nodeps 安装时忽略依赖,软件有可能不可用
rpm -ivh --nodeps jdk-17_linux-x64_bin.rpm
# --force 强制安装,如果已经安装过该软件或者有文件冲突都进行强制安装
rpm -ivh --force jdk-17_linux-x64_bin.rpm
# --prefix 指定安装路径,而不使用默认的安装路径,不推荐
rpm -ivh --prefix /usr/local/soft/jdk17 jdk-17_linux-x64_bin.rpm

# 升级安装
rpm -Uvh jdk-17_linux-x64_bin.rpm

RPM 包默认安装路径

安装路径 含 义
/etc/ 配置文件安装目录
/usr/bin/ 可执行的命令安装目录
/usr/lib/ 程序所使用的函数库保存位置
/usr/share/doc/ 基本的软件使用手册保存位置
/usr/share/man/ 帮助文件保存位置

rpm -q:查询软件包是否安装

1
2
3
4
5
6
7
8
9
# 查询当前系统已经安装的所有包
rpm -qa

# 查询当前系统是否安装了软件包名称中含有jdk的软件包
rpm -qa | grep jdk
# 也可以通过包名查询,就是版本号前面那部分,这里版本号就是17.0.6,与包名之间用-分隔
rpm -q jdk-17
# 通过命令查询是否安装,一般通过yum安装的软件可以通过这种方式进行查询
rpm -q zip

rpm -qp:查询rpm包安装后的软件包名称

1
2
# 查询rpm包安装后的软件包名称,p 表示查询的是rpm文件
rpm -qp jdk-17_linux-x64_bin.rpm

rpm -qi:查询软件包的详细信息

1
2
3
4
5
6
7
8
# 查询软件包描述信息,通过rpm文件名称
rpm -qip jdk-17_linux-x64_bin.rpm
# 查询软件包描述信息,通过安装后的软件包名称,此时可以不加后面的.x86_64后缀,下面的命令也是这样
rpm -qi jdk-17-17.0.6-9.x86_64
# 也可以通过包名查询,就是版本号前面那部分,这里版本号就是17.0.6,与包名之间用-分隔
rpm -qi jdk-17
# 通过命令查询,一般通过yum安装的软件可以通过这种方式进行查询
rpm -qi zip

rpm -ql:命令查询软件包的文件列表

1
2
3
4
5
6
7
8
# 查询软件包中的文件列表,通过rpm文件名称
rpm -qlp jdk-17_linux-x64_bin.rpm
# 查询软件包中的文件列表,通过安装后的软件包名称
rpm -ql jdk-17-17.0.6-9.x86_64
# 也可以通过包名查询,就是版本号前面那部分,这里版本号就是17.0.6,与包名之间用-分隔
rpm -ql jdk-17
# 通过命令查询,一般通过yum安装的软件可以通过这种方式进行查询
rpm -ql zip

rpm -qd:查询被标注为文档的文件列表

1
2
3
4
5
6
7
# 显示被标注为文档的文件列表
rpm -qdp jdk-17_linux-x64_bin.rpm
rpm -qd jdk-17-17.0.6-9.x86_64
# 也可以通过包名查询,就是版本号前面那部分,这里版本号就是17.0.6,与包名之间用-分隔
rpm -qd jdk-17
# 通过命令查询,一般通过yum安装的软件可以通过这种方式进行查询
rpm -qd zip

rpm -qc:查询被标注为配置文件的文件列表

1
2
3
4
5
6
7
# 显示被标注为配置文件的文件列表
rpm -qcp jdk-17_linux-x64_bin.rpm
rpm -qc jdk-17-17.0.6-9.x86_64
# 也可以通过包名查询,就是版本号前面那部分,这里版本号就是17.0.6,与包名之间用-分隔
rpm -qc jdk-17
# 通过命令查询,一般通过yum安装的软件可以通过这种方式进行查询
rpm -qc zip

rpm -qf:命令查询系统文件属于哪个RPM包

1
2
# 查询系统文件属于哪个RPM包
rpm -qf /usr/lib/jvm/jdk-17-oracle-x64/bin/java
  • 这里注意,只能通过真实文件进行查询,软连接是查询不到的

rpm -qR:查询软件包的依赖关系

1
2
3
4
5
6
7
# 查询软件包的依赖关系
rpm -qRp jdk-17_linux-x64_bin.rpm
rpm -qR jdk-17-17.0.6-9.x86_64
# 也可以通过包名查询,就是版本号前面那部分,这里版本号就是17.0.6,与包名之间用-分隔
rpm -qR jdk-17
# 通过命令查询,一般通过yum安装的软件可以通过这种方式进行查询
rpm -qR zip

卸载rpm

1
2
3
4
5
6
# 通过包名卸载指定的软件,此时会检查是否有其它软件对该软件有依赖,如果有依赖则不允许卸载
rpm -e jdk-17-17.0.6-9.x86_64
# 也可以通过包名查询,就是版本号前面那部分,这里版本号就是17.0.6,与包名之间用-分隔
rpm -e jdk-17
# --nodeps :不考虑依赖,强行卸载,不推荐使用,因为这样会导致其它依赖该软件的软件不可用
rpm -e --nodeps jdk-17-17.0.6-9.x86_64

解压rpm

1
2
3
4
# 解压安装包中的全部文件到当前目录
rpm2cpio jdk-17_linux-x64_bin.rpm | cpio -idv
# 解压安装包中的指定文件到当前目录,/usr/lib/jvm/jdk-17-oracle-x64/bin/java是rpm包中的文件路径,注意前面要加一个点
rpm2cpio jdk-17_linux-x64_bin.rpm | cpio -idv ./usr/lib/jvm/jdk-17-oracle-x64/bin/java
  • 说明

    • rpm2cpio : 将rpm包转换为cpio命令能处理的归档包格式。归档包,也可称为文件库,其实就是 cpiotar 格式的文件。
    • cpio 命令可以看做是备份或还原命令,因为它可以将数据(文件)备份到 cpio 归档包,也可以利用 cpio 文档库对数据进行恢复。
    1
    2
    3
    4
    各选项的含义为:
    -i:copy-in 模式,还原;
    -v:显示还原过程;
    -d:还原时自动新建目录;

rpm查看已安装的文件是否被修改过

  • 通过该命令可以快速查询通过rpmyum安装的软件的相关文件(一般为配置文件)被修改过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 查询系统中已安装的所有软件包
$ rpm -Va
.M....G.. g /var/log/lastlog
S.5....T. c /etc/ssh/sshd_config
S.5....T. c /etc/NetworkManager/NetworkManager.conf
S.5....T. c /etc/sudoers

# 查询指定软件包
$ rpm -V openssh-server
S.5....T. c /etc/ssh/sshd_config # 配置文件 sshd_config 的大小、内容、修改时间被人为修改过。因为我们修改了端口。

# 校验某个系统文件是否被修改
$ rpm -Vf /etc/ssh/sshd_config
S.5....T. c /etc/ssh/sshd_config

可以看到,结果显示了文件被修改的信息。该信息可分为以下 3 部分:
1.最前面的 8 个字符(S.5....T)都属于验证信息,各字符的具体含义如下:
S:文件大小是否改变。
M:文件的类型或文件的权限(rwx)是否改变。
5:文件MD5校验和是否改变(可以看成文件内容是否改变)。
D:设备的主从代码是否改变。
L:文件路径是否改变。
U:文件的属主(所有者)是否改变。
G:文件的属组是否改变。
T:文件的修改时间是否改变。
.:若相关项没发生改变,用 . 表示。

2.被修改文件类型,大致可分为以下几类:
c:配置文件(configuration file)。
d:普通文档(documentation)。
g:"鬼"文件(ghost file),很少见,就是该文件不应该被这个 RPM 包包含。
l:授权文件(license file)。
r:描述文件(read me)。

3.被修改文件所在绝对路径(包含文件名)。

rpm导入(安装)数字证书(公钥)

  • 数字证书,又称数字签名,由软件开发商直接发布。Linux 系统安装数字证书后,若 RPM 包做了修改,此包携带的数字证书也会改变,将无法与系统成功匹配,软件无法安装。

  • 系统默认证书在 /efc/pki/rpm-gpg/

  • 导入证书

1
2
3
4
# 安装本机证书,一般这个都会默认安装
rpm --import /efc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
# 安装第三方证书,如jenkins
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
  • 可以通过 rpm -qa|grep gpg-pubkey 查看已经导入的证书

1
2
3
$ rpm -qa|grep gpg-pubkey
gpg-pubkey-8483c65d-5ccc5b19
gpg-pubkey-45f2c3d5-5e81efb9
  • 数字证书本身也是一个 RPM 包,因此可以用 rpm 命令查询数字证书的详细信息,也可以将其卸载。

1
2
3
4
# 查看证书信息
rpm -qi gpg-pubkey-8483c65d-5ccc5b19
# 卸载证书
rpm -e gpg-pubkey-8483c65d-5ccc5b19

YUM

  • yum,全称Yellow dog Updater, Modified,是一个专门为了解决包的依赖关系而存在的软件包管理器。

  • yum是Linux中的 应用市场 ,不仅可以通过yum完成软件包的下载、安装、卸载等,还解决了软件之间的依赖,当安装的软件包需要依赖其它软件包时,会一并进行安装。

  • yum命令一般为默认安装,yum底层就是基于rpm实现的软件包管理

  • 使用 yum 安装软件包之前,需指定好 yum 下载 RPM 包的位置,此位置称为 yum 源。换句话说,yum 源指的就是软件安装包的来源

  • yum 源既可以使用网络 yum 源,也可以将本地光盘作为 yum 源。

  • yum 源默认都是配置好的网络 yum 源,配置文件位于 /etc/yum.repos.d/ 目录下,文件扩展名为 *.repo

  • 但是CentOS Linux 8 已经于 2021年12月31日 到期,Linux社区已不再维护该操作系统版本和软件源,所以我们可以将yum源切换到阿里云。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 备份原有的源文件
rename '.repo' '.repo.bak' /etc/yum.repos.d/*.repo

# 下载阿里云的yum源文件,这里下载Centos-8的源文件,其它版本可以在 https://mirrors.aliyun.com/repo/ 中查找
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
# 非官方扩展源,这个也可以不提前下载,可以在配置好yum源后,通过 yum install -y epel-release 进行安装
# 如果在安装软件的时候,没有在Centos-8.repo中找到官方的下载链接,那么yum会自动去epel-release指向的链接处去查找,相当于epel-release给yum提供了更多的下载渠道。
curl -o /etc/yum.repos.d/epel-archive-8.repo https://mirrors.aliyun.com/repo/epel-archive-8.repo

# 清理yum缓存并重新建立缓存
yum clean all && yum makecache

# 查看当前的yum源信息
yum repolist

仓库 id 仓库名称
AppStream CentOS-8 - AppStream - mirrors.aliyun.com
base CentOS-8 - Base - mirrors.aliyun.com
epel-archive Extra Packages for Enterprise Linux 8 - x86_64
extras CentOS-8 - Extras - mirrors.aliyun.com

yum配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat /etc/yum.conf

[main]
cachedir=/var/cache/yum #yum下载的RPM包的缓存目录
keepcache=0 #缓存的RPM是否保存,1保存,0不保存。
reposdir=/etc/yum.repos.d/ #指定 .repo 文件的绝对路径
debuglevel=2 #调试级别(0-10),默认为2(具体调试级别的应用,我也不了解)。
logfile=/var/log/yum.log #yum的日志文件所在的位置
exactarch=1 #在更新的时候,是否允许更新不同版本的RPM包,
#比如是否在i386上更新i686的RPM包。
obsoletes=1 #这是一个update的参数,具体请参阅yum(8),
#简单的说就是相当于upgrade,允许更新陈旧的RPM包。
gpgcheck=1 #是否检查GPG(GNU Private Guard),一种密钥方式签名。
plugins=1 #是否允许使用插件,默认是0不允许,
#但是我们一般会用yum-fastestmirror这个插件。
installonly_limit=3 #允许保留多少个内核包。
exclude=selinux* #屏蔽不想更新的RPM包,可用通配符,多个RPM包之间使用空格分离。
distroverpkg=system-release #指定一个软件包,yum 会根据这个包判断你的发行版本
timeout=5 #下载超时,秒
retries=7 #下载重试次数
proxy=http://0.0.0.0:8080 #配置代理

yum搜索软件

1
2
3
4
5
6
7
8
9
10
# 显示yum源中可以安装的全部软件
yum list

# 搜索指定软件,显示软件名称、版本,以及所属仓库名称
yum list zip
# 默认安装都是安装最新版本,有时我们需要安装某个特定版本的软件包,此时可以使用以下命令列出所有可用的Python 3软件包
yum list available python3*

# 搜索指定软件,显示软件名称和简介
yum search zip
  • 搜索时推荐使用yum list zip的形式

yum安装

1
2
3
4
5
6
# 安装过程中需要确认是否安装
yum install zip
# 不需要确认直接安装
yum install zip -y
# 重新安装yum
yum reinstall zip

yum卸载

1
2
3
4
# 卸载软件,会询问是否卸载
yum remove zip
# 不询问直接卸载
yum remove zip -y
  • yum卸载会同时卸载掉依赖包,可以使用rpm卸载单独的软件

1
2
3
4
rpm -qa | grep ^zip
zip-3.0-23.el8.x86_64

rpm -e --nodeps zip-3.0-23.el8.x86_64

yum升级与降级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 检查是否有软件需要升级
yum check-update
# 检测指定软件是否可以升级
yum check-update zip
# 升级指定软件包,-y 不询问
yum upgrade zip -y
# 升级全部软件包,-y 不询问
yum upgrade -y
# 升级指定软件包,-y 不询问
yum update zip -y
# 升级全部软件包,-y 不询问
yum update -y

# 降级,降回到升级前的版本,-y 不询问
yum downgrade zip -y

# 安装软件包时可能会遇到冲突,比如要安装的软件包与当前已经安装的软件包存在冲突,可以添加 --allowerasing 进行替换安装
yum install --allowerasing curl

yum upgradeyum update的区别

  • yum配置文件/etc/yum.conf中,如果obsoletes=1,此时两者没有区别,都表示更新旧的rpm包的同时会删除旧包
  • 如果obsoletes=0yum upgrade会删除旧版本的包,而yum update则会保留旧版本的包
  • 生产环境中建议使用yum update,防止因为替换,导致旧的软件包依赖出现问题

yum查看软件依赖关系

1
yum deplist zip

yum查看软件包描述信息

1
2
# 类似于 rpm -qi
yum info zip

yum下载rpm包

1
2
3
4
5
6
7
8
# yumdownloader 命令在软件包 yum-utils 里面
yum -y install yum-utils

# 会将docker的rpm包及其相关依赖的rpm包都下载到当前目录
yumdownloader --resolve docker

# --destdir 下载到指定目录
yumdownloader --resolve docker --destdir dockerDir

yum组:一次安装一组软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看可用组,会列出可用组名称
yum grouplist
yum group list

# 查询组信息,会列出组内包含的所有软件,比如这里查询组名为 Development Tools 的信息
yum groupinfo "Development Tools"
yum group info "Development Tools"

# 安装组内所有软件
yum groupinstall "Development Tools"
yum group install "Development Tools"

# 卸载组内所有软件
yum groupremove "Development Tools"
yum group remove "Development Tools"

# 升级软件组
yum groupupdate "Development Tools"
yum group update "Development Tools"

重建yum元数据缓存

1
2
3
4
5
6
7
# 清理无效信息
yum clean all

# 重建缓存
yum makecache
# 或者
yum --refresh -v repolist

yum查看仓库配置

1
2
3
4
5
6
7
8
9
10
11
# 显示启用的仓库简介信息
yum repolist

# 显示全部的仓库简介信息,包括禁用的
yum repolist all

# 显示详细信息
yum -v repolist

# --refresh 显示信息前先重建缓存
yum --refresh -v repolist

yum源配置

  • 参数说明

1
2
3
4
5
6
7
[xxx]:xxx为源仓库名称,一定要放在[]中。
name:源仓库说明,可以自己随便写。
mirrorlist:镜像站点列表,配置了这个就不需要配置baseurl
baseurl:yum 源仓库服务的地址。
enabled:此源仓库是否生效,如果不写或写成 enabled=1 则表示生效,写成 enabled=0 则表示不生效。
gpgcheck:如果为 1 则表示 RPM 的数字证书生效;如果为 0 则表示 RPM 的数字证书不生效。
gpgkey:数字证书的公钥文件保存位置。gpgcheck=1时需要指定地址,gpgcheck=0时,可以不配置。
  • 使用光盘配置本地源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mkdir /mnt/cdrom
# 挂载光盘到/mnt/cdrom目录下,也可以将cdrom下的文件拷贝到任意路径下
mount /dev/cdrom /mnt/cdrom/

cd /etc/yum.repos.d
# 备份原有的源文件
rename '.repo' '.repo.bak' /etc/yum.repos.d/*.repo

vi local-yum.repo

# 内容为:可以参考 CentOS-Linux-Media.repo进行配置
[local-yum]
name=local-yum,source from cdrom
#使用光盘挂载的方式 mount /dev/cdrom /mnt/cdrom ,也可以将cdrom下的文件拷贝到任意路径下
baseurl=file:///mnt/cdrom
# 假若你不想软件库缺省是被启用的,可以配置为 enabled=0,此时可以通过 yum --enablerepo mlocal-yum install zip 的方式访问该软件库。
enabled=1
# 不进行数字证书校验
gpgcheck=0


# 清理yum缓存并重新建立缓存
yum clean all && yum makecache

# 查看当前的yum源信息
yum repolist

小贴士
如果没有光驱,可将系统iso文件上传到服务器,比如在/mnt下:

1
2
mkdir /mnt/os
mount -t iso9660 -o loop /mnt/CentOS-6.5-x86_64-bin-DVD1.iso /mnt/os

然后将 baseurl 配置为 file:///mnt/os 即可。

  • 增加网络仓库源
    有些时候,我们安装的软件并不在我们配置好的yum源中,此时我们可以在软件的官方网站上查看到yum安装的相关说明,比如jenkins: https://pkg.jenkins.io/redhat/,我们只需要按照说明将对应的源添加到系统中即可。

    • 1.添加镜像源
    1
    wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
    • 2.导入jenkins公钥
    1
    rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
    • 3.安装依赖
    1
    2
    # 安装依赖,如果已经安装则可以跳过此步,jdk版本大于1.8即可
    yum install fontconfig java-11-openjdk
    • 4.安装jenkins
    1
    yum install -y jenkins
    • 5.查看jenkins安装目录
    1
    rpm -ql jenkins
    • 6.启动jenkins
    1
    2
    3
    # 默认8080端口,用户:admin 初始密码在 /var/lib/jenkins/secrets/initialAdminPassword
    systemctl start jenkins
    systemctl status jenkins
    • 7.插件下载源更换(海外服务器不需要更换)
    1
    2
    3
    4
    5
    6
    Dashboard--Manage Jenkins--Manage Plugins--Advanced settings--Update Site

    # jenkins插件默认下载站点
    https://updates.jenkins.io/update-center.json
    # 清华源
    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

DNF

  • 从CentOS 8开始,系统默认的软件包管理器是dnf,系统提供的yum命令仅为dnf命令的软链接。dnfdandified yum的简称,是基于rpm软件包的Linux发行版本的软件包管理器。

  • dnfyum命令的使用和配置方式基本一致,上面介绍的yum命令,直接替换为dnf即可

  • dnfyum的区别在于:

    • (1)yum禁止删除正在使用的内核,而dnf允许删除所有内核,包括正在使用的内核;
    • (2)在更新软件包时,yum不进行依赖包相关性的检查,而dnf如果检查到存在不相关的依赖包,则不会进行软件包更新。
    • (3)yum在解决依赖包问题时,存在性能较差、内存占用大等问题,而dnf采用了由 SUSE 开发的“libsolv”库,用以提升依赖包解析性能,其依赖包解析速度比yum更快,且比yum消耗更少内存。
    • (4)dnf代码比yum简单,约有29000行代码,而yum代码有59000多行。