刚接触 Linux 或者从 Windows 迁移过来的同学,最先困惑的往往不是命令怎么敲,而是“软件到底怎么装”。在 Windows 上,双击 exe 或者 MSI 就完事了;在 Linux 上,你会发现有.deb、.rpm,还有Flatpak、Snap、AppImage这些五花八门的名词。每次下载软件,面对一排安装包格式,完全不知道该选哪一个。
这篇文章不打算停留在“A 比 B 好”这种表面结论,而是把 Linux 主流的几种软件安装格式一次讲透:它们分别来自哪里、底层原理是什么、怎么安装和卸载、有哪些坑,以及实际项目中到底该怎么选。
无论你是刚入门的 Linux 新手,还是需要维护服务器、给国产系统部署软件的运维同学,这篇文章都值得收藏备用。
1. 为什么 Linux 的软件安装格式这么多
在解释每一种格式之前,先弄清楚一个根本问题:为什么 Linux 不能像 Windows 那样统一一种安装包格式?
这背后的核心原因是Linux 本身只是一个内核,不是一套完整操作系统。我们常说的 Debian、Ubuntu、CentOS、openEuler、银河麒麟、统信 UOS,本质上是在 Linux 内核之上,由不同团队打包成的独立操作系统。
不同发行版在底层使用的 C 库、包管理器、目录规范上各有差异,因此出现了两条主要的包管理技术路线:
- Debian 系:使用
dpkg作为底层包工具,包格式是.deb,上层包管理器是apt。 - Red Hat 系:使用
rpm作为底层包工具,包格式是.rpm,上层包管理器是yum或dnf。
这两大派系统治了 Linux 服务器和桌面市场很多年,但也一直存在痛点:软件依赖关系复杂、系统库版本冲突、不同发行版之间软件包不能互通。为了解决这些问题,又出现了 Flatpak、Snap、AppImage 这些“跨发行版”的打包格式。
所以,Linux 软件安装格式多,是生态多元化的自然结果。理解了这一点,后面选择安装格式时思路就清楚了。
2. 主流软件包格式详细拆解
下面把五种常见格式逐一拆开讲,先说明底层机制,再讲实际操作。
2.1 Deb:Debian 系的根基
.deb是 Debian 系发行版的软件包格式,底层工具是dpkg,日常使用更多是通过apt命令来安装。
Deb 包本质是一个归档文件,里面包含了软件编译好的二进制程序、库文件、配置文件、man 帮助文档,以及包元数据(包名、版本、依赖关系等)。
查看一个 deb 包的详细信息,可以这样操作:
# 查看本地 deb 包的详细信息 dpkg -I ./google-chrome-stable_current_amd64.deb # 查看包内文件列表 dpkg -c ./google-chrome-stable_current_amd64.deb安装本地 deb 包,最常用的是dpkg -i,但这里有一个新手常见问题:dpkg不会自动下载依赖。如果缺少依赖包,会直接报错。
sudo dpkg -i ./xxx.deb输出中如果出现dependency problems,说明缺依赖。此时可以执行修复命令:
sudo apt -f install这个命令会自动安装缺失的依赖。
如果你希望像 apt 在线安装那样自动处理依赖,可以这样安装本地 deb:
sudo apt install ./xxx.deb注意这个写法:apt install后面接的是文件路径,不是包名。apt 会根据 deb 包里的依赖信息,自动从软件源把依赖拉取下来。
卸载 deb 包:
# 注意用包名,不带 .deb 后缀 sudo apt remove 包名Deb 系发行版包括 Debian、Ubuntu、Linux Mint,以及国内的 Deepin、统信 UOS、麒麟(部分版本)。在这个体系里,下载软件时优先选择.deb是没问题的。
2.2 RPM:Red Hat 系的标配
.rpm是 Red Hat 系发行版的软件包格式,底层工具是rpm,上层包管理器是yum(CentOS 7 及更早)或dnf(CentOS 8+、Fedora、openEuler、Rocky Linux)。
RPM 包的安装命令如下:
sudo rpm -ivh ./xxx.rpm参数含义:
-i:install,安装-v:verbose,显示详细信息-h:hash,显示进度条
如果软件包已经安装过,想强制重新安装,使用--force:
sudo rpm -ivh --force ./xxx.rpm和 dpkg 一样,rpm也不会自动解决依赖关系。缺依赖时,通过 yum 或 dnf 安装会更省心:
# CentOS 7 sudo yum localinstall ./xxx.rpm # CentOS 8 / Rocky / openEuler sudo dnf localinstall ./xxx.rpm查询某个软件包是否已安装、属于哪个包,是运维中高频操作:
# 查询包是否已安装 rpm -q 包名 # 查询某个命令属于哪个已安装包 rpm -qf /usr/bin/nginx # 查询已安装包的安装时间 rpm -qi 包名卸载:
sudo rpm -e 包名国内环境里,RPM 包在服务器生态中占比极高。MySQL、Nginx、JDK、Redis 这些基础软件,官网常直接提供.rpm包,特别是离线环境下,RPM 是最方便的安装方式。后面我会专门用一节来演示离线 RPM 安装。
2.3 Flatpak:面向桌面的沙箱格式
Flatpak 最早由 Red Hat 团队主导开发,目标是做一个跨发行版的 Linux 桌面应用分发格式。它最大的特点是沙箱隔离:应用运行在自己的容器环境中,系统本身不会因为安装软件而被“污染”。
Flatpak 的架构分为三层:
- flatpak 命令:负责安装、运行、卸载应用。
- 运行时(Runtime):应用依赖的基础运行环境,类似容器镜像的底层。
- 应用本体:只包含应用自身文件和与运行时差异化部分。
安装 Flatpak 支持:
# Debian / Ubuntu sudo apt install flatpak # CentOS 8 / Rocky sudo dnf install flatpak添加 Flathub 软件源:
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo安装应用:
flatpak install flathub org.videolan.VLC运行应用:
flatpak run org.videolan.VLC卸载:
flatpak uninstall org.videolan.VLCFlatpak 的核心优势是跨发行版一致性和安全隔离。一个 Flatpak 包,在 Ubuntu、Fedora、Arch、Debian 上都能跑,不需要为每个发行版单独打包。
但也要注意,Flatpak 应用的启动速度通常比原生包慢一些,占用的磁盘空间也更大(因为要拉取运行时)。如果你在服务器上使用 Linux,Flatpak 基本没有用武之地;它更适合桌面 Linux 用户。
国内网络环境下,Flathub 仓库访问可能不稳定。网上有人维护了 Flathub 的国内镜像,这里给一个配置思路,具体镜像地址以实际可用为准:
# 先添加官方仓库获取仓库 ID flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo # 修改 flathub 仓库的 URL 为国内镜像地址 flatpak remote-modify flathub --url=https://mirror.example.com/flathub如果访问 flathub.org 正常,就不需要折腾镜像。
2.4 Snap:Ubuntu 主推的容器化格式
Snap 是 Canonical(Ubuntu 背后的公司)推出的软件打包与分发格式,设计目标和 Flatpak 高度相似:跨发行版、自动更新、沙箱隔离。
Snap 的独有特点是安装了一条 snapd 守护进程,用来管理 snap 包的下载、挂载和更新。snap 包自带运行时依赖,所以安装后不需要额外处理依赖问题。
查看系统中已安装的 snap 列表:
snap list安装 snap 应用:
sudo snap install vlc卸载:
sudo snap remove vlc搜索软件(一般不在商店里找时使用):
snap find vlcSnap 最大的争议在于:它引入了闭源的服务端商店(Snap Store)、自动更新机制、以及系统性能开销。不少 Ubuntu 用户强烈希望移除 snap 换成 deb 版本,热词里“ubuntu卸载snap的利弊”也反映了这个诉求。
如果你确认不使用 snap 应用,并且希望释放系统资源,可以这样移除:
# 先卸载所有已安装的 snap 应用,再删除 snapd 服务 sudo systemctl stop snapd sudo apt purge snapd rm -rf ~/snap sudo rm -rf /var/cache/snapd但在这之前建议想清楚:Ubuntu 系统自带的软件中心部分组件依赖 snap。移除后,可能需要通过 deb 或 Flatpak 替代方案来安装应用。
如果你的应用发布团队要求“使用 snap 以便统一跨机器环境”,也可以接受。但要在服务器上默认避开 snap,它并非为服务器场景设计。
2.5 AppImage:一个文件即一个应用
AppImage 和前几种有明显不同。它不是安装格式,而是免安装的运行格式:一个.AppImage文件就包含整个应用和依赖,下载后赋执行权限即可运行,不会往系统目录里写文件,也不需要 root 权限。
使用步骤:
# 1. 下载 AppImage 文件 # 2. 赋予执行权限 chmod +x ./xxx.AppImage # 3. 直接运行 ./xxx.AppImage这非常适合便携软件的使用场景。比如你不想把某个软件“安装”到系统里,只是偶尔用一次,AppImage 是最合适的。
卸载方式也极简单:直接删除文件即可,系统没有任何残留。
AppImage 的缺点同样明显:
- 没有统一的安装管理机制,不会自动集成到系统菜单(需要用户手动创建
.desktop文件)。 - 没有自动更新功能,需要关注新版手动替换。
- 不同 AppImage 运行时版本可能互相冲突,部分应用首次启动较慢。
如果只是个人桌面场景,下载一个 Obsidian、Krita 之类的 AppImage 用起来非常舒服。
3. 五种格式对比与选型建议
为了方便快速决策,把五种格式的核心差异整理成一张表。
| 对比维度 | Deb | RPM | Flatpak | Snap | AppImage |
|---|---|---|---|---|---|
| 适用系统 | Debian/Ubuntu/Deepin/UOS | CentOS/RHEL/Rocky/openEuler | 跨发行版桌面 | 跨发行版,Ubuntu 强推 | 跨发行版桌面 |
| 依赖处理 | dpkg 不处理,apt 处理后端 | rpm 不处理,yum/dnf 处理后端 | 自带运行时 | 自带依赖 | 自带全部依赖 |
| 沙箱隔离 | 无 | 无 | 有 | 有 | 无 |
| 是否需要 root | 需要 | 需要 | 需要(安装时) | 需要 | 不需要 |
| 自动更新 | 系统级统一更新 | 系统级统一更新 | 支持 | 支持 | 无 |
| 卸载残留 | 基本干净 | 基本干净 | 干净 | 较复杂 | 删除文件即可 |
| 典型场景 | 日常桌面/服务器 | 服务器/企业环境 | 桌面 GUI 应用 | 桌面 GUI 应用 | 便携软件 |
选型建议可以归纳成几个简单原则:
- 服务器环境:Debian 系用 deb,Red Hat 系用 rpm,不要装 Flatpak/Snap。
- 桌面 Linux 但发行版是新装的 Ubuntu:优先 apt 的 deb,软件中心能搜到的就用它;搜不到再考虑 Flatpak。
- 想跨发行版分发 GUI 应用:如果团队精力有限,优先 Flatpak 或 AppImage。Flatpak 需要接入软件源,AppImage 只需要给一个文件。
- 便携、绿色、免安装:AppImage 是唯一选择。
- 企业私有化部署、内网离线安装:优先 deb/rpm,便于内网仓库统一管理。
4. 实战:常见安装场景与完整命令
理论讲完,下面用几个贴近真实工作的场景,把命令演示完整。这些场景来自大家经常搜索的问题:离线安装 RPM 包、安装 deb 依赖缺失、国产系统部署。
4.1 场景一:CentOS 7 离线安装 MySQL 8 的 RPM 包
很多内网服务器不能访问外网,所以需要提前在能联网的机器上下载好 RPM 包,再拷到目标机器安装。
第一步:在有网的机器上,前往 MySQL 官方下载页或使用仓库工具下载。这里以 mysql8 的 RPM 集合包为例。假设你手头已经有mysql80-community-release-el7-7.noarch.rpm。
第二步:先安装 MySQL 的软件源 RPM:
sudo rpm -ivh mysql80-community-release-el7-7.noarch.rpm第三步:查看当前的软件源列表:
yum repolist enabled | grep mysql正常情况下可以看到 mysql80-community 源。
第四步:下载全部 MySQL 相关 RPM 包到本地目录:
sudo mkdir -p /opt/mysql-rpm sudo yumdownloader --destdir=/opt/mysql-rpm mysql-community-server mysql-community-client mysql-community-common mysql-community-libs如果系统没有yumdownloader,先安装:
sudo yum install -y yum-utils第五步:把/opt/mysql-rpm里的所有 rpm 拷贝到离线服务器上,然后一次性安装:
sudo rpm -ivh /opt/mysql-rpm/*.rpm这个命令会自动在当前目录解析 RPM 包之间的依赖,解决顺序问题。如果还是报依赖错误,尝试加--nodeps --force,但这是下策,生产环境不要轻易使用。
这个流程的核心要点是:离线安装 RPM 时,优先用yum localinstall或一次性安装多个本地 RPM,让 yum 自动处理包间依赖。
4.2 场景二:Debian/Ubuntu 下安装 deb 包提示依赖缺失
在 Ubuntu 里双击一个 deb 包慢慢找到底哪里有问题,不如直接用命令行。
假设下载了wps-office_xxx_amd64.deb,安装时报依赖缺失:
sudo dpkg -i wps-office_xxx_amd64.deb输出大概这样:
dpkg: dependency problems prevent configuration of wps-office wps-office depends on xxx; however: Package xxx is not installed.修复方案很简单,执行:
sudo apt -f installapt 会从软件源中找到缺失依赖并补齐。之后再确认安装状态:
dpkg -l | grep wps当然也可以从一开始就避免这个问题。用apt install ./xxx.deb安装本地 deb,会自动处理依赖:
sudo apt install ./wps-office_xxx_amd64.deb如果你在国产系统(如统信 UOS、银河麒麟桌面版,它们基于 Debian),这个命令同样适用。
有一种特殊情况:deb 包是在下载过程中损坏的。安装时会报package is in a very bad inconsistent state或者直接提示文件损坏。此时先检查文件大小、sha256 校验值是否和官网一致,重新下载一般能解决。
4.3 场景三:Flatpak 安装钉钉/企业微信等国内应用
企业微信、钉钉的 Linux 版虽然提供 deb/rpm 包,但更新速度不一。如果能用 Flatpak 安装其他来源版本,可以获得更好的桌面集成。
以 Flathub 安装为例,先搜索:
flatpak search wechat如果搜不到国内应用,可以添加第三方仓库(注意来源安全)。国内网络环境下先配好镜像,再用 Flatpak 安装。
运行和卸载命令:
# 运行 flatpak run com.tencent.WeChat # 查看安装了哪些 Flatpak 应用 flatpak list4.4 场景四:AppImage 集成到桌面启动器
AppImage 下载后虽然可以运行,但不会出现在系统菜单里。如果想要像普通应用一样在启动器里搜索到,需要手动创建.desktop文件。
假设把 AppImage 放在/opt/apps/TestApp/TestApp.AppImage。
创建桌面文件:
sudo vim /usr/share/applications/testapp.desktop内容如下:
[Desktop Entry] Version=1.0 Name=TestApp Comment=Test Application Exec=/opt/apps/TestApp/TestApp.AppImage Icon=/opt/apps/TestApp/icon.png Terminal=false Type=Application Categories=Utility;保存后刷新桌面数据库:
sudo update-desktop-database此时就能在系统应用列表中找到 TestApp。
5. 常见问题与排查思路
把大家平时搜索最多、踩坑最频繁的问题整理成一张排查表。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
输入rpm命令提示 command not found | 当前系统是 Debian/Ubuntu 系列,没有 rpm | 使用dpkg和apt命令;不要试图在 Debian 系上强行安装 rpm 包 |
| dpkg 安装 deb 包提示依赖缺失 | 软件包依赖系统里没有的库 | 执行sudo apt -f install补齐依赖 |
| apt 安装本地 deb 提示 URI 错误 | 命令写错:直接写deb开头被当成在线源 | 使用sudo apt install ./包名.deb形式,注意加./ |
| yum localinstall 安装 rpm 报 GPG 校验失败 | 软件包未签名或签名不被信任 | 加上--nogpgcheck参数,生产环境建议导入对应公钥后重试 |
| rpm 卸载提示被依赖 | 其他软件包依赖此包 | 使用rpm -e --nodeps 包名强制卸载,但要确认影响范围 |
| Flatpak 添加 flathub 后安装超时 | 国内网络访问 flathub.org 不稳定 | 配置国内镜像源,或临时使用代理(合规场景) |
| Snap 安装后应用启动特别慢 | snap 首次运行需要挂载 squashfs 镜像 | 首次启动正常现象;如果持续卡顿,需要检查 snapd 服务状态 |
| AppImage 提示无法执行二进制文件 | 架构不匹配或缺少 FUSE 库 | 检查文件架构file xxx.AppImage;安装libfuse2(Ubuntu 20.04+) |
| 国产系统(麒麟/统信)安装 rpm 包失败 | 系统底层可能是 Debian 系,不识别 rpm | 确认系统版本后选择对应的 deb 包;若确实只有 rpm,需要转换或确认系统是否兼容 |
这里重点说一下“没找到 rpm 命令”这种情况。热词里“没找到rpm命令”出现频率很高。原因是很多刚接触 Linux 的用户分不清 Debian 系和 Red Hat 系。拿到手里的软件包如果是.rpm,而系统是 Ubuntu,自然无法识别。解决思路不是找 rpm 命令,而是下载对应发行版的.deb包。
还有用户搜索“提示deb包是否损坏”,总结下来一般有三个原因:
- 下载不完整:文件大小和官网不一致,重新下载并校验 sha256。
- 架构不对:下载了 amd64 包,但系统是 arm64,安装会报错。
- 软件源缓存问题:
apt缓存了旧软件包列表,先执行sudo apt update再安装。
6. 最佳实践与工程建议
掌握了基本操作后,真正考验技术水平的往往是工程化细节。下面给几条有实际价值的建议。
6.1 服务器环境坚持使用 deb/rpm,不要混入 Flatpak/Snap
服务器场景追求的是稳定、最小依赖、快速启动。Flatpak 和 Snap 的沙箱机制解决了桌面应用的依赖冲突,但引入了额外守护进程和性能开销。在服务器上,一个软件包往往需要被监控、加固、和业务系统联动,deb/rpm 这种传统格式更透明、更可控。
6.2 内网环境搭建本地软件源
企业内网批量部署服务器时,逐台执行rpm -ivh是低效且容易出错的。更规范的做法是搭建内网 Yum/Apt 仓库:
- 在能联网的机器上下载好需要的软件包。
- 上传到内网仓库服务器。
- 客户端配置指向内网仓库。
这样批量安装、版本升级、依赖解决都能统一管理,也避免人人从公网下载软件包带来的安全风险。
6.3 deb/rpm 包卸载后要确认残留
使用apt remove或yum remove卸载软件时,配置目录可能残留在系统里。如果要“彻底清理”,执行apt purge或yum remove配合手动删除/etc下的配置目录。
以 Ubuntu 下彻底卸载为例:
sudo apt purge 包名 sudo apt autoremove其中autoremove会清理不再需要的依赖库,能显著减少系统里的垃圾包。
6.4 关注来源安全:只安装可信软件包
优先选用官方软件源、官方 GitHub Release、发行版自带仓库的软件包。不要从陌生网站随意下载 deb/rpm 包。
安装前可以用命令核对签名:
# RPM 验证签名 rpm -K ./xxx.rpm # deb 包查看维护者信息 dpkg -I ./xxx.deb | grep Maintainer涉及系统级权限的操作,在测试环境先验证,备份当前环境,严格遵循最小权限原则。
6.5 理解“安装”与“运行”的区别
AppImage 不安装也能运行,但它没有注册到系统。如果一个软件需要开机自启、需要系统服务、需要集成到系统菜单,那它需要的是“安装”而不是“运行”。这也是为什么即使 AppImage 很方便,在生产环境中仍然推荐 deb/rpm 的原因。
7. 总结与动手实践建议
Linux 软件安装格式多,本身并不是坏事。deb/rpm 保证了服务器生态的规范性,Flatpak/Snap 解决了桌面应用跨发行版分发问题,AppImage 提供了极致的便携体验。
日常使用中,我的建议很简单:
- 刚入门时,先掌握 deb 或 rpm 其中一种,搞清楚
apt/dpkg或yum/rpm的基本操作。 - 碰到依赖问题,不要急着
--force,先让包管理器自动解决。 - 工作中如果遇到国产系统(银河麒麟、统信 UOS),先确认系统属于 Debian 系还是 Red Hat 系,再选择安装包格式。
下一步可以继续学习 Linux 软件包管理的更多细节,比如自己制作 deb/rpm 包、搭建内网镜像仓库、写自动化安装脚本,这些都是运维和开发工作中含金量很高的技能。
如果这篇文章对你有帮助,欢迎收藏备用。也欢迎在评论区聊聊你在安装软件时踩过的坑——尤其是国产系统下的那些“疑难杂症”,往往评论区比正文还精彩。