你是不是刚接触 Linux,想装个软件,结果网上的教程五花八门,有的说用 rpm,有的说用 yum,还有的让你编译源码?装个软件而已,怎么这么多方法?到底哪个才是对的?很多新手卡在这一步,要么装完软件用不了,要么依赖错了,要么把系统搞乱了,最后只能重装系统。其实,Linux 的软件管理,本质上就这三种核心方式:rpm、yum、源码安装,只要你搞懂了这三个,不管什么软件,你都能轻松搞定,再也不用对着满屏的错误一脸懵。这篇文章,我会把我多年来 Linux 运维的经验全部整理出来,从最基础的概念,到每个命令的详细用法,到每个踩坑点,到实战案例,一步一步带你搞懂,不管你是新手还是老手,看完这篇,你都能彻底搞懂 Linux 的软件管理,以后装软件再也不用查教程了。前言:为什么 Linux 的软件安装这么复杂?很多从 Windows 转过来的用户都会疑惑:Windows 装软件,下一步下一步就好了,怎么 Linux 这么麻烦?其实,这是因为 Linux 的设计理念和 Windows 不一样。Windows 是闭源的,所有的软件都是微软统一管理,而 Linux 是开源的,有很多不同的发行版,不同的厂商,还有开源社区,所以软件的分发方式也不一样。而且,Linux 的软件,有很强的依赖关系,一个软件可能需要依赖很多其他的库和工具,这些依赖如果没装,软件就用不了。所以,Linux 就发展出了不同的软件管理方式,来解决这些问题:rpm:最基础的包管理方式,把软件打包成一个文件,但是不会帮你解决依赖。yum:基于 rpm 的前端工具,自动帮你解决依赖,从软件源里下载安装,是现在最常用的方式。源码安装:最原始的方式,把源代码下载下来,自己编译成可执行文件,最灵活,但是最麻烦。这三种方式,各有各的适用场景,搞懂了它们,你就搞懂了 Linux 的软件管理。注意:这篇文章主要针对 RHEL 系的 Linux 发行版,也就是 CentOS、RedHat、Fedora、Rocky Linux、AlmaLinux 这些,它们用的就是 rpm、yum(或者 dnf)包管理器。如果你用的是 Ubuntu、Debian,它们用的是 dpkg、apt,原理类似,但是命令不一样,不过看完这篇,你也能举一反三。第一章:Linux 软件管理的基础认知在开始讲具体的命令之前,我们先搞懂一些基础的概念,不然你看命令的时候,根本不知道是什么意思。1.1 什么是软件包?在 Linux 里,软件包就是把软件的所有文件,比如可执行文件、配置文件、依赖说明,打包成一个文件,方便分发和安装。对于 RHEL 系来说,最常见的就是.rpm格式的包,这就是 rpm 包,里面包含了这个软件的所有内容,还有它的依赖信息。而源码包,就是把软件的源代码打包成.tar.gz或者.tar.bz2的压缩包,你需要自己编译成可执行文件才能用。1.2 rpm 包的命名规则很多新手下载 rpm 包的时候,看到文件名比如nginx-1.20.1-9.el8.x86_64.rpm,根本看不懂是什么意思,其实这个名字里藏了很多信息:nginx:软件的名字1.20.1:软件的版本号9:这个包的发布号,也就是这个版本的 rpm 包,第 9 次打包el8:这个包是给 Enterprise Linux 8 做的,也就是 CentOS 8、RHEL 8 这些系统,el7 就是给 CentOS 7 的x86_64:这个包的架构,也就是 64 位的系统,i386 就是 32 位的,noarch 就是不分架构,通用的所以,你下载 rpm 包的时候,一定要选对自己的系统版本和架构,不然装不了,比如你是 CentOS 7,就不能装 el8 的包,不然会提示依赖错误。1.3 三种安装方式的核心区别很多新手搞不懂,这三个方式到底有什么不一样,我用一个表格给你讲清楚:安装方式核心特点依赖处理软件版本定制性适用场景rpm本地安装 rpm 包手动解决依赖包的版本低离线安装、本地包安装yum从源自动安装自动解决依赖源里的版本低日常大部分软件安装源码安装自己编译源码手动解决依赖最新版本高定制功能、最新版本简单来说:如果你有本地的 rpm 包,而且已经有了所有依赖,用 rpm。如果你日常装软件,想方便,自动解决依赖,用 yum。如果你需要最新的软件,或者需要定制软件的功能,用源码安装。搞懂了这个,你就知道什么时候用哪个方法了。第二章:rpm 包管理:最基础的软件安装方式rpm,全称是 Red Hat Package Manager,是 Red Hat 公司开发的包管理器,是 RHEL 系所有发行版的基础包管理工具,所有的 rpm 包,都是用它来管理的。yum 其实就是在 rpm 的基础上,加了一个自动解决依赖的功能,所以,搞懂 rpm,你才能搞懂 yum。2.1 rpm 的核心功能:安装软件rpm 最基础的功能,就是安装 rpm 包,最常用的命令就是:sudorpm-ivhpackage.rpm这个命令里的三个参数,是最常用的,我给你一个个解释:-i:全称是--install,意思是安装软件包,这是核心参数,告诉 rpm,我要安装这个包。-v:全称是--verbose,意思是详细输出,让 rpm 把安装的过程输出出来,让你知道它在做什么。-h:全称是--hash,意思是用 #号显示安装的进度条,这样你能看到安装到哪了,不用干等着。这三个参数,几乎是安装 rpm 包的标配,所以你看到的大部分教程里,都是用rpm -ivh,就是这个原因。举个例子,比如你下载了 nginx 的 rpm 包,名字是nginx-1.20.1-9.el8.x86_64.rpm,那你安装它的命令就是:sudorpm-ivhnginx-1.20.1-9.el8.x86_64.rpm正常情况下,输出会是这样的:Verifying...################################# [100%]Preparing...################################# [100%]Updating / installing...1:nginx-1:1.20.1-9.el8################################# [100%]这就说明安装成功了,很简单对吧?但是,很多时候,你会遇到这样的错误:error: Failed dependencies: libpcre.so.1()(64bit)is needed by nginx-1:1.20.1-9.el8.x86_64 libssl.so.1.1()(64bit)is needed by nginx-1:1.20.1-9.el8.x86_64 libcrypto.so.1.1()(64bit)is needed by nginx-1:1.20.1-9.el8.x86_64这就是 rpm 最大的缺点:它只会告诉你,这个软件需要什么依赖,但是不会帮你安装这些依赖!你必须自己去下载这些依赖的 rpm 包,然后先安装它们,然后才能安装 nginx 的包。比如,上面的错误,告诉你缺了 pcre 和 openssl 的库,那你就要先下载 pcre 和 openssl 的 rpm 包,然后用 rpm 安装它们,然后再安装 nginx。这就是为什么 rpm 不适合新手用,因为依赖太多了,你要一个个手动装,太麻烦了。踩坑提醒:很多新手遇到这个错误,会加一个--nodeps参数,强制安装,比如:sudorpm-ivh--nodepsnginx-1.20.1-9.el8.x86_64.rpm这个参数的意思是,忽略依赖,强制安装。但是,这样安装完之后,nginx 根本用不了,因为它需要的依赖没装,你运行 nginx 的时候,还是会提示找不到库。而且,强制安装会把系统的依赖关系搞乱,以后你用 yum 或者 rpm 管理软件的时候,会出很多奇怪的问题。所以,永远不要随便用 --nodeps,除非你明确知道你在做什么!2.2 rpm 的升级功能:升级已安装的软件如果你已经装了旧版本的软件,想升级到新版本,rpm 也可以做到,用-U参数:sudorpm-Uvhpackage.rpm-U的全称是--upgrade,意思是升级,如果这个软件没装过,就直接安装;如果已经装了,就升级到新版本。还有一个参数是-F,全称是--freshen,意思是只有当这个软件已经安装了,才升级,没装的话,就不做任何事。比如,你有一个旧版本的 nginx,现在下载了新版本的 rpm 包,你就可以用:sudorpm-Uvhnginx-1.26.1-1.el8.x86_64.rpm这样,就会把旧版本的 nginx 升级到新版本,配置文件也会保留,很方便。2.3 rpm 的卸载功能:删除已安装的软件如果你想卸载一个已经安装的 rpm 包,用-e参数:sudorpm-enginx-e的全称是--erase,意思是删除,后面跟的是软件的名字,不是 rpm 包的名字哦!很多新手会搞错,比如卸载的时候,把 rpm 包的名字放进去,比如rpm -e nginx-1.20.1-9.el8.x86_64.rpm,这就错了,卸载的时候,用的是软件的名字,也就是nginx。那怎么知道软件的名字是什么?后面我们讲查询的时候会说。同样,卸载的时候,rpm 也会检查依赖,如果有其他软件依赖这个包,它会提示你:error: Failed dependencies: nginx is needed by(installed)nginx-mod-http-geoip-1:1.20.1-9.el8.x86_64这就是说,有一个叫 nginx-mod-http-geoip 的包,依赖 nginx,所以你不能直接卸载 nginx,不然那个包就用不了了。这时候,如果你非要卸载,还是可以用--nodeps强制卸载:sudorpm-e--nodepsnginx但是,同样的,这会把依赖的包搞坏,那个 nginx-mod-http-geoip 的包,虽然还在,但是用不了了,系统的依赖关系也乱了,所以还是那句话,不要随便用--nodeps。2.4 rpm 的查询功能:查看已安装的软件rpm 的查询功能,是非常常用的,你可以用它来查看系统里装了什么软件,软件的信息,软件装了哪些文件,等等。查询的核心参数是-q,全称是--query,意思是查询。2.4.1 查询所有已安装的软件如果你想看看你的系统里,都装了哪些 rpm 包,用这个命令:rpm-qa-a的全称是--all,意思是所有的包,这个命令会输出所有你已经安装的 rpm 包,非常长,所以你可以用管道符过滤,比如找有没有装 nginx:rpm-qa|grepnginx这样,就会输出所有名字里带 nginx 的包,比如:nginx-1.20.1-9.el8.x86_64 nginx-mod-http-geoip-1:1.20.1-9.el8.x86_64 nginx-mod-stream-1:1.20.1-9.el8.x86_64这样,你就知道,你装了 nginx,还有它的模块,这就是卸载的时候,软件的名字,就是nginx。2.4.2 查询某个软件的详细信息如果你想看看某个软件的详细信息,比如版本、发布时间、描述,用-qi参数:rpm-qinginx输出会是这样的:Name:nginx Version:1.20.1 Release:9.el8 Architecture:x86_64 Install Date:Wed11Jun202503:00:00 PM CST Group:System Environment/Daemons Size:1629345License:BSD Signature:RSA/SHA256, Tue15Mar202209:00:00 PM CST, Key ID 4568eaccd48ae061 Source RPM:nginx-1.20.1-9.el8.src.rpm Build Date:Tue15Mar202208:00:00 PM CST Build Host:kbuilder.build.eng.bos.redhat.com Relocations: