最可靠方式是用apt-cache dotty --no-recommends nginx > nginx.dot && dot -Tpng nginx.dot -o nginx-deps.png,需先sudo apt install graphviz并确保apt update已执行,箭头方向为“被依赖→依赖者”。

怎么用 graphviz 生成软件包依赖图(Debian/Ubuntu)
直接生成 PNG 图谱最可靠的方式是 apt-cache dotty + dot,但必须注意它只对 APT 源中已知包有效,且不处理本地 deb 或冲突状态。
-
apt-cache dotty nginx > nginx.dot会输出 DOT 格式文本,包含所有递归Depends、Recommends和Suggests—— 但默认也含推荐项,容易干扰主线依赖,加--no-recommends更干净 -
dot -Tpng nginx.dot -o nginx-deps.png转图;若报错“Command 'dot' not found”,先sudo apt install graphviz - 生成的图里箭头方向是「被依赖 → 依赖者」,即
nginx → libssl1.1表示 nginx 依赖 libssl1.1,别看反 - 如果
apt-cache dotty报错 “Package nginx is not available”,说明包名拼错或源未更新,先apt update再试
dnf repoquery 怎么导出依赖树再画图(RHEL/Fedora)
dnf repoquery 本身不输出 DOT,但可配合脚本转成图谱,比 rpm 工具更准——它走的是真实仓库解析逻辑,不是静态元数据。
- 先确认包存在:
dnf list available nginx,避免查一个根本不存在的包名 - 导出一级依赖:
dnf repoquery --requires --qf "%{name}" nginx;加--recursive会递归展开,但可能爆炸式增长,慎用 - 想画图?写个简单 Bash 脚本把输出转成 DOT:循环调用
dnf repoquery --requires --qf "%{name} -> %s" $pkg,再用dot渲染;别硬记语法,复制现成 gist 更省事 - 注意
--alldeps和--recursive的区别:--alldeps包含构建时依赖(如gcc),--recursive才真正展开运行时链
为什么 rpm -qpR 或 yum deplist 不能直接画图
因为它们只输出扁平列表,没有父子层级信息,也没声明依赖类型(Requires vs Wants vs After),强行喂给 dot 会得到一堆孤立节点。
-
rpm -qpR tcpdump-*.rpm只告诉你 “要 libpcap.so.1”,但不告诉你谁提供它,也不告诉你 libpcap 自己还要啥 -
yum deplist bash倒是有 provider 字段,但它不递归,glibc提供了libc.so.6,但glibc自身依赖谁?它不说 - 想补全链条?得手动循环查:
dnf provides "libpcap.so.1"→ 得到libpcap-1.10.4-1.fc39.x86_64→ 再dnf repoquery --requires libpcap……这没法自动化画图
服务依赖能画图吗(systemd unit)
可以,但不是靠 graphviz,而是用 systemctl 自带的树形输出配合外部工具转换,重点在区分正向启动链和反向激活链。
-
systemctl list-dependencies --all --type=requires nginx.service输出的是真实启动阻塞路径,比Wants更关键 -
systemctl list-dependencies --reverse --all sshd.service才能抓到multi-user.target这种隐式拉起者,漏掉它就误判影响范围 - 真要图谱?用
systemd-analyze dot nginx.service | dot -Tpng -o nginx-unit.png,但注意它默认包含所有单元类型(包括 timers、sockets),加--filter=service更聚焦 - 别信图形化工具自动渲染的“漂亮图”——很多 UI 工具把
After=当成硬依赖画进图里,其实它不阻塞启动,纯属时序建议
真正麻烦的是跨层混杂:一个服务既依赖 RPM 包(如 nginx),又依赖 systemd unit(如 syslog.socket),还硬编码调用某个二进制(如 /usr/bin/python3)。这种图谱没人能全自动画全,得靠人把 rpm -qR、systemctl cat、ldd 三组结果手工对齐。











