Linux软件包查询命令速查:Debian系与RPM系对比 说到Linux软件包查询这里头的门道不少。Debian系和RPM系作为两大主流阵营命令长得不像干的事儿却差不多。我在日常运维和折腾宿主机、容器的过程中这两套体系几乎每天都要碰。遇到“查一个包装没装”“某个文件是被谁放进去的”“想装个软件但不知道确切包名”这类问题命令用熟了五分钟就能定位用不熟就得去翻文档、试安装效率差很多。这篇就集中梳理一下两套体系的查询类命令把用法、原理和一些排查思路一起写清楚给同样要跨体系干活的朋友当一份速查参考。这篇内容适合刚接触Linux的读者也适合偶尔要在Debian系和RPM系之间切换操作的运维或开发。我尽量把自己实际踩过的坑和经验教训都搭进去废话不多说直接开整。1. 两套体系一台机器里的“仓库管理员”1.1 包格式与包管理器的“分家”Debian系包括Ubuntu、Deepin等用的是.deb格式的软件包底层工具是dpkg前端是apt全家桶RPM系包括RHEL、CentOS、Fedora、openSUSE等用的是.rpm格式底层工具是rpm前端是yum或dnf。两套体系各自发展了几十年格式不互通包管理器的设计理念也有差异这就导致了命令满天飞的局面。这两套体系有点像一个公司里两个不互通的仓库。.deb仓库有自己的台账dpkg数据库.rpm仓库也有自己的台账rpm数据库。你要查货就得按各自的规矩来。跨体系的时候最忌讳凭感觉乱敲命令比如在Debian上敲rpm -qa大概率直接得到“command not found”反过来在CentOS上用apt list --installed也一样不好使。但底层逻辑是相通的都是通过一个本地数据库记录当前系统已安装的软件包、文件清单、依赖关系。查询命令就是读取数据库并格式化输出。理解了这一点你会发现两套命令其实是一一对应的只是参数和语法不同而已。1.2 包数据库查询命令的地基Debian系的本地数据库在/var/lib/dpkg/目录下主要的文件是status和available。dpkg -l就是读取这些文件把每个包的状态已安装、未安装、残留配置等和描述信息列出来。RPM系的数据库在/var/lib/rpm/目录下是一组Berkeley DB老版本或SQLite新版本文件rpm -qa直接读这堆数据库文件。这个区别带来一个实际影响Debian系的dpkg -l输出里包含包的中文简介而RPM系rpm -qa默认只输出包名和版本号。所以同样问“系统里有什么”两边给你的信息详细程度是不一样的。排障的时候如果发现dpkg -l卡住多半是/var/lib/dpkg目录里的文件权限或完整性出问题不要一味重启先看看这个仓库台账能不能读。1.3 查询命令全家福一张表看懂对应关系查询需求Debian系命令RPM系命令列出所有已安装包dpkg -lrpm -qa查看单个包详细信息dpkg -s 包名rpm -qi 包名查看某个包安装了哪些文件dpkg -L 包名rpm -ql 包名查找文件属于哪个包dpkg -S 文件路径rpm -qf 文件路径按关键词搜索软件包仓库apt-cache search 关键词yum search 关键词或dnf search 关键词查看仓库中包的版本信息apt-cache policy 包名yum info 包名或dnf list 包名这张表是全文的“地图”后面每一节都会展开讲怎么用、输出长什么样、有哪些陷阱。建议先收藏后面配着实操命令看。2. 列出已安装包从数字到细节2.1 最基础的列表命令怎么用在Debian系上dpkg -l是最简单直观的已安装包列表命令。不加任何参数时它的输出带一个两字符状态列比如ii表示已经安装并且配置完成un表示从未安装rc表示包已经被删掉但配置文件还留在系统里。状态列看得懂这个命令才算真正会用。dpkg -l输出会很长因为系统里通常有上千个包。我一般不会直接盯着屏幕看而是配合less分页浏览或者用wc -l统计数量dpkg -l | wc -l不过要注意dpkg -l输出的表头也算行数实际包数量要减掉几行。如果只想看真实安装数量用grep -c ^ii更干净dpkg -l | grep -c ^iiRPM系这边列出所有已安装包的命令是rpm -qa输出格式是“包名-版本号-发行版本号.架构”比如vim-enhanced-8.2.4325-1.el8.x86_64。这个格式的好处是信息全坏处是和Debian系的“状态列包名描述”风格完全不同。rpm -qa统计数量用rpm -qa | wc -lRPM系还有个很实用的细节rpm -qa可以和sort配合按字典序排列方便肉眼查找rpm -qa | sort在实际操作中我发现很多人在两台机器上对比“是否装了同一个包”时习惯用一条命令生成文件再对比dpkg -l /tmp/debian_pkg_list.txt rpm -qa /tmp/rpm_pkg_list.txt这种做法在批量巡检时很常见。注意Debian系生成的文件包含状态列和表头最好先用grep ^ii过滤后再存文件否则后面做diff时容易误报。2.2 按关键字筛选已安装包直接列出所有包意义有限日常用得最多的是“按关键词过滤”。Debian系常用的是dpkg -l | grep nginxRPM系对应rpm -qa | grep nginx这俩本质上都是把列表输出交给grep所以掌握grep的正则过滤就更精准。比如我想看系统里所有python版本的包可以这样rpm -qa | grep -E ^python[0-9]?Debian系也可以用类似方式dpkg -l | grep -E ^ii\spython这里要注意Debian系dpkg -l输出的包名前面有状态列和空格因此grep的模式要么带^ii开头要么用grep -E python宽松匹配。直接grep ^python往往什么都搜不到因为行首是状态列。假如你明确知道包名的前缀Debian系还有一个更清爽的语法dpkg -l python*直接传给dpkg -l做模式匹配支持通配符。RPM系没有直接对应的等价参数还是要靠rpm -qa | grep。2.3 为什么“已安装列表”不是万能的列表命令能告诉我们“装了什么”但不会告诉我们“这个包什么时候装的”“从哪个安装源装的”“哪个包是系统基础依赖、哪个是用户手动装的”。想查这些信息就要用别的命令。比如Debian系手动安装的包可以通过apt-mark showmanual列出来RPM系的yumdb如果启用可以记录更多元数据。这块虽然不算典型的“查询命令”但用熟了以后对系统审计特别有用。举个例子你接手一台新机器想快速知道哪些包是之前操作的人类手动装过而非依赖连带的apt-mark showmanual的输出就非常有价值。Deiban系里apt-mark showmanual是查看手动安装的包而RPM系没有直接对应的命令但可以通过yum history和dnf history看事务记录。不过rpm -qa和dnf list installed在多数场景下已经够用。这也提醒我们一个查询需求往往不能靠一个命令解决要把命令组合起来用。3. 包信息与文件归属一个命令定位根源3.1 查看单个包详细信息dpkg -s / rpm -qi知道包名之后想确认描述、版本、依赖、安装大小、维护者信息dpkg -s和rpm -qi是正主。dpkg -s openssh-server重点看Status字段如果显示install ok installed就表示正常安装。Installed-Size的单位是KiB这里容易踩坑一个显示4036的包实际是4MB左右而不是4KB。再看RPM系rpm -qi openssh-serverrpm -qi输出没有Status字段因为rpm -qa能列出来就表示已经装了。rpm -qi里的Size单位是字节和Debian系的KiB不同。对比的时候不要被数字吓到。Install Time这个字段在RPM系里很有用——它能显示包确切的安装时间这在排查“这台机器到底什么时候被动过”时能派上大用处。举个例子我排查过一个线上机器CPU异常升高的问题最终怀疑某个系统包被替换过版本是用rpm -qi看安装时间和版本号才确认的。假如没这个命令只能靠日志去猜。3.2 模糊查找搜索名字和描述大多数时候我们只知道一个软件的中文名或模糊的功能描述不记得确切包名。比如想在Debian上找输入法就搜input或者fcitx。Debian系用apt-cache search 输入法这个命令默认会搜索软件包的名字和描述返回一个包含包名和简短说明的清单。apt-cache search虽然好用但搜索的关键词要尽量准确太宽泛会返回几百条结果。我自己的习惯是先搜一个更描述性的词比如想搜“中文分词库”会先搜chinese tokenizer命中的包名再去apt show核对。RPM系对应的是yum search 输入法或者新版用dnf search 输入法输出格式基本等同apt-cache只是搜索范围和仓库存量不同。另外RPM系还有一个古老但依然有效的搜索方式dnf list available | grep 关键词这种方式搜的是包列表而非描述胜在快缺点是搜不到描述里出现的词。如果你确实要搜描述区域dnf search all会更全面。模糊查找的逻辑其实都是“仓库元数据检索”。Debian系的apt-file也能搜文件名RPM系有dnf provides或yum provides。这类“根据文件路径找包”的需求下一节细讲。3.3 文件归属查询从路径到包的逆向定位排障时经常会碰到“系统中某个文件不知道是哪个包带来的”或“某个命令找不到对应的包”。这时需要逆向查询从文件路径反查包名。Debian系用dpkg -Sdpkg -S /usr/bin/nginx输出会告诉你这个文件属于哪个包。RPM系用rpm -qfrpm -qf /usr/bin/nginx注意rpm -qf的参数必须是已存在的文件路径否则会报not owned by any package。Debian系的dpkg -S如果文件不属于任何包也会输出很明确的信息。这个功能在排查“二进制文件到底装哪去了”时特别有用。比如你想知道vim命令是系统自带的还是后来装的先查which vim得到路径然后which vim dpkg -S $(which vim)RPM系换成which vim rpm -qf $(which vim)组合拳打出来一下子就能定位包名再结合dpkg -L或rpm -ql查看包的完整文件清单dpkg -L vim-tiny rpm -ql vim-enhancedrpm -ql输出的是该包在系统上安装的所有文件路径这对判断“包能不能删”很有参考价值。比如你想卸载一个包可又担心它带走了系统依赖的库文件先看rpm -ql列出文件清单再对比是否还有别的包依赖能省不少心。4. 实战场景把查询命令串起来4.1 场景一验证“rpm 安装 MySQL”到底成没成很多人在CentOS上手动下载MySQL的RPM包安装装完之后不确定是否成功或者想确认安装的版本和文件路路径。检查步骤一般分三步第一步查包是否在已安装列表里rpm -qa | grep -i mysql如果输出包含mysql-server或者mysql-community-server之类说明包已装。什么输出都没有就说明没装上。RPM包的安装是会写数据库的查询一无所获基本可以断定安装过程失败或装到了别的机器上。第二步确认具体包名和版本信息rpm -qa | grep -i mysql | xargs rpm -qi用xargs把上一步列出的包名传给rpm -qi一次性看所有相关包的详细信息。这里要小心grep搜出来多个包名xargs会逐条执行输出会很长建议加| less慢慢看。第三步查服务文件和可执行文件位置rpm -ql mysql-server看输出里有没有/usr/sbin/mysqld和/etc/my.cnf这类关键文件。如果只有配置文件没有服务脚本多半是安装版本较新用systemd管理可以用systemctl status mysqld确认。这里顺带提醒如果连rpm这个命令本身都找不到那就是没有安装RPM工具这在CentOS上极少见因为yum或dnf本身依赖rpm。真遇到这种场景先检查PATH环境变量是否被改过再考虑重新安装rpm包不要一上来就删库重建。4.2 场景二Debian 13 Trixie 换清华源后的软件包排查Debian 13的代号是Trixie很多用户拿到新系统第一件事就是换国内镜像源。把/etc/apt/sources.list改成清华源或中科大源之后执行apt update可能会出现GPG签名相关的报错。我见过一个经典的报错类型是W: GPG error: http://mirrors.ustc.edu.cn/debian trixie InRelease: The following signatures couldnt be verified because the public key is not available看到这类报错先不要急着加--allow-unauthenticated参数那等于把包管理的安全验证整个关掉风险很大。正确思路是用查询命令确认当前源的配置状态。排查步骤通常是cat /etc/apt/sources.list apt-cache policy apt-get update 21 | grep -A2 GPG errorapt-cache policy会显示各仓库的优先级和候选版本能帮你看清楚当前系统正在从哪些源获取包。结合报错信息里的key id再用apt-key list查看本地已有的公钥有哪些。新版Debian更推荐把公钥文件放到/etc/apt/trusted.gpg.d/目录而不是直接apt-key add因为apt-key在新版软件包管理中属于弃用状态。这里还有个排查思路如果你怀疑某个包因为换源之后版本不匹配可以用apt-cache policy 包名看候选版本是从哪个仓库来的apt-cache policy nano输出会列出Candidate、Version table以及对应的仓库源。我在实际运维中遇到过一次莫名其妙的包版本异常最终就是用apt-cache policy发现系统从旧的第三方源拉到了旧版本包把这个源注释掉才解决。4.3 场景三WSL 2 里 Debian 与输入法/中文化的包查询在WSL 2里装Debian的用户经常会遇到输入法问题。很多人的诉求是安装中文输入法却不知道应该装哪一组包。这种情况下模糊查找命令就派上用场了apt-cache search fcitx本来在WSL环境里图形界面和输入法框架的支持比较微妙但用查询命令确认包名这件事逻辑一样。apt-cache search fcitx会列出fcitx5、fcitx5-chinese-addons、fcitx5-config-qt等选项。搜狗输入法在Debian上并不是官方仓库包需要从官网下载deb安装包。下载后可以用dpkg -I 搜狗输入法安装包.deb这条命令不需要安装就能查看deb包的元信息包括包名、版本、依赖。这个-I参数很容易被忽略但排错时非常有用。拿到deb文件先看依赖再决定是否安装比直接dpkg -i然后被依赖问题卡住要稳妥得多。5. 常见问题与排查技巧实录5.1 “没找到 rpm 命令”怎么办这个问题在某些精简版容器镜像或极简安装的系统中真的会发生。命令行敲rpm -qa系统回复bash: rpm: command not found。原因通常是基础镜像没有装rpm工具甚至连包管理器的数据库都没有初始化。解决办法分两步先确认系统的包管理器是什么which yum which dnf如果有dnf或yum可以先用它们安装rpmyum install -y rpm或者dnf install -y rpm如果连yum都没有那可能是基于其他体系或者精简到不能再精简的系统需要从系统光盘手动挂载rpm包来装。不过绝大多数标准发行版都不会走到这一步。真遇到这个问题先别急用cat /etc/os-release确认发行版再对症下药。5.2 “a 未出现在 sudoers 文件中”与包管理无关但要懂有台Debian机器上输入命令时提示a 未出现在 sudoers 文件中说明当前用户不在sudo授权列表里。这和软件包查询没有直接关系但不熟悉包管理的人很容易误删文件或装错包来试图修复。正确的处理方式是先用su - root切换到root或让管理员把用户加入sudo组usermod -aG sudo 用户名修改完成后重新登录即可。在Debian系中sudo包的安装与否也可以用查询命令确认dpkg -l sudo如果提示no packages found或状态列不是ii说明系统里根本没装sudo那就先装apt install sudo这个场景提醒我们查询命令不仅用于查软件也可以用于确认系统基础组件的状态排障时思路要开阔。5.3 查询结果里的乱码与编码问题不少人在Debian系执行dpkg -l或RPM系执行dnf search时遇到中文描述显示成乱码。这个现象通常和当前终端的locale环境有关。快速验证方法echo $LANG如果输出不是zh_CN.UTF-8之类包管理器可能不会输出中文字符串。临时解决的方法很简单LANGC dpkg -l这样强制用英文输出虽然不是翻译但至少不乱码。想彻底支持中文需要配置localedpkg-reconfigure locales这个细节看着不起眼但我在写自动化脚本抓取包列表时踩过坑脚本跑在LANG不是UTF-8的终端里解析中文描述直接崩。后来在脚本最前面统一export LANGC.UTF-8才稳定。5.4 双体系命令速查表建议存一份最后把高频查询需求整理成速查表方便直接对照使用查询需求Debian系RPM系列出所有已安装包dpkg -lrpm -qa精确过滤已安装包dpkg -l | grep 关键词rpm -qa | grep 关键词包名带通配符过滤dpkg -l nginx*rpm -qa nginx*查看单个包信息dpkg -s 包名rpm -qi 包名列出包内文件dpkg -L 包名rpm -ql 包名反查文件属于哪个包dpkg -S 路径rpm -qf 路径按关键词搜仓库apt-cache search 关键词dnf search 关键词查看包候选版本和来源apt-cache policy 包名dnf list 包名查看是否有包可用含仓库apt-cache show 包名dnf info 包名这张表覆盖了日常80%的查询需求。剩下的20%需要靠组合命令去解决比如先dpkg -l | grep找到包名再dpkg -s看详细最后dpkg -L确认文件路径。我在实际使用中还有一个习惯写完一条查询命令后如果输出很长不要急着看全部先| head或| tail截取开头结尾确认命令本身没有报错再决定要不要完整浏览。这个小习惯帮我及时发现不少拼写错误和数据库损坏的问题。另外要说一点软件包查询命令虽然看着基础但它们几乎是所有高级自动化脚本的底层依赖。无论你是写批量主机巡检脚本还是做配置管理工具第一步往往都是“查一下目标机器上有没有装某个包、装的是哪个版本”。把这套命令记牢了后面写什么都顺手。就我个人来说最耗时的排查往往不是定位到有没有这个包而是确认包版本和依赖关系是否满足需求。如果一个包安装后总有诡异行为用dpkg -s或rpm -qi仔细比对版本和打包时间经常能发现装错了来源。这些都是我反复试错后的体会。跨体系干活记住一个总原则先确认自己站在哪个发行版的地盘上再选择合适的包管理命令保持dpkg/rpm底层查询与apt/dnf前端查询的互相印证就不会出大问题。