很多刚接触 Linux 的朋友,都会有一个疑问:
我在 Windows 上装软件,不就是去官网下载安装包,然后一路“下一步”吗?
为什么到了 Linux,大家张口就是:
sudo apt install nginxsudo yum install nginx
或者:
sudo dnf install nginx
为什么不用去官网下载安装包?
apt、yum、dnf 到底又是什么?
这其实是 Linux 和传统 Windows 软件管理方式最不一样的地方。
今天我们就把这件事说透。
看完以后,你再看到 apt install xxx、yum install xxx,就不会觉得它是一串神秘咒语,而会知道它背后到底在帮你做什么。
一、先搞懂:Linux 为什么会有“包管理器”?
先说结论:
包管理器,是 Linux 发行版用来统一安装、升级、卸载和管理软件的工具。
它不是凭空冒出来的。
它的出现,和 Linux 的生态方式有关。
传统 Windows 桌面软件,常见方式是:
这种模式对普通桌面用户很直观。
但 Linux 的世界不太一样。
Linux 发行版通常由系统、内核、命令行工具、库文件、服务程序和大量开源软件组成。
很多软件还会依赖其他库。
如果每装一个软件,都要自己去官网找源码、下载、编译、解决依赖、配置路径、处理升级,那维护成本会非常高。
尤其是在服务器上。
你可能没有图形界面,也不希望每台机器都手动点安装包。
这时候就需要一个统一工具,把这些事情自动化。
这就是包管理器。
二、一个真实场景:没有包管理器会有多麻烦?
比如你想搭一个 LNMP 环境:
如果你不用包管理器,可能要自己下载源码编译。
你先编译 Nginx,结果提示缺 pcre。
你去装 pcre,又发现缺 zlib。
好不容易把 Nginx 编译过去,装 PHP 时又发现缺一堆扩展和开发库。
最后还可能遇到版本不兼容。
这就是很多新手第一次在 Linux 上装软件时最容易崩溃的地方:
你以为自己只是在装一个软件,其实是在处理一整串依赖关系。
而使用包管理器时,命令通常会变成这样:
sudo apt install nginx mysql-server php-fpm
或者在 Red Hat 系发行版上:
sudo dnf install nginx mysql-server php-fpm
包管理器会自动帮你查依赖、下载依赖、安装依赖。
你只要确认安装即可。
这就是它最核心的价值。
三、apt、yum、dnf 到底是谁家的?
很多新手分不清什么时候用 apt,什么时候用 yum。
其实它们不是同一个工具。
它们属于不同的 Linux 发行版体系。
1. Debian / Ubuntu 系:dpkg + apt
代表发行版包括:
这个体系使用 .deb 格式的软件包。
其中:
apt:负责从软件源下载包、解析依赖、调用底层工具完成安装
所以新手可以先这样记:
Ubuntu、Debian 上,通常用 apt。
2. Red Hat / Fedora 系:rpm + yum / dnf
代表发行版包括:
这个体系使用 .rpm 格式的软件包。
其中:
dnf:较新一代的包管理前端,很多新发行版默认使用它
现在的 Fedora、RHEL 8/9、CentOS Stream、Rocky Linux、AlmaLinux 等系统,通常优先使用 dnf。
不过很多资料里仍然会写 yum,有些系统也会把 yum 命令兼容到 dnf。
新手可以先这样记:
Ubuntu 用 apt,Red Hat 系新系统优先用 dnf,老资料里常见 yum。
四、包管理器第一步:去“软件源”里找软件
当你输入:
sudo apt install nginx
apt 做的第一件事,不是去 Nginx 官网下载。
它会先去你系统配置的软件源里找。
软件源,也叫软件仓库。
你可以把它理解成发行版或社区维护的软件服务器。
里面提前放好了大量编译好的软件包,以及每个软件包的版本、依赖、签名等信息。
在 Debian / Ubuntu 系统里,软件源配置通常在这些位置:
/etc/apt/sources.list/etc/apt/sources.list.d/
新版本 Ubuntu 也可能使用 .sources 格式的配置文件,例如:
/etc/apt/sources.list.d/ubuntu.sources
在 CentOS / RHEL / Fedora 系统里,软件源配置通常在:
/etc/yum.repos.d/
一个 Ubuntu 软件源示例大致长这样:
deb http://archive.ubuntu.com/ubuntu noble main restricted universe multiversedeb http://archive.ubuntu.com/ubuntu noble-updates main restricted universe multiverse
这里的 noble 是 Ubuntu 24.04 的版本代号。
如果你换源,一定要确认源地址和系统版本代号匹配。
比如 focal 对应 Ubuntu 20.04,jammy 对应 Ubuntu 22.04,noble 对应 Ubuntu 24.04。
版本代号不匹配,很容易导致 apt update 报错。
五、为什么要通过软件源安装?
软件源不是多此一举。
它解决了 Linux 软件管理里非常关键的三个问题。
1. 版本更可控
发行版软件源里的包,通常会针对当前系统版本做适配。
这意味着:
你自己去官网下二进制包或源码,也不是不行。
但如果它和当前系统里的库版本不匹配,就可能出现装不上、启动失败、升级冲突等问题。
2. 安全性更高
软件源里的包通常会经过发行版维护者打包、签名和更新。
这不代表永远没有漏洞。
但至少比在搜索引擎里随便找一个下载站更可靠。
尤其是服务器环境,软件来源非常重要。
来源不明的安装脚本、压缩包和二进制文件,都可能带来安全风险。
3. 后续维护更方便
用包管理器安装的软件,会被记录在系统的软件包数据库里。
系统知道:
所以后续升级、卸载、查询都可以统一完成。
这也是为什么 Linux 很强调“统一管理”。
六、包管理器第二步:自动检查依赖
很多新手最容易卡住的,是“依赖”这个词。
其实它不难理解。
比如你安装一个视频播放器。
播放器自己负责界面和播放逻辑,但它可能需要调用系统里的解码库才能播放某些格式。
这个解码库,就是播放器依赖的包。
如果缺了它,播放器可能就运行不了。
在没有包管理器时,你必须自己一个个找依赖。
缺一个,就报一次错。
而包管理器会读取软件包里的依赖信息,然后把需要的包一起列出来。
比如安装 Nginx 时,你可能会看到类似输出:
The following additional packages will be installed: nginx-common nginx-core libnginx-mod-http-geoip2 libnginx-mod-http-image-filter libnginx-mod-http-xslt-filterDo you want to continue? [Y/n]
这段话的意思是:
你要装 Nginx,但它还需要这些额外包,我会一起安装。
你确认以后,包管理器就会把它们一起处理好。
这就是自动依赖解析。
也是包管理器最省心的地方。
七、包管理器第三步:下载、安装、注册到系统
确认依赖以后,包管理器会继续做几件事:
比如你通过包管理器安装 Nginx 后,通常可以用:
nginx -v
查看版本。
也可以用:
sudo systemctl start nginxsudo systemctl status nginx
启动和查看服务状态。
这不是因为包管理器“随便复制了一些文件”。
而是因为它按照发行版的规范,把软件安装到了系统应该认识的位置。
八、包管理器第四步:升级和卸载也一起管
包管理器不只负责安装。
它还负责后续维护。
在 Debian / Ubuntu 系统里,常见升级命令是:
sudo apt updatesudo apt upgrade
这里要注意:
apt upgrade:根据索引升级已安装的软件包
也就是说,update 本身不是升级软件。
它只是先告诉系统:
软件源里现在有哪些包、有哪些版本。
然后 upgrade 才是真正执行升级。
卸载软件也很直接:
sudo apt remove nginx
如果你想连配置文件一起删除,可以用:
sudo apt purge nginx
查询软件也可以用:
apt search nginxapt show nginx
这就是统一管理的好处。
安装、升级、卸载、查询,都走同一个体系。
九、那 Linux 就完全不用去官网吗?
不是。
更准确的说法是:
大多数常规软件,优先用包管理器;特殊需求,再考虑官网、第三方源或源码编译。
包管理器不是唯一方式。
它只是最推荐的新手默认方式。
1. 官方源版本太旧时
发行版为了稳定,软件源里的版本不一定总是最新。
比如服务器系统通常更重视稳定和安全补丁,而不是追新版本。
如果你确实需要某个软件的新功能,官方源里的版本又太旧,就可能需要:
这时候就不是“能不能去官网”的问题,而是要看你的需求和系统环境。
2. 需要自定义编译参数时
有些软件你可能需要定制编译。
比如 Nginx 需要加入某些第三方模块。
包管理器安装的是发行版维护者预编译好的版本。
如果默认编译参数不满足需求,你就可能需要自己编译。
这类情况更偏进阶使用。
新手一开始不必急着碰。
3. 闭源软件或商业软件不在官方源里
有些软件本来就不在发行版官方源里。
比如某些数据库、商业软件、厂商客户端、专有驱动等。
这时你可能需要按照厂商文档安装。
但即便如此,很多厂商也会提供自己的 .deb、.rpm 包,甚至提供专门的软件源。
这样后续升级仍然可以交给包管理器处理。
十、新手最常用的 apt 命令
Debian / Ubuntu 系常用命令如下:
| |
|---|
| sudo apt update |
| sudo apt upgrade |
| sudo apt install 软件名 |
| sudo apt remove 软件名 |
| sudo apt purge 软件名 |
| apt search 关键词 |
| apt show 软件名 |
| sudo apt clean |
| sudo apt autoremove |
你可以先记住这一组。
日常使用已经够了。
十一、新手最常用的 dnf / yum 命令
Red Hat / Fedora 系新系统,建议优先看 dnf。
常用命令如下:
| dnf |
|---|
| sudo dnf install 软件名 |
| sudo dnf remove 软件名 |
| sudo dnf upgrade |
| sudo dnf upgrade 软件名 |
| dnf search 关键词 |
| dnf info 软件名 |
| sudo dnf clean all |
| sudo dnf makecache |
如果你使用的是较老系统,或者教程里写的是 yum,对应命令通常是:
sudo yum install 软件名sudo yum remove 软件名sudo yum updateyum search 关键词yum info 软件名sudo yum clean allsudo yum makecache
多数入门场景下,你可以先把 yum 和 dnf 理解成同一个体系里的新旧工具。
真正需要细分时,再看具体发行版文档。
十二、几个新手常见误区
最后把几个常见问题讲清楚。
1. 用包管理器装的软件,性能会比源码编译差很多吗?
一般不会。
发行版提供的软件包通常已经做了通用编译和适配。
对绝大多数业务场景来说,性能差异不是主要问题。
只有在你明确知道自己需要特殊编译参数、特定模块或极致优化时,才需要考虑源码编译。
2. 为什么 apt install 提示找不到包?
常见原因有三个。
第一,软件包名字记错了。
比如你想装 MySQL,在 Ubuntu 上常见包名可能是:
sudo apt install mysql-server
第二,本地软件包索引太旧。
可以先执行:
sudo apt update
第三,当前软件源里确实没有这个包。
这时可能需要启用额外仓库、添加厂商源,或者换一种安装方式。
3. 为什么换源之后 apt update 报错?
最常见原因是源地址和系统版本不匹配。
比如你是 Ubuntu 22.04,却用了 Ubuntu 20.04 的源。
系统代号不一致,依赖关系就可能乱掉。
所以换源前要先确认自己的系统版本:
lsb_release -a
或者:
cat /etc/os-release
再选择对应版本的软件源。
十三、总结
现在再回头看,包管理器其实没有那么神秘。
它主要是在帮你做这几件事:
所以,apt、yum、dnf 本质上不是“装软件的命令”这么简单。
它们是 Linux 发行版的软件管理系统。
对新手来说,最稳妥的习惯是:
常规软件优先用包管理器,特殊需求再考虑官网、第三方源或源码编译。
当你理解了这一点,Linux 装软件这件事就不再是“到处找安装包”,而是变成了一套清晰、可维护、可升级的系统流程。
如果这篇文章帮你理清了 apt、yum 和 dnf 的关系,也可以把它转给正在被 Linux 装软件折腾的朋友。