最安全的安装方式是直接运行 apt install;需先 sudo apt update,遇“held broken packages”查 apt-mark showhold,装本地.deb用 sudo apt install ./package.deb;centos/rhel 8+ 应用 dnf 而非 yum。

Ubuntu/Debian 用 apt install 装软件,但别乱加 --force-yes
直接运行 apt install 是最安全的安装方式,系统会自动解决依赖并提示冲突。很多人看到“unmet dependencies”就急着加 --force-yes 或 --fix-broken,结果把包管理器搞坏。
- 先运行
sudo apt update再装,否则可能找不到最新包或误装旧版 - 如果提示“held broken packages”,大概率是某个包被手动锁定了版本,查一下:
apt-mark showhold - 不要用
apt-get install混用apt install—— 前者不显示进度条和建议,后者更友好,两者底层行为基本一致,但混用容易在脚本里埋坑 - 想装本地
.deb文件?用sudo apt install ./package.deb,比dpkg -i更稳妥,它会自动补依赖
CentOS/RHEL 8+ 必须用 dnf,yum 已只是符号链接
yum 在 RHEL 8/CentOS 8+ 里只是指向 dnf 的软链,实际执行的是 dnf。但配置、插件、缓存机制都不同,老教程里写 yum-config-manager 可能报错。
- 启用 EPEL 源:先装
epel-release包,再运行sudo dnf install epel-release,不是yum install -
dnf list installed比yum list installed输出更简洁,支持模糊匹配,比如dnf list installed *nginx* - 清理缓存别只用
dnf clean all,它不删已下载的 RPM 包;要彻底清空:sudo rm -rf /var/cache/dnf/* - 升级单个包时,
dnf upgrade package-name和dnf install package-name效果一样,但后者语义更准——它会降级安装,而upgrade不会
遇到 “No package available” 别急着换源,先看仓库是否启用
常见错误不是源没配,而是对应仓库被禁用了。比如 CentOS Stream 默认关了 crb(CodeReady Builder)仓库,而很多开发工具(如 gcc-toolset-12)只在那儿。
- 查当前启用的仓库:
dnf repolist --enabled(RHEL/CentOS)或apt list --installed | grep repo(Debian/Ubuntu,但更推荐看/etc/apt/sources.list和/etc/apt/sources.list.d/下文件) - RHEL/CentOS 启用 crb:
sudo dnf config-manager --set-enabled crb - Ubuntu 启用 universe 源:
sudo add-apt-repository universe,不是所有镜像都同步 universe,阿里云源默认有,清华源需手动开 - 别盲目替换
sources.list里的域名——有些企业内网镜像只同步主仓库,不包含 backports 或 security 更新通道,换完反而装不了关键安全更新
装完软件找不到命令?检查 PATH 和二进制路径是否变化
尤其是用 dnf install 装开发工具集(如 gcc-toolset-12)或 Snap/Flatpak 包时,可执行文件往往不在 /usr/bin,也不进默认 PATH。
-
gcc-toolset-12的gcc在/opt/rh/gcc-toolset-12/root/usr/bin/gcc,得用scl enable gcc-toolset-12 -- gcc --version - Snap 安装的软件,二进制在
/snap/bin/,这个路径不一定在用户PATH里,尤其非交互式 shell(如 cron、systemd service)中会失效 - 用
which找不到?试试command -v program-name或find /usr -name program-name 2>/dev/null - 某些包(如
python3-pip)只装模块不装命令,要额外装python3-setuptools才有easy_install,但更推荐直接用pip3 install --user
包管理器不是万能钥匙,同一软件在不同发行版里可能拆成多个子包,名字还不一样。比如 libssl-dev(Debian)对应 openssl-devel(RHEL),漏装就编译失败。盯紧错误信息里的“not found”关键词,比背命令重要得多。










