行业资讯
告别“依赖地狱“——从 rpm 到 yum,再到自建仓库的包管理进阶之路
Linux 命令行日课· 从零到得心应手的每日修行Day 01别再被命令行劝退了——Day 01终端、提示符与文本查看命令Day 02文件管理命令——创建、复制、移动、删除与链接Day 03求助、编辑与重定向——让 Linux 真正为你工作Day 04你的终端其实会编程——变量、环境与引号的艺术Day 05上Linux 的门禁系统——用户、组与密码管理Day 05下借力打力——su、sudo 提权与文件权限解密Day 06文件权限管理实战——从 chmod 到 chattr把权限锁明白Day 07进程管理与系统监控——ps、kill、jobs 到 top 全掌握Day 08系统服务管理与压力测试——从 systemd 到 stressDay 09远程登录与安全加固——SSH 从入门到不输密码Day 10即将更新Day 11网络管理、文件归档与跨机传输——nmcli、tar、scp、rsync 全掌握Day 12软件包管理——从 rpm 底层到 yum 神器再到源码编译安装本篇Day 12软件包管理——从 rpm 底层到 yum 神器再到源码编译安装前面十一天我们几乎天天在装软件——yum install -y vim、yum install -y rsync、yum install -y httpd。你有没有想过敲下这条命令之后背后发生了什么那个.rpm文件到底是什么为什么有时候装个软件还要先配仓库今天我们把装软件这件事彻底搞透。分四层递进最底层是rpm命令——直接跟包文件打交道装一个包报一堆依赖错误你会知道依赖地狱长什么样。往上一层是yum——自动解决依赖让你从地狱回到人间。再往上是配仓库——告诉 yum 去哪里找包包括添加第三方仓库。最后是源码编译——没有现成 rpm 包的时候从源代码开始配置、编译、安装一条龙。读完这篇你不仅能装软件还知道怎么给别人建一个软件仓库让别人从你这里yum install。一、Linux 世界的两大门派——RPM 与 DEBWindows 上装软件大家都很熟悉要么去官网下载.exe安装包一路下一步要么去应用商店一键安装。Linux 没有一路下一步它的软件分发靠的是包管理系统。目前主流的 Linux 发行版分两大阵营RPM 阵营用.rpm格式的包发行版定位RHELRed Hat Enterprise Linux企业级付费订阅生产环境首选CentOS / CentOS StreamRHEL 的社区克隆版免费Rocky LinuxCentOS 的精神继承者FedoraRed Hat 的试验田桌面版激进尝鲜OELOracle Enterprise LinuxOracle 定制版DEB 阵营用.deb格式的包发行版定位Debian社区典范最遵循 GNU 规范稳如老狗UbuntuDebian 衍生版桌面体验好服务器也广泛使用Kali Linux渗透测试专用自带几百种安全工具还有 Arch Linux、Gentoo 这些不走这两条路的属于另一个世界暂且不表。我们的实验环境是 CentOS 7所以今天全程围绕RPM 包管理来讲。二、RPM 包到底是什么——拆开一个.rpm给你看2.1 文件名就是身份证RPM 包的文件名不是随便取的它有严格的命名规范name-version-release.architecture.rpm拿lrzsz-0.12.20-36.el7.x86_64.rpm举例字段值含义namelrzsz软件名——lrzsz 是一个终端文件传输工具version0.12.20上游原始版本号——软件作者定的release36.el7发行版号——RHEL/CentOS 的打包维护者定的el7表示 Enterprise Linux 7architecturex86_64跑在什么 CPU 架构上关于架构arch有三个常见值x86_6464 位 Intel/AMD 处理器aarch6464 位 ARM 处理器树莓派、苹果 M 系列noarch不挑架构——纯脚本、配置文件、文档这类什么 CPU 都能用2.2 一个 RPM 包里面有三个东西你把.rpm想象成一个三合一套餐要安装的文件——二进制程序、配置文件、文档、man 手册等按目标路径打包好元数据metadata——包名、版本、依赖关系、许可证、变更日志、一句话简介……都是描述这个包的信息脚本——安装前、安装后、卸载前、卸载后各要执行什么命令还有一个安全机制值得一提GPG 数字签名。Red Hat 发布每个 RPM 包时会用它的私钥签名。你本地的 RPM 系统用 Red Hat 的公钥去验证——签名对得上说明这个包没被篡改过对不上直接拒绝安装。复习一下非对称加密公钥加密的东西只有私钥能解开私钥签名的东西只有公钥能验证。RPM 流程是发布方用私钥签名安装方用公钥验证。2.3 关于安装和升级的几个重要事实同一个软件装一个版本就行。如果有多个版本可用只装最新的。kernel 是唯一的例外。内核包故意设计成可以多版本共存——新内核万一启不来你还能切回旧内核接着用。升级就是删旧的 装新的但配置文件通常会保留。你改过的配置不会被覆盖。三、rpm 命令——直击底层rpm是直接操作.rpm包文件的工具。它不做依赖自动解决——缺什么就报什么错你得自己一个一个找来装。正因如此理解rpm才能理解yum到底在帮你解决什么。3.1 查询——最常用的功能查询已安装的包基本语法是rpm -q然后配合各种选项# 系统里装了哪些包-a all[rootcentos7 ~]# 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 nss-sysinit-3.67.0-4.el7_9.x86_64......# 某个包装了吗[rootcentos7 ~]# rpm -q httpd未安装软件包 httpd[rootcentos7 ~]# rpm -q kernelkernel-3.10.0-1160.71.1.el7.x86_64# 查看包的详细信息-i info[rootcentos7 ~]# rpm -qi coreutilsName:coreutils Version:8.22Release:24.el7_9.2 Architecture: x86_64 Install Date:2025年07月18日 星期五10时29分40秒 Summary:Asetof basic GNU tools commonly usedinshell scripts# ...还包含许可证、构建时间、源码包地址等# 这个包在系统里装了哪些文件-l list[rootcentos7 ~]# rpm -ql openssh-server/etc/pam.d/sshd /etc/ssh/sshd_config /etc/sysconfig/sshd /usr/sbin/sshd /usr/share/man/man8/sshd.8.gz /var/empty/sshd# 哪些是配置文件-c config files[rootcentos7 ~]# rpm -qc openssh-server/etc/pam.d/sshd /etc/ssh/sshd_config /etc/sysconfig/sshd# 哪些是文档-d doc files[rootcentos7 ~]# rpm -qd openssh-server/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一个特别实用的场景某个文件是谁装进来的# 发现一个可疑文件想知道它属于哪个包[rootcentos7 ~]# rpm -qf /etc/ssh/sshd_configopenssh-server-7.4p1-22.el7_9.x86_64还有两个高级查询# 包在安装/卸载时执行了什么脚本[rootcentos7 ~]# rpm -q openssh-server --scriptspreinstall scriptlet(using /bin/sh):......postinstall scriptlet(using /bin/sh):......# 包的变更日志[rootcentos7 ~]# rpm -q openssh-server --changelog* 四7月202023Dmitry Belyavskiydbelyavsredhat.com-7.4p1-23 0.10.3-2 - Avoid remote code executioninssh-agent PKCS#11 supportResolves: CVE-2023-38408 * 四9月302021Dmitry Belyavskiydbelyavsredhat.com-7.4p1-22 0.10.3-2 - avoid segfaultinKerberos cache cleanup(#1999263)- fix CVE-2021-41617(#2008884)查询未安装的包文件先用yumdownloader把.rpm文件下载下来再用-p选项查询[rootcentos7 ~]# yum install -y yum-utils[rootcentos7 ~]# yumdownloader httpd[rootcentos7 ~]# rpm -qpc httpd-2.4.6-99.el7.centos.1.x86_64.rpm/etc/httpd/conf.d/autoindex.conf /etc/httpd/conf.d/userdir.conf......# -qpl 看文件列表-qpi 看元数据同理3.2 验证——这个包还是原装的吗当你怀疑某个系统文件被人篡改过rpm -V可以帮你揪出来# 检查 openssh-server 的所有文件是否完好[rootcentos7 ~]# rpm -V openssh-server# 没输出 一切正常# 改一个配置文件试试[rootcentos7 ~]# sed -i s/PermitRootLogin yes/PermitRootLogin no/g /etc/ssh/sshd_config[rootcentos7 ~]# rpm -V openssh-serverS.5....T. c /etc/ssh/sshd_config输出的那串字符S.5....T.每个位置都有含义位置含义本例S文件大小变了S 变了.权限没变.5MD5 校验和变了5 变了.设备号没变.T修改时间变了T 变了后面的c表示这是个配置文件config file。# 如果把文件直接删了验证会提示遗漏[rootcentos7 ~]# mv /etc/ssh/sshd_config .[rootcentos7 ~]# rpm -V openssh-server遗漏 c /etc/ssh/sshd_config# 记得放回去[rootcentos7 ~]# mv sshd_config /etc/ssh/sshd_config3 安装和卸载——手动处理依赖# 先下载一个包[rootcentos7 ~]# yumdownloader lrzsz# 安装-i install[rootcentos7 ~]# rpm -i lrzsz-0.12.20-36.el7.x86_64.rpm# 卸载-e erase[rootcentos7 ~]# rpm -e lrzsz# 友好模式加 -vverbose和 -hhash显示进度条[rootcentos7 ~]# rpm -ivh lrzsz-0.12.20-36.el7.x86_64.rpmVerifying...################################ [100%]准备中...################################ [100%]正在升级/安装...1:lrzsz-0.12.20-36.el7################################ [100%][rootcentos7 ~]# rpm -evh lrzsz准备中...################################ [100%]正在清理/删除...1:lrzsz-0.12.20-36.el7################################ [100%]依赖地狱是rpm的致命弱点。试试直接装 httpd[rootcentos7 ~]# rpm -ivh httpd-2.4.6-99.el7.centos.1.x86_64.rpm错误依赖检测失败 /etc/mime.types 被 httpd-2.4.6-99.el7.centos.1.x86_64 需要 httpd-tools2.4.6-99.el7.centos.1 被 httpd-2.4.6-99.el7.centos.1.x86_64 需要 libapr-1.so.0()(64bit)被 httpd-2.4.6-99.el7.centos.1.x86_64 需要 libaprutil-1.so.0()(64bit)被 httpd-2.4.6-99.el7.centos.1.x86_64 需要httpd 需要httpd-tools、apr、apr-utilapr可能又需要别的……你要一个一个手动找、手动装。这就是为什么我们需要yum。重新安装--reinstall配置文件丢了或者二进制被搞坏了不卸载直接重装[rootcentos7 ~]# rpm --reinstall -vh lrzsz*四、从 RPM 包里偷文件——不安装也能拿到里面的内容有时候你不想装这个包——只想把里面某一个配置文件或者二进制文件拿出来看看。Windows 上直接用压缩软件360 压缩、7-Zip 等打开.rpm文件——它本质是一种归档格式可以直接浏览和提取。Linux 上思路是把 RPM 转成cpio格式一种古老的打包格式然后从 cpio 里提取文件。# 第一步rpm → cpio[rootcentos7 ~]# rpm2cpio httpd-2.4.6-99.el7.centos.1.x86_64.rpm httpd.cpio# 第二步看看里面有什么-t list[rootcentos7 ~]# cpio -t httpd.cpio./etc/httpd ./etc/httpd/conf ./etc/httpd/conf.d ./etc/httpd/conf/httpd.conf......# 配合 grep——只找一个文件[rootcentos7 ~]# cpio -t httpd.cpio | grep httpd\.conf./etc/httpd/conf/httpd.conf ./usr/lib/tmpfiles.d/httpd.conf19347块# 提取所有文件-i extract, -d 按目录层级创建[rootcentos7 ~]# cpio -id * httpd.cpio# 只提取一个文件[rootcentos7 ~]# cpio -id ./etc/httpd/conf/httpd.conf httpd.cpio一条命令搞定管道一步到位[rootcentos7 ~]# rpm2cpio httpd-2.4.6-99.el7.centos.1.x86_64.rpm | cpio -id *五、yum——从依赖地狱到一键搞定5.1 yum 解决了什么rpm只管装这个包不管这个包还依赖别的什么。你自己去解决依赖——少一个就去下载一个下载的那个可能又依赖更多——这就是著名的依赖地狱。yumYellowdog Updater Modified做的事一句话你告诉它我要装 httpd它自动算出 httpd 需要哪些依赖去仓库里全部下载下来按正确顺序装好。你只需要敲一条命令。5.2 yum 常用命令查信息# 查看仓库中 httpd 的详细信息已装/未装都能看[rootcentos7 ~]# yum info httpd名称 httpd 架构 x86_64 版本 2.4.6 发布 99.el7.centos.1 简介 Apache HTTP Server 网址 http://httpd.apache.org/查清单# 仓库里所有 http 开头的包[rootcentos7 ~]# yum list http*# 查看某个包有哪些可用版本--showduplicates[rootcentos7 ~]# yum list httpd --showduplicates已安装的软件包 httpd.x86_642.4.6-99.el7.centos.1 updates 可安装的软件包 httpd.x86_642.4.6-95.el7.centos base httpd.x86_642.4.6-97.el7.centos updates......搜索# 在包的名字和简介里搜关键字[rootcentos7 ~]# yum search web server# 在名字、简介和描述里搜——范围更大[rootcentos7 ~]# yum search all web server反向查找——这个命令在哪个包里这是个高频场景你想用某个命令但系统说command not found。你要知道装什么包才能得到它[rootcentos7 ~]# yum provides sarsysstat-10.1.5-19.el7.x86_64:Collection of performance monitoring tools 源 base 文件名 /usr/bin/sar[rootcentos7 ~]# yum install -y sysstat # 装好就能用 sar 了安装# 正常安装[rootcentos7 ~]# yum install vsftpd# 只下载不安装——把包和依赖一起下到本地[rootcentos7 ~]# yum install vsftpd --downloadonly --downloaddir/root/# 安装本地的 rpm 文件会自动去仓库解决依赖[rootcentos7 ~]# yum localinstall ./vsftpd-3.0.2-29.el7_9.x86_64.rpm降级有时新版有 bug需要退回旧版# 降级 vsftpd 到指定版本[rootcentos7 ~]# yum downgrade -y vsftpd-3.0.2-28.el7注意降级不能只降一个——依赖它的包也要一起降。否则会报依赖关系无法满足的错误。实战httpd 降级翻车与修复# 翻车现场——只降 httpd 不降 httpd-tools[rootcentos7 ~]# yum downgrade -y httpd-2.4.6-97.el7.centos错误软件包httpd-2.4.6-97.el7.centos.x86_64(updates)需要httpd-tools2.4.6-97.el7.centos 已安装: httpd-tools-2.4.6-99.el7.centos.1.x86_64(updates)# 正确姿势——两个一起降[rootcentos7 ~]# yum downgrade -y httpd-tools-2.4.6-97.el7.centos httpd-2.4.6-97.el7.centos升级# 升级单个包[rootcentos7 ~]# yum update vsftpd-3.0.2-29.el7_9# 升级系统中所有包谨慎生产环境要评估影响[rootcentos7 ~]# yum update卸载[rootcentos7 ~]# yum remove -y vsftpd5.3 history——yum 的后悔药yum history记录了你每一次安装、卸载、升级操作。出问题的时候这是救命功能[rootcentos7 ~]# yum historyID|Login user|Date andtime|Action(s)|Altered ------------------------------------------------------------------------4|rootroot|2026-01-04 09:37|Downgrade|13|rootroot|2026-01-04 09:36|Install|12|rootroot|2025-12-2613:47|I, U|371|Systemunset|2025-12-2611:50|Install|310# 查看第 2 次事务的具体操作了什么[rootcentos7 ~]# yum history info 2# 后悔了撤销第 4 次操作[rootcentos7 ~]# yum history undo 4# 重做第 4 次操作[rootcentos7 ~]# yum history redo 4六、软件包组——一键安装整套环境有些场景你需要的不是一个包而是一整套。比如带图形界面的服务器——用包组一键搞定# 查看有哪些包组和环境组[rootcentos7 ~]# yum grouplist可用的环境分组 最小安装 基础设施服务器 带 GUI 的服务器 GNOME 桌面......可用组 Cinnamon......# 查看包组里包含哪些包[rootcentos7 ~]# yum groupinfo Server with GUI# 安装整个包组[rootcentos7 ~]# yum groupinstall Server with GUI# 卸载包组[rootcentos7 ~]# yum groupremove mariadb-client小技巧yum grouplist -v显示内部 ID如graphical-server-environmentyum group list -v显示英文名方便搜索和脚本使用。七、配置 yum 仓库——告诉 yum “去哪买菜”7.1 仓库配置的结构yum 的配置分布在两个地方位置作用/etc/yum.conf全局默认配置缓存路径、gpg 校验开关等/etc/yum.repos.d/*.repo每个仓库的独立配置7.2 查看和启停仓库# 看哪些仓库启用了[rootserver ~]# yum repolist源标识 源名称 状态 base/7/x86_64 CentOS-7 - Base - mirrors.aliyun.com10,072epel/x86_64 Extra PackagesforEnterprise Linux713,791extras/7/x86_64 CentOS-7 - Extras - mirrors.aliyun.com526updates/7/x86_64 CentOS-7 - Updates - mirrors.aliyun.com6,173# 看所有仓库包括禁用的[rootcentos7 ~]# yum repolist all# 启用 / 禁用仓库[rootcentos7 ~]# yum-config-manager --enable epel-debuginfo[rootcentos7 ~]# yum-config-manager --disable epel-debuginfo手动改配置文件也能控制启停——把.repo文件里的enabled1改成enabled0。7.3 缓存管理# 清理所有缓存[rootcentos7 ~]# yum clean all# 重建缓存装新仓库后必须做这一步否则补全和搜索可能不生效[rootserver ~]# yum makecache7.4 添加第三方仓库——以 Kubernetes 为例# 一键添加——yum-config-manager 帮你生成 .repo 文件[rootcentos7 ~]# yum-config-manager --add-repohttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/# 看看它自动生成了什么[rootcentos7 ~]# cat /etc/yum.repos.d/mirrors.aliyun.com_kubernetes_yum_repos_kubernetes-el7-x86_64_.repo[mirrors.aliyun.com_kubernetes_yum_repos_kubernetes-el7-x86_64_]nameadded from: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled1# 安装 kubectl跳过 GPG 校验——因为阿里云镜像没签 GPG[rootcentos7 ~]# yum install kubectl --nogpgcheck7.5 手动添加——以 Docker CE 为例有些仓库需要手工写.repo文件[rootcentos7 ~]# cat EOF /etc/yum.repos.d/docker-ce.repo[docker-ce-stable]nameDocker CE Stable -$basearchbaseurlhttps://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stableenabled1gpgcheck0EOF[rootcentos7 ~]# yum list docker-ce # 能查到就说明仓库配好了7.6 EPEL——CentOS 的扩展包超市EPELExtra Packages for Enterprise Linux是 CentOS/RHEL 必配的仓库——它提供了官方仓库里没有的大量常用软件。# 直接使用阿里云的 EPEL 源[rootcentos7 ~]# curl -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo今日骚操作# 一行命令搭建内网 yum 仓库 客户端配置在 server 上跑完client 立刻能装# 前提server 能连外网client 和 server 在同一局域网# server 端 mkdir-p/var/www/html/local-repo/Packages\yumdownloader--destdir/var/www/html/local-repo/Packagesvimwgetcurlnet-tools lrzsz\createrepo /var/www/html/local-repo\yuminstall-yhttpdsystemctlenablehttpd--now\echo 仓库已就绪http://$(hostname-I|awk{print $1})/local-repo # client 端替换 IP 为 server 的实际 IP mkdir-p/etc/yum.repos.d/backupmv/etc/yum.repos.d/*.repo /etc/yum.repos.d/backup\catEOF/etc/yum.repos.d/local.repo[local] nameLocal Repo baseurlhttp://10.1.8.10/local-repo/ enabled1 gpgcheck0 EOFyum clean allyum makecacheecho 已切换到本地仓库 拆解yumdownloader --destdir...→ 把常用工具包全部下载到发布目录createrepo→ 生成仓库索引httpd→ 用 Apache 把目录发布成 HTTP 服务客户端mv *.repo backup→ 先备份原有仓库配置cat写入新的.repo→ 指向自建仓库yum clean all yum makecache→ 重建缓存开始从自建仓库装软件下一篇预告Day 13 我们来搞定 Linux 的存储管理——fdisk分区、mkfs格式化、mount挂载、/etc/fstab开机自动挂载、df/du看空间占用。亲手给虚拟机挂一块新硬盘体验从一块裸盘到能用的全过程。今日练习用rpm -qi、rpm -ql、rpm -qc、rpm -qd分别查看coreutils包的信息、文件列表、配置文件、文档修改/etc/ssh/sshd_config的任意一行然后用rpm -V openssh-server验证观察输出字符的含义改回原样后再次验证用yum provides找出ifconfig、scp、make分别属于哪个包用yumdownloader下载nginx的 rpm 包用rpm2cpio | cpio -id提取里面的所有文件源码安装一次cmatrix运行时试试按!#$%切换颜色按0-9调整速度在两台虚拟机上搭建自建 yum 仓库server 端准备包 createrepo httpd 发布client 端配.repo文件并成功yum install用yum history查看操作历史试着undo最近一次安装操作再用redo恢复
郑州网站建设
网页设计
企业官网