Linux包管理查询命令对照:dpkg/apt与rpm/yum/dnf实战

发布时间:2026/10/6 12:45:42
Linux包管理查询命令对照:dpkg/apt与rpm/yum/dnf实战
我刚从 Ubuntu 跳到 CentOS 那会儿被包管理命令折腾得够呛。在 Debian 系敲习惯了dpkg -l和apt-cache search到了 RPM 系发现rpm -qa、dnf search完全是另一套管法而且两套东西在脑子里还会串台。后来我把这两大体系拆成“底层工具 前端工具”两个层面去记再遇到换发行版、迁移服务器、排查缺依赖这类事基本就是先跑几条查询命令摸个底十分钟内就能定位问题。这篇内容聚焦查询类命令列出已安装包、查看包信息、模糊查找、文件反查归属这几个最高频的操作把 Debian 系包括 Debian 本身和 Ubuntu 等衍生发行版的dpkg/apt与 RPM 系RHEL、CentOS、Fedora、Rocky Linux、AlmaLinux 等的rpm/yum/dnf对照着讲清楚。适合刚接触 Linux 的运维新人也适合常年只待在一个体系里、偶尔需要跨体系支援的老手——查询命令基本都是只读操作放心敲不会把系统搞坏。1. 两套体系查询命令的底层分工dpkg/apt 与 rpm/yum 为何长着两副面孔1.1 底层工具与前端工具查询命令必须分清的两层Linux 发行版再多包管理路线基本就是两大派一套用.deb包代表是 Debian、Ubuntu、Deepin、Linux Mint另一套用.rpm包代表是 Red Hat、CentOS、Fedora、Rocky、Alma、openSUSE。形象点说.deb和.rpm就像两种不同的“货物打包标准”而管理它们的工具链又各自分了两层。Debian 系的底层是dpkg它只负责操作单个本地.deb包文件能装、能卸、能查但不负责“从网上找包”和“自动拉依赖”。在这些脏活累活之上站着apt以及它的前身apt-get它负责读取软件源列表、生成本地索引、解析依赖关系。所以你平时敲apt install xxx它先算依赖再调dpkg干活。RPM 系的结构完全同构。底层是rpm只管单个.rpm包上面的yum和dnf负责仓库、依赖解析和更友好的搜索。dnf是yum的下一代RHEL 8、Fedora 之后默认都是dnfCentOS 7 及更早用yum新系统里yum多半只是指向dnf的软链接。理解这个分层查询命令就不会乱dpkg和rpm查的是“本机已经装了什么、某个文件是谁装的”apt和yum/dnf查的是“软件源里有什么、某个关键词能搜出什么包”。举例来说dpkg -l nginx想确认 nginx 是否已安装而apt-cache search nginx是去仓库索引里搜所有名字或描述里带 nginx 的候选包两者目的完全不同。1.2 一眼看穿两套语法-q 与自述式子命令RPM 系的查询命令高度集中在rpm -q这一组参数上后面跟什么字母就代表查什么维度-a查全部、-i查信息、-l查文件列表、-f反查文件归属。参数本身长得像“选项组合”记起来是一条线。Debian 系的dpkg则更接近“动词加宾语”的架势-l是 list-s是 status-L是 list files-S是 search file。大写和小写含义不同刚接触的人容易把-l和-L搞混这个后面细说。再往上层的apt、yum、dnf都是用子命令的方式比如apt search、dnf list风格反而统一。所以我的记忆线索是底层命令看参数组合前端命令看子命令。你只要先分清当前系统是哪条路线再判断想查的是“本机事实”还是“仓库候选”命令自然就能定位到正确的工具上。2. Debian 系查询实操dpkg 本地命令与 apt 仓库命令2.1 dpkg 四板斧列包、看信息、看文件、反查归属平常排查问题dpkg这四个命令我用得最多。第一板斧是dpkg -l列出所有已知软件包。注意“已知”这个词——它不仅列已安装的还把删除过但留了配置文件的、甚至安装一半的包都列出来。第一列是两个字母的状态标记ii代表正常安装rc代表包已移除但配置文件残留在系统里un代表未安装。所以想看真正装好的包dpkg -l | grep nginx出来的结果如果第一列是ii才是踏踏实实装着的。dpkg -l | head -20 dpkg -l | grep nginx第二板斧是dpkg -s 包名查看一个已安装包的详细信息包括版本号、依赖关系、安装大小、维护者、描述等。这是确认“当前系统装的是哪个版本、它依赖了什么库”的最直接方式。dpkg -s nginx # 只看版本 dpkg -s nginx | grep ^Version第三板斧是dpkg -L 包名列出这个包安装后往系统里放了哪些文件。每次想知道“这个软件装在哪个目录、二进制在哪儿、配置文件在哪儿”就用它。比如查 nginx 的配置文件路径dpkg -L nginx | grep etc一下就出来了。dpkg -L nginx第四板斧是dpkg -S 完整路径反查“这个文件是哪个包提供的”。这是逆向排查的神器。你在which找不到某个二进制、或者程序报缺少某个文件时用完整路径去反查归属即可。注意dpkg -S要求给绝对路径只给文件名或相对路径会直接报错这是新手最容易踩的点。dpkg -S /usr/sbin/nginx # 模糊一点可以这样用通配符也不行dpkg -S 不支持通配要精确路径如果想知道某个.deb文件装完会释放哪些文件用dpkg -c xxx.deb想看这个.deb包的元信息版本、依赖用dpkg -I xxx.deb。这两条是用来检查本地安装包文件的不涉及已安装系统。2.2 apt 家族的搜索与信息查询dpkg只能查本地装了什么查不了“软件源里有什么”。这就是apt的活。最常用的模糊查找是apt-cache search 关键词它会在软件源的包名和描述里做匹配适合你只记得软件名字的一部分、不知道确切包名的时候。新写法apt search 关键词效果一样输出格式更友好一些会标出哪些包已经安装。apt-cache search netcat apt search netcat看到候选包后用apt-cache show 包名查看仓库里的详细信息里面会区分“已安装版本”和“候选版本”还能看到依赖关系、包大小、Homepage 等。apt-cache policy 包名则更直观地展示每个软件源的优先级和可供选择的版本换源之后核对版本是否生效非常有用。apt-cache show nginx apt-cache policy nginx如果想直接以“列表”的视角看已安装包可以用apt list --installed。这个命令等价于dpkg -l但输出更干净只有包名和版本不像dpkg -l还带状态标记。apt list --upgradable则列出所有可升级的包升级前摸底必用。apt list --installed | grep nginx apt list --upgradable2.3 apt-file比 dpkg -S 更好用的模糊反查dpkg -S只能反查本地已安装包还没安装的包你查不到。比如一个程序编译时报错说缺/usr/include/openssl/ssl.h但系统里并没有安装这个头文件——这时候需要知道的是“哪个软件包里包含这个文件”。dpkg -S就无能为力了因为该文件根本不在本机。Debian 系的标准答案是安装apt-file工具apt install apt-file然后apt-file update下载文件索引再用apt-file search去匹配。注意apt-file search支持模糊路径比如你只记得文件名带nvme直接apt-file search nvme就能翻出相关文件所在的包。apt install -y apt-file apt-file update apt-file search /usr/include/openssl/ssl.h apt-file search nvme这套组合拳在 Debian 系里是查依赖的终极手段配合dpkg -S先用本地、再用索引基本没有找不到归属的文件。3. RPM 系查询实操rpm 的 -q 全家桶与 yum/dnf 的 provides3.1 rpm 查询参数从 -qa 到 -qf 的完整脉络RPM 系的查询命令以rpm -q为骨架后接不同参数表示查询维度逻辑比 dpkg 更容易串成一条线。列出所有已安装包用rpm -qa。因为包数量往往很多日常都是接grep过滤rpm -qa | grep nginx只查询某一个特定的包是否已安装用rpm -q 包名。这条命令的成功输出直接就是“包名-版本号-发布号-架构”非常清晰如果没装它会明确告诉你 package 未安装。想看得更细rpm -qi显示详细信息包括安装日期、构建主机、License、描述等rpm -ql显示文件列表rpm -qc只看配置文件rpm -qd只看文档。rpm -q nginx rpm -qi nginx rpm -ql nginx反查文件归属用rpm -qf 完整路径和dpkg -S用法一致同样要绝对路径rpm -qf /usr/sbin/nginx如果手头有一个.rpm安装包文件想不安装就查看它的信息加-p参数即可。rpm -qpi xxx.rpm查看包的元信息rpm -qpl xxx.rpm查看安装后会释放哪些文件。运维同事发给你一个离线包时这个操作非常实用。rpm -qpi mysql-server-8.0.36-1.el9.x86_64.rpm rpm -qpl mysql-server-8.0.36-1.el9.x86_64.rpm3.2 yum/dnf仓库层面的模糊搜索与依赖查询rpm不带仓库感知能力不知道软件源里还能装什么要找可安装的候选包就得靠yum/dnf。模糊查找用yum search 关键词或dnf search 关键词会匹配包名和摘要。查看仓库中某个包的完整信息用yum info/dnf info它会同时显示“已安装版本”和“可用版本”这个和apt-cache show非常像。还有yum list installed/dnf list installed直接列出所有已装包加上 grep 过滤就是最常用的组合。dnf search netcat dnf info nginx dnf list installed | grep nginx dnf list available | grep nginx在 CentOS 7 等老系统上把dnf换成yum就是同一条命令语法几乎一样不用费心记两份。3.3 RPM 系反查命令归属的关键providesRPM 系反查“哪个包提供了某个文件”的核心命令是yum provides或dnf provides。这个命令比rpm -qf强大得多因为它查的是仓库索引而不是本地已安装文件。比如你敲了个nslookup提示命令不存在想装包但不知道包名叫什么dnf provides nslookup # 或者模糊匹配前面加通配 dnf provides */nslookup*/nslookup这种写法非常方便因为你通常只记得文件名而不记得完整路径。这条命令在 RPM 系里的地位等同于 Debian 系的apt-file search是我在 CentOS/Rocky 上定位缺失命令的第一选择。另一个相关命令是repoquery --whatprovides在启用dnf-utils包后可用效果类似适合写脚本用。4. 高频场景对照表同一需求在两套体系里的标准写法查询类需求翻来覆去就那么几类我把每个场景在两套体系下的标准命令直接放表格里方便日常工作直接抄查询需求Debian 系dpkg/aptRPM 系rpm/yum/dnf列出所有已安装包dpkg -l/apt list --installedrpm -qa/dnf list installed过滤某个已安装包dpkg -l | grep nginxrpm -qa | grep nginx查看包详细信息dpkg -s nginx/apt-cache show nginxrpm -qi nginx/dnf info nginx列出包释放的文件dpkg -L nginxrpm -ql nginx文件反查归属本地dpkg -S /usr/sbin/nginxrpm -qf /usr/sbin/nginx文件反查归属仓库apt-file search nginxdnf provides */nginx模糊搜索软件源apt-cache search nginx/apt search nginxdnf search nginx查看包版本候选情况apt-cache policy nginxdnf info nginx查看可升级包apt list --upgradablednf list upgrades4.1 列出已安装包与统计数量两套体系最简单的包数量统计是dpkg -l | wc -l对rpm -qa | wc -l。不过要注意dpkg -l的数量里包含rc状态的残留包统计已安装数量时最好先过滤ii状态再数否则你会惊讶于系统里“装过的东西”比想象中多。RPM 系里rpm -qa列出来的都是真实已装包没有残留状态干扰相对干净。# Debian 系真实已安装包数量 dpkg -l | grep ^ii | wc -l # RPM 系 rpm -qa | wc -l4.2 查看指定包的版本、描述与依赖确认某软件当前版本Debian 系最稳的方式是dpkg -s 包名 | grep ^VersionRPM 系直接rpm -q 包名就能显示完整版本号。如果还要看依赖关系apt-cache show和dnf info都会列出依赖列表但没有它们对应的apt-cache depends和dnf deplist那么专门化。日常“这个包为什么拉着装了这么多东西”这类问题用依赖查询命令看会更清楚。4.3 模糊查找只记得包名一部分时怎么定位模糊查找是最容易被低估的操作。很多时候用户报问题说“装个网卡驱动包”但你根本不知道包名。我的习惯是Debian 系直接apt search加几个关键词试再配合apt-cache policy看版本RPM 系就dnf search搜不到再换dnf provides的*/关键词这招因为很多包名和文件名是两码事搜包名搜不到搜文件名反而一打一个准。4.4 文件/命令反查最高频也最容易记混的操作两套体系的反查命令容易混在两点第一底层命令dpkg -S和rpm -qf都要求精确绝对路径只给文件名会失败第二仓库层面的反查在 Debian 系需要额外安装apt-file而 RPM 系dnf provides是内置的这造成“Debian 系反查仓库文件要先装工具”的隐性门槛。如果你从 RPM 系转过来很容易默认dpkg -S也能模糊搜结果报错后一头雾水。记着这一条能省不少排查时间。5. 迁移与排查中反复踩到的坑查询命令也会骗人5.1 跨体系敲错命令时的正确姿势在 Debian 系服务器上敲rpm -qa报rpm: command not found在 CentOS 上敲dpkg -l同样是 command not found。这不是系统坏了而是另一套工具链压根没装。有人会顺手apt install rpm把 RPM 工具装进 Debian 里那也仅限“读”层面可以查.rpm文件内容但绝对不要去装 RPM 包依赖体系和文件布局根本对不上。反过来也一样。所以遇到 command not found先判断当前系统属于哪一派再切换命令不要硬装对面的工具。5.2 换源之后查询结果反而不对的常见原因搜索热词里有“Debian 13 (Trixie) 换清华源”换源这个操作本身不难但有一个新版 Debian 的坑从 Debian 12 到 13apt 的源配置文件不再局限于传统/etc/apt/sources.list新格式的 deb822 文件放在/etc/apt/sources.list.d/下面文件名通常叫debian.sources。如果你只改了旧文件而新文件还在生效那apt update走的还是旧源。换完源一定要apt update重新生成索引否则apt-cache search出来的还是旧索引内容甚至因为缓存过期搜不到新包。RPM 系同理配置了阿里云或清华的 rpm 源后要跑dnf makecache重建缓存否则dnf search的数据还是旧的。这个问题用apt-cache policy或dnf repolist查看各源的优先级和状态时就能发现。5.3 索引没更新导致“搜不到任何东西”新装好的 Debian 系统如果不先apt updateapt-cache search的结果可能为空因为本地索引还没建立。很多新手以为“搜索不到就是没有这个包”其实只是没更新索引。RPM 系也类似不过dnf在search时通常会自动检查缓存如果缓存过期会提示你运行makecache。养成习惯新环境第一件事永远是先更新包索引再做一切查询否则所有搜索结果都不可信。5.4 查询结果里的状态标记rc 状态与未安装的“伪查询”dpkg -l里的rc状态是个经典误区。rc表示包被卸了但/etc下的配置残留还在。这类包不会影响运行但会占着查询结果的位置还会在某些安全扫描脚本里被识别成“已安装”造成误报。清理方式是apt purge对应包名把残留配置也一并删掉。RPM 系的rpm -qa不存在这个残留状态被删除的包就不在列表里但也有一个混淆点rpm -q 包名如果不带完整包名经常查不到因为 RPM 包名有时带后缀比如nginx-filesystem、nginx-mod-*光记一个nginx主名rpm -q nginx能查到但rpm -qa | grep会看到更多相关包。这时候dnf list installed | grep nginx列出的信息会比rpm -q更全面。最后分享一个我自己的实操习惯每次接手一台新服务器我必跑的摸底查询是三条——cat /etc/os-release先确认体系Debian 系跑apt list --upgradableRPM 系跑dnf list upgrades看系统里积压了多少安全更新再针对接下来要用的服务跑一次文件反查比如查nginx二进制归属。这套动作全是只读查询不会改任何配置但对后续所有排查工作来说相当于先画了一张“系统地图”。查询命令看着零碎真正吃透之后装包、排错、迁移很多问题都能在输入安装命令之前就预判出结果。