Linux 软件包管理 | yum仓库管理 文章目录Linux 软件包管理 | yum仓库管理引言一、初识软件包管理二、深入解析 RPM 包1. RPM 包文件名格式2. RPM 包的组成与数字签名3. RPM 包安装与更新的核心原则三、rpm 命令实战应用1. 查询2. 验证3. 安装、卸载与重新安装4. 提取 RPM 包中的文件四、Yum命令1. Yum 常用子命令详解2. Yum 事务历史管理3. 软件包组管理五、Yum 仓库配置与管理1. 查看与启用/禁用仓库2. 仓库缓存管理3. 添加常用第三方仓库4. EPEL仓库Linux 软件包管理 | yum仓库管理引言在 Linux 系统中安装、更新和卸载软件是运维人员每天都要面对的基础操作。与 Windows 系统中常见的“绿色软件”不同Linux 软件包通常具有复杂的依赖关系。今天我们将围绕RPM 包管理、Yum 自动化依赖管理以及Yum 仓库配置三大核心板块带你彻底掌握 Linux 软件的安装与维护。一、初识软件包管理在 Windows 系统中我们通常有两种软件获取方式控制面板的程序和功能通过安装程序将信息注册到系统中类似于 Linux 的 RPM/Yum 安装。绿色软件下载即用类似于 Linux 的源码编译或解压包。而在 Linux 生态中不同的发行版本采用了不同的包管理系统RPM 系以RHEL、CentOS、Fedora、Rocky Linux为代表使用.rpm格式包。DEB 系以Debian、Ubuntu、Kali Linux为代表使用.deb格式包。本篇博客将以CentOS 7为例深入剖析 RPM 系的软件管理。二、深入解析 RPM 包1. RPM 包文件名格式RPM 软件包的文件名遵循一套严谨的命名规范name-version-release.architecture.rpm。以lrzsz-0.12.20-36.el7.x86_64.rpm为例name软件名称lrzsz。version原始软件版本号0.12.20。release发行版号及打包商信息36.el7代表专为 CentOS 7 打包的第 36 次发布。architecture编译的处理器架构。x86_64代表 64 位系统noarch代表不限定架构通用于所有平台。2. RPM 包的组成与数字签名每个 RPM 包主要由三部分组成需要安装的文件。元数据信息包含名称、版本、架构、依赖关系、许可证、变更日志等。安装/卸载脚本在安装、更新、卸载时执行的预处理或后处理脚本。核心安全机制数字签名非对称加密软件提供商使用GPG 私钥对 RPM 包进行数字签名。用户在安装时RPM 系统会使用对应的GPG 公钥进行验证。如果签名不匹配系统将拒绝安装从而确保软件包的完整性和来源可信。3. RPM 包安装与更新的核心原则默认安装最高版本通常一个软件只能安装一个版本。例外Kernel为了在新内核无法启动时保留旧内核作为保底kernel包允许同时安装多个版本。升级即覆盖升级 RPM 包会删除旧版本并安装新版本但通常会自动保留原有的配置文件如/etc/下的配置。三、rpm命令实战应用虽然现代运维更常用yum但rpm命令在离线环境、排查系统文件变动时依然有不可替代的作用。1. 查询查询是rpm最核心的功能语法为rpm -q [选项]。命令作用rpm -qa查询系统中所有已安装的软件包。rpm -q httpd查询特定软件httpd是否安装。rpm -qi coreutils查询已安装软件包的元数据版本、大小、简介、协议等。rpm -ql openssh-server查询已安装软件包包含的所有文件列表。rpm -qc openssh-server查询已安装软件包提供的配置文件通常在/etc/下。rpm -qd openssh-server查询已安装软件包提供的文档文件如 man 手册。rpm -qf /etc/ssh/sshd_config反向查询某个文件属于哪个已安装的软件包。rpm -q --scripts openssh-server查询软件包安装/卸载时执行的脚本内容。rpm -q --changelog openssh-server查看软件包的变更日志用于了解修复了哪些漏洞。示例:# 查询系统中安装的软件包[rootserver-xianyu ~17:01:27]# rpm -qalibqmi-utils-1.18.0-2.el7.x86_64 libmpcdec-1.2.6-12.el7.x86_64 gtkmm30-3.22.2-1.el7.x86_64 google-crosextra-caladea-fonts-1.002-0.4.20130214.el7.noarch...# 查询系统中指定软件包是否安装[rootserver-xianyu ~17:25:58]# rpm -q pythonpython-2.7.5-94.el7_9.x86_64# 查询指定软件包元数据[rootserver-xianyu ~17:26:10]# rpm -q python -iName:python Version:2.7.5 Release:94.el7_9 Architecture: x86_64...# 查询已安装软件包包含的所有文件列表[rootserver-xianyu ~17:27:38]# rpm -ql python/usr/bin/pydoc /usr/bin/python /usr/bin/python2 /usr/bin/python2.7 /usr/libexec/platform-python /usr/share/doc/python-2.7.5 /usr/share/doc/python-2.7.5/LICENSE /usr/share/doc/python-2.7.5/README /usr/share/man/man1/python.1.gz /usr/share/man/man1/python2.1.gz /usr/share/man/man1/python2.7.1.gz# 查询已安装软件包提供的配置文件[rootserver-xianyu ~17:30:01]# rpm -q openssh-server -c/etc/pam.d/sshd /etc/ssh/sshd_config /etc/sysconfig/sshd# 查询已安装软件包提供的文档文件[rootserver-xianyu ~17:30:13]# rpm -q openssh-server -d/usr/share/man/man5/moduli.5.gz /usr/share/man/man5/sshd_config.5.gz /usr/share/man/man8/sftp-server.8.gz /usr/share/man/man8/sshd.8.gz# 查询某个文件属于哪个已安装的软件包[rootserver-xianyu ~18:25:03]# rpm -q /usr/bin/python -fpython-2.7.5-94.el7_9.x86_64# 查询软件包包含的脚本内容rootserver-xianyu ~18:26:59]# rpm -q openssh-server --scriptspreinstall scriptlet(using /bin/sh): getent group sshd/dev/null||groupadd-g74-rsshd||:getentpasswdsshd/dev/null||\useradd-cPrivilege-separated SSH-u74-gsshd\-s/sbin/nologin-r-d/var/empty/sshd sshd2/dev/null||:postinstall scriptlet(using /bin/sh):...# 查看软件包的变更日志[rootserver-xianyu ~18:27:09]# rpm -q openssh-server --changelog* Thu Jul202023Dmitry Belyavskiydbelyavsredhat.com-7.4p1-23 0.10.3-2 - Avoid remote code executioninssh-agent PKCS#11 supportResolves: CVE-2023-38408...2. 验证如果你的系统文件被意外修改或怀疑被入侵可以用-V验证。实验修改/etc/ssh/sshd_config文件执行rpm -V openssh-server。[rootserver-xianyu ~18:37:14]# sed -i s/PermitRootLogin yes/PermitRootLogin no/g /etc/ssh/sshd_config[rootserver-xianyu ~18:37:25]# rpm -V openssh-serverS.5....T. c /etc/ssh/sshd_config输出解读S.5....T. c /etc/ssh/sshd_config。其中S代表文件大小改变5代表 MD5 校验值改变T代表修改时间改变c代表这是一个配置文件。如果文件被删除了会显示遗漏。3. 安装、卸载与重新安装下载软件包[rootserver-xianyu ~18:38:35]# repoquery --location lrzszhttp://mirrors.aliyun.com/centos/7/os/x86_64/Packages/lrzsz-0.12.20-36.el7.x86_64.rpm[rootserver-xianyu ~18:44:37]# wget http://mirrors.aliyun.com/centos/7/os/x86_64/Packages/lrzsz-0.12.20-36.el7.x86_64.rpm安装rpm -ivh lrzsz-0.12.20-36.el7.x86_64.rpm-i安装-v显示进度-h显示井号进度条。[rootserver-xianyu ~18:45:10]# rpm -ivh lrzsz-0.12.20-36.el7.x86_64.rpmPreparing...################################# [100%]Updating / installing...1:lrzsz-0.12.20-36.el7################################# [100%]卸载rpm -evh lrzsz-e卸载-v进度-h井号。[rootserver-xianyu ~18:46:22]# rpm -evh lrzszPreparing...################################# [100%]Cleaning up / removing...1:lrzsz-0.12.20-36.el7################################# [100%]重新安装rpm --reinstall -vh lrzsz*常用于恢复丢失的配置文件。[rootserver-xianyu ~18:46:29]# rpm --reinstall -vh lrzsz*warning: package lrzsz-0.12.20-36.el7.x86_64 was already added, skipping lrzsz-0.12.20-36.el7.x86_64 Preparing...################################# [100%]Updating / installing...1:lrzsz-0.12.20-36.el7################################# [100%]⚠️ RPM 的致命弱点依赖问题当你尝试用rpm -ivh安装httpd时可能会遇到错误依赖检测失败 libapr-1.so.0()(64bit) 被 httpd 需要。这是因为 RPM不会自动解决依赖问题你必须手动下载并安装所有依赖包这通常是个噩梦。正是为了解决这个问题Yum应运而生。4. 提取 RPM 包中的文件如果你不需要安装整个软件只想从 RPM 包里提取某个特定文件可以这样做分步法rpm2cpio httpd.rpm httpd.cpio转为cpio格式再用cpio -id ./etc/httpd/conf/httpd.conf httpd.cpio提取特定文件。一步法rpm2cpio httpd.rpm | cpio -id *直接解压所有文件。四、Yum命令yumYellowdog Updater Modified旨在克服 RPM 无法处理依赖和存储库的缺陷。它能够自动从配置的 Yum 仓库中下载并安装所有必需的依赖包。1. Yum 常用子命令详解yum help查看 yum 命令的帮助文档。[rootserver-xianyu ~18:47:42]# yum helpLoaded plugins: fastestmirror, langpacks Usage: yum[options]COMMAND List of Commands: check Checkforproblemsinthe rpmdb check-update Checkforavailable package updates clean Remove cached data deplist List a packages dependencies distribution-synchronization Synchronize installed packages to the lates...yum info httpd查看仓库中软件包的详细元数据信息包括是否已安装。[rootserver-xianyu ~18:50:50]# yum info httpdLoaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyuncs.com * extras: mirrors.aliyuncs.com * updates: mirrors.aliyuncs.com Installed Packages Name:httpd Arch:x86_64 Version:2.4.6 Release:99.el7.centos.1 Size:9.4M Repo:installed From repo:updates Summary:Apache HTTP Server URL:http://httpd.apache.org/ License:ASL2.0Description:The Apache HTTP Server is a powerful, efficient, and extensible:web server.yum list http\*查看仓库中所有以http开头的软件包清单。[rootserver-xianyu ~18:50:57]# yum list httpd*Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyuncs.com * extras: mirrors.aliyuncs.com * updates: mirrors.aliyuncs.com Installed Packages httpd.x86_642.4.6-99.el7.centos.1 updates httpd-tools.x86_642.4.6-99.el7.centos.1 updates Available Packages httpd-devel.x86_642.4.6-99.el7.centos.1 updates httpd-itk.x86_642.4.7.04-2.el7 epel httpd-manual.noarch2.4.6-99.el7.centos.1 updatesyum list httpd --showduplicates查看仓库中该软件包的所有历史版本。[rootserver-xianyu ~18:51:43]yum list httpd--showduplicatesLoaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyuncs.com * extras: mirrors.aliyuncs.com * updates: mirrors.aliyuncs.com Installed Packages httpd.x86_642.4.6-99.el7.centos.1 updates Available Packages httpd.x86_642.4.6-95.el7.centos base httpd.x86_642.4.6-97.el7.centos updates httpd.x86_642.4.6-97.el7.centos.1 updates httpd.x86_642.4.6-97.el7.centos.2 updates httpd.x86_642.4.6-97.el7.centos.4 updates httpd.x86_642.4.6-97.el7.centos.5 updates httpd.x86_642.4.6-98.el7.centos.6 updates httpd.x86_642.4.6-98.el7.centos.7 updates httpd.x86_642.4.6-99.el7.centos.1 updatesyum search web server根据关键字简介或描述搜索软件包。[rootserver-xianyu ~18:54:01]# yum search web serverLoaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyuncs.com * extras: mirrors.aliyuncs.com * updates: mirrors.aliyuncs.comN/S matched: web server...# yum search all web server 可查看web server全部简介与描述yum provides sar反向查找。当你只知道命令如sar却不知道它属于哪个包时这个命令能告诉你sar包含在sysstat包里。[rootserver-xianyu ~18:57:46]# yum provides sarLoaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyuncs.com * extras: mirrors.aliyuncs.com * updates: mirrors.aliyuncs.com base/7/x86_64/filelists_db|7.2MB 00:00:08...yum install vsftpd自动从仓库安装vsftpd及其依赖。[rootserver-xianyu ~19:01:49]# yum install vsftpdLoaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyuncs.com...yum install vsftpd --downloadonly --downloaddir/root/只下载不安装。将主包和依赖包一并下载到指定目录适合内网离线部署。[rootserver-xianyu ~19:02:43]# yum install vsftpd --downloadonly --downloaddir/root/Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyuncs.com * extras: mirrors.aliyuncs.com...yum localinstall ./vsftpd-3.0.2-29.el7_9.x86_64.rpm安装本地文件系统中的 RPM 包并利用 Yum 仓库解决其依赖关系。[rootserver-xianyu ~19:06:05]# yum localinstall ./vsftpd-3.0.2-29.el7_9.x86_64.rpmLoaded plugins: fastestmirror, langpacks Examining ./vsftpd-3.0.2-29.el7_9.x86_64.rpm: vsftpd-3.0.2-29.el7_9.x86_64 Marking ./vsftpd-3.0.2-29.el7_9.x86_64.rpm as an update to vsftpd-3.0.2-28.el7.x86_64 Resolving Dependencies --Running transaction check ---Package vsftpd.x86_640:3.0.2-28.el7 will be updated ---Package vsftpd.x86_640:3.0.2-29.el7_9 will be an update --Finished Dependency Resolution...yum downgrade -y vsftpd-3.0.2-28.el7将软件降级到指定旧版本需要注意依赖包也需同时降级。[rootserver-xianyu ~19:08:09]# yum downgrade -y vsftpdLoaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyuncs.com * extras: mirrors.aliyuncs.com * updates: mirrors.aliyuncs.com...yum update升级系统中所有软件至最新版本生产环境需谨慎。yum remove -y vsftpd卸载软件包及其依赖。[rootserver-xianyu ~19:08:20]# yum remove -y vsftpdLoaded plugins: fastestmirror, langpacks Resolving Dependencies --Running transaction check ---Package vsftpd.x86_640:3.0.2-28.el7 will be erased --Finished Dependency Resolution...2. Yum 事务历史管理yum记录了你所有的安装、升级、卸载操作。如果你执行了误操作可以通过历史记录回滚。yum history列出所有事务 IDID、用户、时间、操作类型、影响的包数。yum history info 2查看 ID 为 2 的事务的详细安装列表和依赖处理过程。yum history undo 4撤销第 4 个事务的操作比如你刚才安装了 vsftpd撤销会帮你卸载它。yum history redo 4重做第 4 个事务的操作。3. 软件包组管理在部署基础环境如“最小安装”、“带 GUI 的服务器”时一用一个包组极其方便。yum grouplist查看可用和已安装的软件包组。yum grouplist -v详细模式会显示分组的中文名和内部的英文 ID如graphical-server-environment。后续操作强烈建议使用英文 ID以免编码冲突。yum groupinfo Server with GUI查看特定包组包含的具体软件包清单。yum groupinstall Server with GUI安装整个包组。yum groupremove Server with GUI卸载整个包组。五、Yum 仓库配置与管理Yum 仓库Repository是存放 RPM 包和元数据的“软件超市”。配置文件存放在/etc/yum.repos.d/目录下例如CentOS-Base.repo。1. 查看与启用/禁用仓库yum repolist查看当前已启用的仓库及软件包数量。yum repolist all查看所有仓库包含已禁用的。启用/禁用可以通过yum-config-manager --enable 仓库名或--disable 仓库名操作也可以直接编辑.repo文件修改enabled1启用或enabled0禁用。2. 仓库缓存管理yum clean all清理本地下载的缓存元数据释放空间。yum makecache重新拉取并建立元数据缓存。注意执行完此命令后yum install时按Tab键就能自动补全软件包名了。3. 添加常用第三方仓库很多开源软件默认不在 CentOS 的官方源中需要通过添加第三方仓库来安装。添加 Kubernetes 仓库阿里云源yum-config-manager --add-repohttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/# 安装 kubectl因为阿里 K8s 源无 GPG需跳过校验或手动导入yuminstallkubectl--nogpgcheck添加 Docker CE 仓库阿里云源catEOF/etc/yum.repos.d/docker-ce.repo[docker-ce-stable] nameDocker CE Stable - $basearch baseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable enabled1 gpgcheck0 EOFyuminstalldocker-ce4. EPEL仓库EPELExtra Packages for Enterprise Linux是由 Fedora 社区维护的、为 RHEL/CentOS 提供额外高质量软件包的扩展仓库。很多非核心软件如nginx、stress都在 EPEL 里。配置方式极简curl-s-o/etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo