Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Linux 系统故障排查 -- rpcbind

参考文档:IPv6禁用导致rpcbind服务启动失败实例

系统:Almalin 9.7

/etc/sysctl.conf

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

net.netfilter.nf_conntrack_ipv6 = 0

/usr/lib/systemd/system/rpcbind.socket

#BindIPv6Only=ipv6-only
#ListenStream=[::]:111
#ListenDatagram=[::]:111

rpcbind.service

rpcbind.service: Main process exited, code=dumped, status=6/ABRT
rpcbind.service: Failed with result 'core-dump'

这是一个典型的「禁用 IPv6 + 旧服务仍尝试监听 IPv6」导致的崩溃问题,给出的信息已经非常完整,下面直接给结论 + 原因 + 正确修复方案


一、问题结论(一句话)

在内核层彻底禁用了 IPv6,但 rpcbind 仍被 systemd 配置为使用 IPv6 Socket,导致进程在初始化阶段直接 ABRT 崩溃。


二、问题根因分析(非常关键)

1️⃣ 你做了什么(内核层)

/etc/sysctl.conf 中:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

net.netfilter.nf_conntrack_ipv6 = 0

👉 效果:

  • IPv6 在内核层完全关闭
  • AF_INET6 套接字不可用
  • IPv6 conntrack 也被禁用

这是硬禁用,不是“不用而已”。


2️⃣ rpcbind 是怎么启动的(systemd 层)

rpcbind 不是普通 service,而是:

rpcbind.socket 先监听端口 -> 再唤起 rpcbind.service

而你的 /usr/lib/systemd/system/rpcbind.socket 中仍然存在(哪怕被注释,也会被发行版默认行为影响):

# ListenStream=[::]:111
# ListenDatagram=[::]:111

⚠️ 关键点:

  • systemd 在创建 socket 阶段就尝试使用 IPv6
  • 内核已经禁止 IPv6
  • bind(AF_INET6) -> 直接失败
  • rpcbind 收到非法状态 -> ABRT (SIGABRT) -> core dump

三、为什么是 status=6/ABRT

这不是普通启动失败,而是:

  • 断言失败
  • 或 glibc / libtirpc 初始化检测到非法 socket 状态
  • rpcbind 主动 abort

这类错误重启 100 次都没用,必须改配置。


四、正确修复方案(推荐顺序)


✅ 方案一(最推荐):彻底禁用 rpcbind(如果你不需要 NFS)

适用场景

  • 没有使用 NFS / NIS / RPC 服务
  • 数据库服务器、应用服务器、容器宿主机

操作

systemctl disable --now rpcbind.service
systemctl disable --now rpcbind.socket

并确认:

systemctl status rpcbind

应显示:

Loaded: masked / disabled
Active: inactive

👉 这是最干净、最符合现代 Linux 实践的方式


✅ 方案二:强制 rpcbind 仅使用 IPv4(推荐)

1️⃣ 创建 override 配置(不要改 /usr/lib)

systemctl edit rpcbind.socket

写入:

BindIPv6Only=no
ListenStream=0.0.0.0:111
ListenDatagram=0.0.0.0:111
#ListenStream=[::]:111
#ListenDatagram=[::]:111

2️⃣ 重新加载 systemd 并启动

systemctl daemon-reexec
systemctl daemon-reload

systemctl restart rpcbind.socket
systemctl restart rpcbind.service
  • systemd 单元文件有继承 / 默认行为
  • socket 可能已被缓存
  • daemon-reexec 前不会生效

3️⃣ 验证监听情况

ss -lntup | grep 111

应该只看到:

0.0.0.0:111

不应该出现 :::111


🚫 重新开启 IPv6 只为 rpcbind

net.ipv6.conf.all.disable_ipv6 = 0

原因:

  • 为一个 legacy 服务破坏整体内核策略
  • 会影响网络安全模型
  • 和你之前系统调优目标冲突

五、如何判断「是否需要 rpcbind」

rpm -q nfs-utils
systemctl status nfs-server

如果你:

  • ❌ 不跑 NFS
  • ❌ 不跑 NIS
  • ❌ 不跑老 RPC 服务

👉 100% 可以禁用 rpcbind


六、总结

当在 Linux 内核层禁用 IPv6 时,所有 systemd socket-activated 服务必须显式切换为 IPv4-only,否则会在 socket 初始化阶段直接崩溃。