Linux 系统故障排查 -- 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崩溃。
在 /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 也被禁用
这是硬禁用,不是“不用而已”。
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
这不是普通启动失败,而是:
- 断言失败
- 或 glibc / libtirpc 初始化检测到非法 socket 状态
- rpcbind 主动 abort
这类错误重启 100 次都没用,必须改配置。
- 没有使用 NFS / NIS / RPC 服务
- 数据库服务器、应用服务器、容器宿主机
systemctl disable --now rpcbind.service
systemctl disable --now rpcbind.socket
并确认:
systemctl status rpcbind
应显示:
Loaded: masked / disabled
Active: inactive
👉 这是最干净、最符合现代 Linux 实践的方式
systemctl edit rpcbind.socket
写入:
BindIPv6Only=no
ListenStream=0.0.0.0:111
ListenDatagram=0.0.0.0:111
#ListenStream=[::]:111
#ListenDatagram=[::]:111
systemctl daemon-reexec
systemctl daemon-reload
systemctl restart rpcbind.socket
systemctl restart rpcbind.service
- systemd 单元文件有继承 / 默认行为
- socket 可能已被缓存
daemon-reexec前不会生效
ss -lntup | grep 111
应该只看到:
0.0.0.0:111
不应该出现 :::111
net.ipv6.conf.all.disable_ipv6 = 0
❌ 原因:
- 为一个 legacy 服务破坏整体内核策略
- 会影响网络安全模型
- 和你之前系统调优目标冲突
rpm -q nfs-utils
systemctl status nfs-server
如果你:
- ❌ 不跑 NFS
- ❌ 不跑 NIS
- ❌ 不跑老 RPC 服务
👉 100% 可以禁用 rpcbind
当在 Linux 内核层禁用 IPv6 时,所有 systemd socket-activated 服务必须显式切换为 IPv4-only,否则会在 socket 初始化阶段直接崩溃。