字数 3569,阅读大约需 18 分钟
软件包管理基础
包管理器对比
包管理核心概念
软件源 (Repository) → 包管理器 → 安装包 → 软件
↓
依赖解决
Debian/Ubuntu: apt
apt 基本命令
# 更新软件源列表
sudo apt update
# 升级已安装的软件(不删除包)
sudo apt upgrade
# 升级软件(可能删除包)
sudo apt dist-upgrade
# 安装软件
sudo apt install nginx
# 安装特定版本
sudo apt install nginx=1.18.0-0ubuntu1
# 卸载软件(保留配置)
sudo apt remove nginx
# 彻底卸载(删除配置)
sudo apt purge nginx
# 自动删除无用依赖
sudo apt autoremove
# 清理缓存
sudo apt clean
sudo apt autoclean
# 查看软件信息
apt show nginx
# 搜索软件
apt search nginx
# 列出已安装软件
apt list --installed
# 列出可升级软件
apt list --upgradable
dpkg 命令(底层工具)
# 安装本地 deb 包
sudo dpkg -i package.deb
# 卸载软件
sudo dpkg -r package
# 查看已安装软件
dpkg -l
# 查看软件详细信息
dpkg -s package
# 查看软件安装的文件
dpkg -L package
# 查看文件属于哪个包
dpkg -S /usr/bin/nginx
# 列出包内容(不安装)
dpkg -c package.deb
apt 高级用法
# 模拟安装(不实际执行)
sudo apt install nginx --dry-run
# 只下载不安装
sudo apt install nginx --download-only
# 修复损坏的包
sudo apt --fix-broken install
# 允许降级安装
sudo apt install nginx --allow-downgrades
# 从特定版本安装
sudo apt install nginx/bionic
# 查看包依赖
apt depends nginx
# 查看反向依赖(哪些包依赖它)
apt rdepends nginx
# 查看包变更历史
apt changelog nginx
# 下载源码包
apt source nginx
apt 配置
# 软件源配置
cat /etc/apt/sources.list
# 额外软件源目录
ls /etc/apt/sources.list.d/
# apt 配置
cat /etc/apt/apt.conf
cat /etc/apt/apt.conf.d/*
# 首选项(版本控制)
cat /etc/apt/preferences.d/*
# 修改下载镜像(交互式)
sudo software-properties-gtk
# 命令行修改镜像
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
CentOS/RHEL: yum/dnf
yum 基本命令(CentOS 7)
# 清理缓存
sudo yum clean all
# 重建缓存
sudo yum makecache
# 更新软件源
sudo yum check-update
# 升级所有软件
sudo yum update
# 升级特定软件
sudo yum update nginx
# 安装软件
sudo yum install nginx
# 安装特定版本
sudo yum install nginx-1.18.0
# 卸载软件
sudo yum remove nginx
# 查看软件信息
yum info nginx
# 搜索软件
yum search nginx
# 列出已安装软件
yum list installed
# 列出可升级软件
yum list updates
# 查看包依赖
yum deplist nginx
# 查看包历史
yum history
dnf 基本命令(CentOS 8+/Fedora)
# dnf 兼容 yum 命令
sudo dnf install nginx
sudo dnf remove nginx
sudo dnf update
# 查看包历史
sudo dnf history
# 回滚到历史操作
sudo dnf history undo 5
# 查看包依赖
dnf repoquery --requires nginx
# 查看反向依赖
dnf repoquery --whatrequires nginx
# 列出包提供的文件
dnf repoquery -l nginx
# 查找提供某文件的包
dnf provides /usr/bin/nginx
rpm 命令(底层工具)
# 安装 rpm 包
sudo rpm -ivh package.rpm
# 升级 rpm 包
sudo rpm -Uvh package.rpm
# 强制安装(忽略依赖)
sudo rpm -ivh --force package.rpm
# 卸载软件
sudo rpm -e package
# 查询已安装软件
rpm -qa
# 查询软件信息
rpm -qi nginx
# 查询软件文件列表
rpm -ql nginx
# 查询文件属于哪个包
rpm -qf /usr/bin/nginx
# 验证包完整性
rpm -V nginx
# 导入 GPG 密钥
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
yum/dnf 配置
# 仓库配置目录
ls /etc/yum.repos.d/
# 查看启用的仓库
yum repolist
dnf repolist
# 查看仓库配置
cat /etc/yum.repos.d/CentOS-Base.repo
# 启用/禁用仓库
sudo yum-config-manager --enable epel
sudo yum-config-manager --disable epel
# dnf 管理仓库
sudo dnf config-manager --enable powertools
sudo dnf config-manager --disable powertools
# 查看仓库优先级
yum repolist all
# 清理元数据
sudo yum clean metadata
sudo dnf clean all
源码编译安装
编译安装步骤
# 1. 安装编译工具
# Debian/Ubuntu
sudo apt install build-essential
# CentOS/RHEL
sudo yum groupinstall "Development Tools"
sudo yum install gcc gcc-c++ make
# 2. 下载源码
wget https://example.com/software-1.0.tar.gz
tar -xzvf software-1.0.tar.gz
cd software-1.0
# 3. 查看编译选项
./configure --help
# 4. 配置编译选项
./configure --prefix=/usr/local/software \
--with-ssl=/usr/include/openssl \
--enable-shared
# 5. 编译
make -j$(nproc)
# 6. 安装
sudo make install
# 7. 卸载
sudo make uninstall
常见编译选项
# 安装路径
--prefix=/usr/local/nginx # 主目录
--exec-prefix=/usr # 可执行文件
--bindir=/usr/bin # 用户命令
--sbindir=/usr/sbin # 系统命令
--sysconfdir=/etc # 配置文件
# 功能选项
--enable-module # 启用模块
--disable-module # 禁用模块
--with-feature # 包含特性
--without-feature # 不包含特性
# 依赖库
--with-ssl=/path/to/ssl # SSL 库路径
--with-zlib=/path/to/zlib # zlib 路径
--with-pcre=/path/to/pcre # PCRE 路径
解决依赖问题
# 查看缺失依赖
./configure 2>&1 | grep "not found"
# Debian/Ubuntu 安装依赖
sudo apt build-dep nginx
# CentOS/RHEL 安装依赖
sudo yum-builddep nginx
# 使用 pkg-config 查找库
pkg-config --libs openssl
pkg-config --cflags openssl
# 设置库路径
export LDFLAGS="-L/usr/local/lib"
export CPPFLAGS="-I/usr/local/include"
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig"
管理源码安装的软件
# 记录安装文件
sudo checkinstall make install
# 生成 deb 包(Debian/Ubuntu)
sudo checkinstall --pkgname=software --pkgversion=1.0 make install
# 生成 rpm 包(CentOS/RHEL)
sudo checkinstall --pkgname=software --pkgversion=1.0 --pkgtype=rpm make install
# 手动记录文件列表
sudo make install | tee install.log
# 或使用 strace
sudo strace -f -e trace=open make install 2>&1 | grep open
# 创建 systemd 服务
sudo tee /etc/systemd/system/software.service << EOF
[Unit]
Description=Custom Software
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/software/bin/software
Restart=always
[Install]
WantedBy=multi-user.target
EOF
通用包格式
Snap 包(Ubuntu)
# 安装 snapd
sudo apt install snapd
# 搜索软件
snap find nginx
# 安装软件
sudo snap install nginx
# 列出已安装
snap list
# 升级软件
sudo snap refresh nginx
# 卸载软件
sudo snap remove nginx
# 查看版本信息
snap info nginx
# 回滚到上一版本
sudo snap revert nginx
# 查看日志
snap logs nginx
Flatpak 包
# 安装 flatpak
sudo apt install flatpak
# 添加仓库
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
# 搜索软件
flatpak search nginx
# 安装软件
flatpak install flathub org.example.App
# 列出已安装
flatpak list
# 运行软件
flatpak run org.example.App
# 卸载软件
flatpak uninstall org.example.App
# 更新所有软件
flatpak update
AppImage
# 下载 AppImage
wget https://example.com/app.AppImage
# 添加执行权限
chmod +x app.AppImage
# 运行
./app.AppImage
# 集成到系统(可选)
./app.AppImage --appimage-extract-and-run --install
软件源管理
更换国内镜像
Ubuntu/Debian
# 备份原配置
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 使用阿里云镜像(Ubuntu 20.04 focal)
sudo tee /etc/apt/sources.list << 'EOF'
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
EOF
# 更新缓存
sudo apt update
CentOS/RHEL
# 备份原配置
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
# 使用阿里云镜像(CentOS 7)
sudo tee /etc/yum.repos.d/CentOS-Base.repo << 'EOF'
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
EOF
# 清理缓存
sudo yum clean all
sudo yum makecache
添加第三方源
Ubuntu PPA
# 添加 PPA
sudo add-apt-repository ppa:nginx/stable
# 手动添加 PPA
sudo tee /etc/apt/sources.list.d/nginx.list << EOF
deb http://ppa.launchpad.net/nginx/stable/ubuntu focal main
EOF
# 导入 GPG 密钥
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABC123
# 更新缓存
sudo apt update
CentOS EPEL 源
# 安装 EPEL 源
sudo yum install epel-release
# 或手动安装
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# 验证
yum repolist | grep epel
创建本地源
# 1. 创建目录
sudo mkdir -p /opt/localrepo
# 2. 复制 rpm 包
cp *.rpm /opt/localrepo/
# 3. 创建元数据
cd /opt/localrepo
createrepo .
# 4. 配置仓库
sudo tee /etc/yum.repos.d/local.repo << EOF
[local]
name=Local Repository
baseurl=file:///opt/localrepo
gpgcheck=0
enabled=1
EOF
# 5. 刷新缓存
sudo yum makecache
依赖问题解决
常见依赖错误
# 错误 1:未满足依赖
# Error: Package: nginx-1.18.0 requires openssl >= 1.1.0
# 解决:安装依赖
sudo apt install openssl
# 或
sudo yum install openssl
# 错误 2:版本冲突
# Error: Package: nginx-1.18.0 conflicts with nginx-old
# 解决:卸载冲突包
sudo apt remove nginx-old
# 或
sudo yum remove nginx-old
# 错误 3:GPG 密钥验证失败
# Error: GPG check FAILED
# 解决:导入密钥
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# 或跳过验证(不推荐)
sudo rpm -ivh --nodeps --force package.rpm
依赖查询工具
# Debian/Ubuntu
apt depends nginx # 查看依赖
apt-cache depends nginx # 旧版命令
apt-cache showpkg nginx # 查看包关系
# CentOS/RHEL
yum deplist nginx # 查看依赖
rpm -qR nginx # 查询所需依赖
rpm -q --whatrequires openssl # 查询哪些包依赖 openssl
# 通用
ldd /usr/bin/nginx # 查看动态库依赖
强制安装(慎用)
# dpkg 强制安装
sudo dpkg -i --force-depends package.deb
# rpm 强制安装(忽略依赖)
sudo rpm -ivh --nodeps package.rpm
# yum 跳过依赖
sudo yum install --skip-broken package
# dnf 跳过依赖
sudo dnf install --skip-broken package
实战案例
案例 1:部署 LAMP 环境(Ubuntu)
# 1. 更新软件源
sudo apt update
# 2. 安装 Apache
sudo apt install apache2 -y
# 3. 安装 MySQL
sudo apt install mysql-server -y
sudo mysql_secure_installation
# 4. 安装 PHP 及扩展
sudo apt install php libapache2-mod-php php-mysql -y
sudo apt install php-curl php-gd php-mbstring php-xml php-xmlrpc -y
# 5. 验证安装
sudo systemctl status apache2
sudo systemctl status mysql
php -v
# 6. 创建测试页面
sudo tee /var/www/html/info.php << EOF
<?php
phpinfo();
?>
EOF
# 7. 设置权限
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html
案例 2:部署 Docker(CentOS 7)
# 1. 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2. 安装 yum 工具包
sudo yum install -y yum-utils
# 3. 添加 Docker 仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 4. 安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io -y
# 5. 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker
# 6. 验证安装
docker --version
docker run hello-world
# 7. 添加用户到 docker 组(免 sudo)
sudo usermod -aG docker $USER
newgrp docker
案例 3:编译安装 Nginx
# 1. 安装依赖
sudo yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 2. 下载源码
cd /usr/local/src
wget http://nginx.org/download/nginx-1.20.0.tar.gz
tar -xzvf nginx-1.20.0.tar.gz
cd nginx-1.20.0
# 3. 配置编译选项
./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_gzip_static_module
# 4. 编译安装
make -j$(nproc)
sudo make install
# 5. 创建 systemd 服务
sudo tee /etc/systemd/system/nginx.service << EOF
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
# 6. 启动服务
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
# 7. 验证
curl -I http://localhost
案例 4:多版本共存管理
# 场景:同时安装 Python 3.8 和 3.10
# 1. 添加 deadsnakes PPA(Ubuntu)
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
# 2. 安装多版本
sudo apt install python3.8 python3.8-venv python3.8-dev
sudo apt install python3.10 python3.10-venv python3.10-dev
# 3. 使用 update-alternatives 管理
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2
# 4. 选择默认版本
sudo update-alternatives --config python3
# 5. 直接调用特定版本
python3.8 --version
python3.10 --version
# 6. 使用 pyenv 管理(推荐)
curl https://pyenv.run | bash
# 添加 ~/.bashrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
# 安装版本
pyenv install 3.8.10
pyenv install 3.10.4
# 设置全局/局部版本
pyenv global 3.10.4
pyenv local 3.8.10 # 当前目录
案例 5:离线安装软件
# 场景:内网服务器安装软件
# 1. 在有网机器下载包
# Debian/Ubuntu
apt-get download nginx
apt-get download $(apt-cache depends nginx | grep Depends | sed "s/.*ends://")
# CentOS/RHEL
yumdownloader --resolve nginx
# 2. 打包复制
tar -czvf nginx-offline.tar.gz *.deb
# 或
tar -czvf nginx-offline.tar.gz *.rpm
scp nginx-offline.tar.gz offline-server:/tmp/
# 3. 离线安装
# Debian/Ubuntu
tar -xzvf nginx-offline.tar.gz
sudo dpkg -i *.deb
# CentOS/RHEL
tar -xzvf nginx-offline.tar.gz
sudo rpm -ivh *.rpm
# 或
sudo yum localinstall *.rpm
# 4. 创建本地源(推荐)
mkdir /opt/offline-repo
cp *.rpm /opt/offline-repo/
cd /opt/offline-repo
createrepo .
# 配置仓库
sudo tee /etc/yum.repos.d/offline.repo << EOF
[offline]
name=Offline Repository
baseurl=file:///opt/offline-repo
gpgcheck=0
enabled=1
EOF
避坑指南
坑 1:升级导致服务不可用
# ❌ 错误:直接升级所有包
sudo apt upgrade -y
# 结果:Nginx 配置不兼容,服务挂了
# ✅ 正确:先测试
sudo apt upgrade --dry-run
# 查看变更
apt list --upgradable
# 备份配置
sudo cp -r /etc/nginx /etc/nginx.bak
# 再升级
sudo apt upgrade -y
# 验证服务
sudo systemctl status nginx
坑 2:第三方源冲突
# ❌ 错误:添加多个冲突源
add-apt-repository ppa:nginx/stable
add-apt-repository ppa:nginx/development
# 结果:版本冲突
# ✅ 正确:使用 pinning
sudo tee /etc/apt/preferences.d/nginx << EOF
Package: nginx*
Pin: release o=LP-PPA-nginx-stable
Pin-Priority: 1001
EOF
坑 3:忽略安全更新
# ❌ 错误:禁用安全更新
# /etc/apt/sources.list 注释掉 security 行
# ✅ 正确:优先安全更新
sudo apt update
sudo apt upgrade -y
# 或只安装安全更新
sudo apt upgrade -y --security
坑 4:源码安装后无法卸载
# ❌ 错误:直接 make install
make install
# 结果:不知道装了哪些文件
# ✅ 正确:使用 checkinstall
sudo checkinstall
# 生成 deb/rpm 包,可追踪管理
坑 5:依赖地狱
# ❌ 错误:强制安装忽略依赖
sudo rpm -ivh --nodeps package.rpm
# 结果:程序运行时报错
# ✅ 正确:解决根本问题
# 1. 查看缺失依赖
rpm -qpR package.rpm
# 2. 安装依赖
sudo yum install missing-dep
# 3. 再安装
sudo rpm -ivh package.rpm
坑 6:清理缓存误删
# ❌ 错误:清理整个缓存
sudo apt clean
# 结果:重新安装要重新下载
# ✅ 正确:清理旧版本
sudo apt autoclean
# 或保留当前版本
sudo apt clean && sudo apt update
练习题
基础题
进阶题
- 6. 编译安装 Nginx 1.20,启用 SSL 模块
答案
# 1
sudo apt update && sudo apt upgrade -y
# 或
sudo yum update -y
# 2
sudo apt install nginx -y
nginx -v
# 3
sudo apt remove nginx
# 或彻底删除
sudo apt purge nginx
# 4
apt search mysql
# 或
yum search mysql
# 5
sudo yum install epel-release -y
sudo yum install htop -y
# 6
# 见案例 3
# 7
# 使用 apt pinning 或 yum versionlock
sudo yum install yum-plugin-versionlock
sudo yum versionlock add package
# 8
# 见创建本地源章节
命令速查表
| | |
|---|
| apt update | yum makecache |
| apt upgrade | yum update |
| apt install pkg | yum install pkg |
| apt remove pkg | yum remove pkg |
| apt search pkg | yum search pkg |
| apt show pkg | yum info pkg |
| apt clean | yum clean all |
| apt history | yum history |
| dpkg -i pkg.deb | rpm -ivh pkg.rpm |
| dpkg -S file | rpm -qf file |