跳到主要内容

📦 软件包管理

Linux 包管理器是系统的应用商店。不同发行版用不同的包管理器,但核心概念一样:安装、更新、卸载、查依赖。

三大包管理器速查
操作Ubuntu/Debian (apt)Fedora/RHEL (dnf)Arch (pacman)
更新索引sudo apt updatesudo dnf check-updatesudo pacman -Sy
升级软件sudo apt upgradesudo dnf upgradesudo pacman -Syu
安装sudo apt install pkgsudo dnf install pkgsudo pacman -S pkg
卸载sudo apt remove pkgsudo dnf remove pkgsudo pacman -R pkg
搜索apt search pkgdnf search pkgpacman -Ss pkg
查看信息apt show pkgdnf info pkgpacman -Si pkg

📋 包管理器对比

apt (Debian/Ubuntu)

# 更新软件包索引(必须定期执行)
sudo apt update

# 升级所有可升级的包
sudo apt upgrade -y

# 智能升级(会处理依赖变更,推荐)
sudo apt full-upgrade -y

# 搜索包
apt search nginx

# 查看包信息
apt show nginx

# 安装包
sudo apt install nginx -y

# 查看已安装的包
apt list --installed

# 卸载包(保留配置文件)
sudo apt remove nginx

# 完全卸载(删除配置文件)
sudo apt purge nginx

# 自动移除不再需要的依赖
sudo apt autoremove -y

dnf (Fedora/RHEL 9+)

# 更新索引
sudo dnf check-update

# 升级
sudo dnf upgrade -y

# 搜索
dnf search nginx

# 安装
sudo dnf install nginx -y

# 查看依赖
dnf repoquery --requires nginx

# 卸载
sudo dnf remove nginx -y

# 清理缓存
sudo dnf clean all

pacman (Arch)

# 同步仓库 + 升级系统
sudo pacman -Syu

# 安装
sudo pacman -S nginx

# 搜索(本地 + AUR)
pacman -Ss nginx

# 查看文件列表
pacman -Ql nginx

# 卸载(保留依赖)
sudo pacman -R nginx

# 卸载(递归卸载依赖)
sudo pacman -Rs nginx

# 清理缓存
sudo pacman -Scc

🔄 日常包管理操作

典型工作流

# 步骤 1:更新索引
sudo apt update

# 步骤 2:查看可升级的包
apt list --upgradable

# 步骤 3:升级(交互式,会提示是否继续)
sudo apt upgrade

# 步骤 3 替代:非交互式升级
sudo apt upgrade -y

# 步骤 4:清理
sudo apt autoremove -y
sudo apt autoclean

查看包详情

# 查看包安装了哪些文件
dpkg -L nginx # Debian/Ubuntu
rpm -ql nginx # Fedora/RHEL
pacman -Ql nginx # Arch

# 查看某个文件属于哪个包
dpkg -S /usr/sbin/nginx
rpm -qf /usr/sbin/nginx
pacman -Qo /usr/sbin/nginx

# 查看包依赖
apt-cache depends nginx
dnf repoquery --requires nginx
pacman -Si nginx

安装特定版本

# Ubuntu/Debian:查看可用版本
apt-cache policy nginx

# 安装指定版本
sudo apt install nginx=1.18.0-6ubuntu14.4

# Fedora:查看可用版本
dnf module list nginx

# 锁定版本(防止意外升级)
sudo apt-mark hold nginx

🔨 从源码编译

有些包在官方仓库里没有,或者你需要最新版本 → 从源码编译

经典三步曲

# 步骤 1:下载源码
wget https://example.com/app-1.2.3.tar.gz
tar -xzf app-1.2.3.tar.gz
cd app-1.2.3/

# 步骤 2:配置(检查依赖,生成 Makefile)
./configure --prefix=/usr/local/app-1.2.3

# 步骤 3:编译
make -j$(nproc) # nproc = CPU 核心数,并行加速

# 步骤 4:安装
sudo make install

用 checkinstall 替代 make install(推荐)

make install 不会记录安装的文件,难以卸载。checkinstall 会生成包管理器认识的包。

sudo apt install checkinstall

# 编译后,用 checkinstall 安装
sudo checkinstall make install
# 会生成 .deb 包,可以用 dpkg -r 卸载

从 Git 仓库安装(开发者常用)

# 克隆仓库
git clone https://github.com/user/repo.git
cd repo/

# 查看标签,切换到稳定版本
git tag
git checkout v1.2.3

# 构建(以 Rust 项目为例)
cargo build --release
sudo cp target/release/app /usr/local/bin/

# 或者用 cargo install(自动处理)
cargo install --path .

🧹 清理与维护

清理 apt 缓存

# 查看缓存占用
sudo du -sh /var/cache/apt/archives/

# 删除已下载的 .deb 包(保留锁文件)
sudo apt clean

# 删除过期的缓存包
sudo apt autoclean

# 删除不再需要的依赖
sudo apt autoremove --purge -y

清理 dnf 缓存

sudo dnf clean all
sudo rm -rf /var/cache/dnf/*

查找大包(清理目标)

# Ubuntu:按已安装包大小排序
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -n | tail -20

# Fedora:查看最大包
dnf repoquery --installed --qf '%{size} %{name}' | sort -n | tail -20

⚠️ 依赖冲突处理

场景:依赖地狱

# 问题:包 A 需要 libfoo >= 2.0,包 B 需要 libfoo < 2.0
# 解决方式 1:用容器隔离(推荐)
docker run -it ubuntu:20.04 # 在容器里跑旧版本

# 解决方式 2:从源码编译到 /usr/local/
./configure --prefix=/usr/local/old-libfoo
make && sudo make install

# 解决方式 3:用 update-alternatives 切换版本
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 110
sudo update-alternatives --config gcc # 交互式选择

📚 下一步