作为一名 Ubuntu 用户,你可能对 apt-get
命令非常熟悉。多年来,apt (Advanced Package Tool) 一直是 Debian 系 Linux 发行版(包括 Ubuntu)的标准软件包管理工具。它使用 .deb
软件包,自动解决依赖关系,极大地简化了软件安装过程。Ubuntu 甚至还提供了一个图形化的软件商店,方便用户通过 UI 安装软件。
然而,随着软件包管理技术的不断发展,以及对安全性、隔离性和跨发行版兼容性的需求日益增长,新的软件包管理方案应运而生。其中,Canonical 公司推出的 snap 和社区驱动的 Flatpak 尤为引人注目。
本文将简要探讨 apt、snap 和 Flatpak 这三种软件包管理方案,分析它们的特点、优缺点,并最终给出针对不同用户场景的推荐。
apt (原 apt-get):Debian 系的经典传承
为什么需要包管理器?
在早期的 Linux 系统中,安装软件通常需要手动下载源代码、解决复杂的依赖关系、编译、安装,整个过程繁琐且容易出错。为了简化软件安装和管理,包管理器应运而生。
包管理器就像一个软件管家,它负责:
- 自动下载和安装软件: 用户只需输入简单的命令,包管理器就会自动从软件仓库下载软件包并安装。
- 解决依赖关系: 软件通常依赖于其他软件或库,包管理器会自动处理这些依赖关系,确保软件能够正常运行。
- 管理已安装的软件: 包管理器可以方便地更新、卸载、查询已安装的软件。
- 维护系统完整性: 包管理器可以跟踪软件包之间的关系,防止误删重要文件或破坏系统稳定性。
apt 与 yum:两大阵营
在 Linux 世界中,存在着两大主流的包管理器阵营:
- Debian 系: 以
apt
为代表,使用.deb
软件包格式。Debian、Ubuntu、Linux Mint 等发行版都属于这一阵营。 - Red Hat 系: 以
yum
(Yellowdog Updater, Modified) 为代表,使用.rpm
软件包格式。Red Hat Enterprise Linux (RHEL)、CentOS、Fedora 等发行版属于这一阵营。
apt
和 yum
的主要区别在于它们所使用的软件包格式和软件仓库不同。.deb
和 .rpm
是两种不同的软件包格式,它们包含了软件的二进制文件、配置文件、依赖信息等。不同的发行版维护着自己的软件仓库,其中包含了各种软件包。
Ubuntu 与 Debian 的关系
Ubuntu 是基于 Debian 的 Linux 发行版。Debian 是一个历史悠久、以稳定性和自由软件精神著称的 Linux 发行版。Ubuntu 在 Debian 的基础上进行了改进和优化,增加了易用性、用户友好的桌面环境,以及更频繁的软件更新。
Ubuntu 继承了 Debian 的 apt
软件包管理系统,并在此基础上进行了扩展和完善。因此,Ubuntu 用户可以使用 apt
命令来管理软件,并享受 Debian 庞大的软件仓库和社区支持。
apt 的核心优势与不足
apt 的核心优势在于其强大的依赖管理能力,能够自动解决软件包之间的依赖问题,这在 Linux 软件安装历史上是一大进步。
优点:
- 成熟稳定: 经过多年发展,apt 已经非常成熟稳定,拥有庞大的软件仓库和广泛的社区支持。
- 依赖管理: 自动解决软件包之间的依赖关系,简化安装过程。
- 速度快: 由于软件包直接安装到系统,启动速度通常较快。
- 资源占用少: 软件包不包含冗余依赖,占用磁盘空间较少。
- Debian/Ubuntu 生态支持: 依托 Debian 和 Ubuntu 庞大的社区和软件仓库。
缺点:
- 安全性相对较低:
.deb
软件包安装后可以访问系统任何位置,存在潜在安全风险。 - 版本冲突: 多个软件可能依赖同一库的不同版本,导致版本冲突。
- 跨发行版兼容性差:
.deb
软件包主要用于 Debian 系发行版。 - PPA 风险: 某些软件可能需要通过 PPA (Personal Package Archive) 安装,而 PPA 的质量参差不齐,存在安全风险。
常用命令:
sudo apt update
: 更新软件源列表。sudo apt upgrade
: 更新已安装的软件包。sudo apt install <package_name>
: 安装软件包。sudo apt remove <package_name>
: 卸载软件包(保留配置文件)。sudo apt --purge remove <package_name>
: 卸载软件包并清除配置文件。sudo apt autoremove
: 卸载不再需要的依赖包。sudo apt clean
: 清理已下载的软件包缓存。apt search <keyword>
: 搜索软件包。apt list --installed
: 列出已安装的软件包。
apt (原 apt-get):经典与传承
apt 使用的 .deb
软件包最初由 Debian Linux 推出,并被 Ubuntu 继承。apt 的核心优势在于其强大的依赖管理能力,能够自动解决软件包之间的依赖问题,这在 Linux 软件安装历史上是一大进步。
优点:
- 成熟稳定: 经过多年发展,apt 已经非常成熟稳定,拥有庞大的软件仓库和广泛的社区支持。
- 依赖管理: 自动解决软件包之间的依赖关系,简化安装过程。
- 速度快: 由于软件包直接安装到系统,启动速度通常较快。
- 资源占用少: 软件包不包含冗余依赖,占用磁盘空间较少。
- Debian/Ubuntu生态支持
缺点:
- 安全性相对较低:
.deb
软件包安装后可以访问系统任何位置,存在潜在安全风险。 - 版本冲突: 多个软件可能依赖同一库的不同版本,导致版本冲突。
- 跨发行版兼容性差:
.deb
软件包主要用于 Debian 系发行版。 - PPA 风险: 某些软件可能需要通过 PPA (Personal Package Archive) 安装,而 PPA 的质量参差不齐,存在安全风险。
常用命令:
sudo apt update
: 更新软件源列表。sudo apt upgrade
: 更新已安装的软件包。sudo apt install <package_name>
: 安装软件包。sudo apt remove <package_name>
: 卸载软件包(保留配置文件)。sudo apt --purge remove <package_name>
: 卸载软件包并清除配置文件。sudo apt autoremove
: 卸载不再需要的依赖包。sudo apt clean
: 清理已下载的软件包缓存。apt search <keyword>
: 搜索软件包。apt list --installed
: 列出已安装的软件包。
sudo apt update # 更新软件包列表,获取最新的软件包信息
sudo apt upgrade # 升级已安装的软件包到最新版本
sudo apt install <package_name> # 安装指定的软件包
sudo apt remove <package_name> # 卸载指定的软件包(保留配置文件)
sudo apt --purge remove <package_name> # 卸载指定的软件包并清除配置文件
sudo apt autoremove # 自动移除不再需要的依赖包
sudo apt clean # 清理已下载的软件包缓存,释放磁盘空间
apt search <keyword> # 根据关键词搜索软件包
apt list --installed # 列出所有已安装的软件包
snap:容器化与安全性
snap 是 Canonical 公司推出的全新软件包管理方案,它采用了一种类似容器的技术,将应用程序及其所有依赖打包在一起,形成一个独立的、隔离的运行环境。
优点:
- 安全性高: snap 软件包运行在沙盒环境中,与系统隔离,降低了安全风险。
- 依赖隔离: 每个 snap 软件包都包含其所有依赖,避免了版本冲突问题。
- 自动更新: snap 软件包默认自动更新,保持软件最新。
- 跨发行版兼容性: snap 软件包可以在多个 Linux 发行版上运行。
- 易于回滚: snap 支持版本回滚,方便恢复到之前的版本。
缺点:
- 闭源: snap 商店是闭源的,由 Canonical 控制,这与 Linux 社区的开源精神相悖。
- 性能: 由于采用容器化技术,snap 软件包的启动速度可能较慢,尤其是在首次启动时。
- 体积大: snap 软件包包含所有依赖,导致体积较大,占用更多磁盘空间。
- 中心化: snap 商店是中心化的,所有软件包都必须通过 Canonical 的审核才能发布。
- 强制使用?: Ubuntu 有时会强制使用 snap,即使你使用
apt install
命令安装软件,也可能安装的是 snap 版本。
比如之前有人吐槽的apt install chromium ,会发现安装的是snap版本,虽然这是因为chromium-browser is deb package and chromium is snap package。但是snap的引入,导致了这种使用习惯上的问题。
- 图形化商店不友好
常用命令:
snap find <keyword>
: 搜索 snap 软件包。snap install <package_name>
: 安装 snap 软件包。snap refresh <package_name>
: 更新 snap 软件包。snap remove <package_name>
: 卸载 snap 软件包。snap list
: 列出已安装的 snap 软件包。snap revert <package_name>
: 回滚到之前的版本。
snap find <keyword> # 搜索 Snap 软件包
snap install <package_name> # 安装指定的 Snap 软件包
snap refresh <package_name> # 更新指定的 Snap 软件包
snap remove <package_name> # 卸载指定的 Snap 软件包
snap list # 列出已安装的 Snap 软件包
snap revert <package_name> # 将指定的 Snap 软件包回滚到之前的版本
Flatpak:社区驱动与去中心化
Flatpak 是一个社区驱动的软件包管理方案,它也采用了容器化技术,但与 snap 不同的是,Flatpak 是完全开源和去中心化的。
优点:
- 开源: Flatpak 是完全开源的,符合 Linux 社区的开源精神。
- 去中心化: Flatpak 没有中心化的商店,用户可以从多个仓库安装软件包。
- 安全性: Flatpak 软件包也运行在沙盒环境中,提供良好的安全性。
- 依赖共享: Flatpak 支持运行时共享,多个软件包可以共享相同的依赖,减少磁盘空间占用。
- 友好的图形界面商店: Flathub 提供了完善的图形界面商店,方便用户浏览和管理 Flatpak 软件包。
缺点:
- 成熟度: 相比 apt 和 snap,Flatpak 相对较新,某些软件可能没有 Flatpak 版本。
- 依赖管理: 虽然支持运行时共享,但 Flatpak 的依赖管理不如 apt 成熟。
- 性能: 容器化技术也可能导致 Flatpak 软件包启动速度较慢。
常用命令:
flatpak search <keyword>
: 搜索 Flatpak 软件包。flatpak install <remote> <package_name>
: 从指定仓库安装 Flatpak 软件包。flatpak update <package_name>
: 更新 Flatpak 软件包。flatpak uninstall <package_name>
: 卸载 Flatpak 软件包。flatpak list
: 列出已安装的 Flatpak 软件包。flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
: 添加 Flathub 仓库。
flatpak search <keyword> # 搜索 Flatpak 软件包
flatpak install <remote> <package_name> # 从指定的远程仓库安装 Flatpak 软件包 (通常 <remote> 是 flathub)
flatpak update <package_name> # 更新指定的 Flatpak 软件包
flatpak uninstall <package_name> # 卸载指定的 Flatpak 软件包
flatpak list # 列出已安装的 Flatpak 软件包
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo # 添加 Flathub 仓库(如果尚未添加)```
总结与建议
apt、snap 和 Flatpak 各有优缺点,适用于不同的场景:
- apt: 成熟稳定,速度快,资源占用少,适合服务器环境和对性能要求较高的场景。但安全性相对较低,小可能存在版本冲突问题。
- snap: 安全性高,依赖隔离,自动更新,适合需要高安全性和最新软件的场景。但闭源、性能、体积和中心化是其主要问题。
- Flatpak: 开源、去中心化、安全性高,适合桌面用户和注重开源精神的场景。但成熟度和依赖管理仍有提升空间。
针对不同用户场景的建议:
-
桌面用户: 推荐使用 Flatpak。Flathub 提供了友好的图形界面商店,方便浏览和安装软件。Flatpak 的开源、去中心化特性也更符合 Linux 社区的精神。
-
-
SSH 开发者: 仍然推荐使用 apt。apt 成熟稳定,速度快,资源占用少,更适合服务器环境和命令行操作。
-
临时试用: 由于
apt remove
命令不会自动移除不再需要的依赖包,而需要手动执行apt autoremove
来清理,这在需要频繁安装、卸载软件,或者希望保持系统干净整洁的场景下,可能会略显繁琐。相比之下,Snap 的设计理念之一就是提供一种更“干净”的安装和卸载体验。snap remove
命令会移除 Snap 软件包及其所有相关数据和依赖(在 Snap 的沙盒环境中),无需额外的清理步骤。因此,如果你更看重软件卸载的彻底性和便捷性,或者希望尽量减少对系统的潜在影响(例如在试用软件或临时使用软件时),Snap
可能会是更方便的选择。
最终结论:
对于喜欢桌面环境的用户,Flatpak 的商店界面友好,是更好的选择。对于喜欢通过 SSH 进行开发的开发者,apt install 仍然是首选,因为它成熟稳定,速度快,资源占用少。snap 由于其闭源特性和 Canonical 的强制推广,个人认为其很难在 Linux 市场上长期立足。但是因为开箱即用嘛,我可以在snap install
一下,当然后续flatpak生态持续完善后,snap开箱即用的优势也荡然无存了。我们拭目以待吧。
希望本文能帮助你更好地理解 Ubuntu 上的各种软件包管理方案,并根据自己的需求做出明智的选择。