Linux 软件包管理

Windows 装软件要去官网下 exe、点击下一步;macOS 要拖到 Applications。Linux 则有一个包管理器,一行命令就能从软件源下载、安装、更新、卸载几乎所有软件,还会自动处理依赖关系。这是 Linux 比 Windows 体验好得多的一大原因。

1. 包管理的核心概念

理解三件事就够了:

2. apt:Debian / Ubuntu 系列

Ubuntu、Debian、Mint 等 Debian 系发行版用 apt(老命令叫 apt-get)。这是新手最先接触的包管理器。

# apt:Debian / Ubuntu 系列的包管理器

# 更新软件源索引(装任何东西前先 update)
sudo apt update                  # 从源服务器拉最新软件列表
#   "Reading package lists... Done"

# 升级所有已装的软件
sudo apt upgrade                 # 升级已装软件(不删旧的)
sudo apt dist-upgrade            # 升级并处理依赖变化(可装/删包)

# 安装软件
sudo apt install nginx           # 装一个
sudo apt install nginx git curl  # 装多个
sudo apt install -y nginx        # -y:所有问题回答 yes(脚本里常用)

# 卸载
sudo apt remove nginx            # 卸载(保留配置文件)
sudo apt purge nginx             # 彻底卸载(连配置一起删)
sudo apt autoremove              # 清理不再需要的依赖(系统瘦身)

# 查询
apt search keyword               # 按关键字搜
apt show nginx                   # 看软件包详情(版本、依赖、描述)
apt list --installed             # 列出所有已装的包
dpkg -l | grep nginx             # 同上,旧写法

最重要的习惯:装新软件前先 apt update。否则你装的可能是旧版本——apt update 是从源拉最新软件列表,apt upgrade 才是真的升级动作。

3. yum / dnf:CentOS / RHEL 系列

CentOS、Rocky、AlmaLinux、Fedora 用 yum 或它的升级版 dnf。两者用法几乎一样,记一个就行。

# yum / dnf:CentOS / RHEL / Fedora 系列

# dnf 是 yum 的升级版(Fedora 18+ / RHEL 8+ 推荐)
# 用法几乎一样,把 yum 换成 dnf 即可

sudo yum install nginx           # 装
sudo yum remove nginx            # 卸
sudo yum update                  # 升级所有
sudo yum update nginx            # 只升级 nginx
sudo yum search nginx            # 搜
sudo yum info nginx              # 详情
sudo yum list installed          # 已装列表
yum provides */nginx             # 哪个包提供 nginx 命令

# 装企业源(EPEL,额外软件包)
sudo yum install epel-release
#   装完就能装很多官方源里没有的软件

4. apk / pacman:容器和极客的选择

Docker 镜像经常基于 Alpine(体积只有 5MB),它的包管理器是 apk。Arch Linux 用户则用 pacman

# apk:Alpine Linux(Docker 容器首选)

apk update                       # 更新源
apk add nginx                    # 装
apk add --no-cache nginx         # 不留缓存(Dockerfile 里必加)
apk del nginx                    # 卸
apk search nginx                 # 搜
apk info                         # 已装列表

# pacman:Arch Linux
sudo pacman -S nginx             # 装
sudo pacman -Syu                 # 全系统更新(滚动更新日常)
sudo pacman -R nginx             # 卸
sudo pacman -Ss nginx            # 搜
pacman -Q                        # 已装列表

不同发行版的命令虽然不同,但套路完全一样:update → install → remove → search。学会一个,其他查文档就能用。

5. 配置软件源(国内提速)

默认软件源在国外,国内访问很慢。换成阿里云、清华、中科大的镜像源可以快十倍以上。这是装完 Linux 的"第一件事"。

# 软件源(repository)配置

# Ubuntu/Debian 的源在 /etc/apt/sources.list
# 国内服务器换成阿里云/清华源可以大幅提速
sudo vim /etc/apt/sources.list
#   把 archive.ubuntu.com 换成 mirrors.aliyun.com
sudo apt update                  # 改完必须 update 一下

# 添加第三方 PPA 源(Ubuntu)
sudo add-apt-repository ppa:deadsnakes/python3.12
sudo apt update
sudo apt install python3.12

# CentOS 添加 EPEL 和 REMI 源
sudo yum install epel-release
sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm

改源就是修改配置文件里的 URL,把官方域名换成镜像站域名。改完必须 apt update 刷新一下索引,否则还是用旧源。

6. 通用包格式:snap / flatpak / AppImage

传统包管理器绑死发行版:Ubuntu 的 deb 在 Fedora 上装不了。通用包格式解决这个问题——一份包所有发行版都能装:

# 通用包格式:跨发行版

# snap:Canonical(Ubuntu 公司)推的格式,自带依赖
sudo snap install code --classic    # 装 VS Code
sudo snap install docker
sudo snap list                      # 已装

# flatpak:Linux 桌面应用主流,跨发行版
flatpak install flathub com.visualstudio.code

# AppImage:单文件应用,下载即用
chmod +x app.AppImage
./app.AppImage

# 这些格式体积大但隔离好,适合桌面应用
# 服务器场景仍然推荐用系统原生包管理器(apt/yum)

这些格式主要用在桌面应用上(VS Code、Slack、GIMP)。服务器场景仍然推荐系统原生包管理器,体积小、启动快。

7. 源码编译安装

有时软件没提供预编译包,或你需要特定编译选项,就要从源码编译。Linux 经典的"三步走":

# 源码编译安装(找不到预编译包时的最后选择)

# 经典三步走(解压后进入源码目录)
./configure                # 检测环境,生成 Makefile
make                       # 编译
sudo make install          # 安装到系统

# 示例:从源码装最新版 Redis
wget https://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz
cd redis-stable
make
sudo make install

# 缺点:卸载麻烦(要保留源码 make uninstall),
#      升级也要重新编译。
# 优先用包管理器,源码安装只在必要时用。

源码安装是最后的选择——卸载麻烦、升级要重新编译、依赖要自己装。能用包管理器就别用源码。

8. 常见踩坑

9. 实战:装一个完整的 Node.js 环境

把这一篇的知识串起来,装 Node.js 有几种方式,体会不同方法的取舍:

小结

这一篇你学会了用包管理器装软件:Ubuntu 用 apt、CentOS 用 yum/dnf、Alpine 用 apk。掌握了更新源、安装、卸载、查询、换镜像源。下一篇讲把这些命令组合起来自动执行的Shell 脚本

← 上一篇 Linux 管道与重定向

下一篇 Shell 脚本入门

✈️💬