apt / dpkg 包管理:装软件之前先搞清这些
服务器上装软件基本就是 apt 一条命令,但遇到「版本不对」「依赖冲突」「被锁住」时会很懵。这篇理清它们的关系。
一、apt 和 dpkg 谁管什么
| 工具 | 层级 | 能力 |
|---|---|---|
| dpkg | 底层 | 安装/卸载单个 .deb,不处理依赖 |
| apt | 上层 | 自动解析依赖、从仓库下载 |
日常用 apt,只有手里有个 .deb 文件时才用 dpkg:
sudo dpkg -i package.deb
sudo apt -f install # dpkg 报依赖缺失时,用这条补二、日常命令
sudo apt update # 只刷新索引,不升级软件
sudo apt upgrade -y # 升级已装软件(不删包)
sudo apt full-upgrade -y # 允许为了升级而删除包
sudo apt install nginx curl git -y
sudo apt install nginx=1.22.1-9 # 装指定版本
sudo apt remove nginx # 卸载,保留配置
sudo apt purge nginx # 卸载,连配置一起删
sudo apt autoremove -y # 清理不再需要的依赖
sudo apt clean # 清下载缓存查询类:
apt search nginx
apt show nginx # 版本、依赖、描述
apt list --installed | grep nginx
apt list --upgradable # 可升级的
apt-cache policy nginx # 看候选版本来自哪个源
dpkg -l | grep nginx
dpkg -L nginx # 这个包装了哪些文件
dpkg -S /usr/sbin/nginx # 这个文件属于哪个包
dpkg -S特别有用:想知道某个命令是哪个包提供的,用它一查就知道。
三、sources.list 的结构
Debian 12(bookworm)的标准写法:
cat /etc/apt/sources.listdeb https://deb.debian.org/debian bookworm main contrib non-free
deb https://deb.debian.org/debian bookworm-updates main contrib non-free
deb https://security.debian.org/debian-security bookworm-security main每一段的意思:
deb <地址> <发行版代号> <组件...>
# ↑ ↑ ↑
# 仓库URL bookworm main=官方自由软件
# contrib=依赖非自由软件的包
# non-free=非自由软件(驱动等)现代 Debian 也用 deb822 格式(/etc/apt/sources.list.d/debian.sources),字段是 Types: URIs: Suites: Components:,本质一样。
第三方源统一放 /etc/apt/sources.list.d/xxx.list,不要直接改主文件。
四、加源的正确流程
# 1. 导入 GPG 公钥(现在推荐放 keyrings 目录)
curl -fsSL https://example.com/gpg.key \
| sudo gpg --dearmor -o /usr/share/keyrings/example.gpg
# 2. 写源文件,用 signed-by 指定密钥
echo "deb [signed-by=/usr/share/keyrings/example.gpg] https://example.com/apt stable main" \
| sudo tee /etc/apt/sources.list.d/example.list
sudo apt update老教程里的
apt-key add已经废弃(它把密钥加进全局信任,任何源都能用)。改用signed-by只信任指定源。
五、锁定版本,别乱升级
生产环境有时不想让某个包自动升级:
sudo apt-mark hold nginx # 锁定
sudo apt-mark unhold nginx # 解锁
sudo apt-mark showhold # 看锁了哪些六、常见错误处理
Could not get lock
# 有另一个 apt 在跑(比如自动更新)
sudo lsof /var/lib/dpkg/lock-frontend
ps aux | grep -E "apt|dpkg"
# 确认没有真在跑的进程后,才删锁
sudo rm -f /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock
sudo dpkg --configure -a依赖关系损坏
sudo apt -f install
sudo dpkg --configure -a
sudo apt --fix-broken install找不到包 / NO_PUBKEY
sudo apt update 2>&1 | grep -i "no_pubkey"
# 按提示的 KEY ID 导入:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <KEY>磁盘满了
df -h
sudo apt clean # 清 /var/cache/apt/archives
sudo journalctl --vacuum-size=200M
du -sh /var/cache/apt /var/log七、一次标准的新机软件安装
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget git vim htop tmux \
unzip rsync jq ncdu mtr btop fail2ban ufw
sudo apt autoremove -y && sudo apt clean包管理本身不难,难的是「出问题时知道该用哪条命令」。把上面那几张表存下来就够了。
