Ubuntu20下libvirtd加-l/--listen参数启用TCP Socket服务重启失败原因
问题核心原因
- Ubuntu 20.04 默认通过
libvirtd.socket激活模式管理 libvirtd 服务,直接修改/etc/default/libvirtd中的-l参数无法传递到实际运行进程,甚至会因配置冲突触发启动失败 这是该版本下最常见的同类问题触发点 - 16509 端口被其他进程占用,导致 TCP 绑定失败
/etc/libvirt/libvirtd.conf配置格式不符合版本要求,加-l后触发配置校验失败- AppArmor 默认规则拦截 libvirtd 监听外部 TCP 端口的操作
分步解决方案
- 先排查具体启动失败原因
执行命令拉取最近的服务日志,定位报错点:journalctl -u libvirtd.service -n 50 --no-pager - 处理 socket 激活冲突场景
- 停止并禁用默认的 socket 激活服务,让 libvirtd 走传统的服务启动模式:
systemctl stop libvirtd.socketsystemctl disable libvirtd.socket - 修正
/etc/default/libvirtd中的配置,去掉-l后面的多余空格:libvirtd_opts="-l" - 修正
/etc/libvirt/libvirtd.conf中的配置,去掉端口和监听地址的多余引号,避免解析异常:listen_tls = 0 listen_tcp = 1 tcp_port = 16509 listen_addr = 0.0.0.0 auth_tcp = "none" - 重新加载 systemd 配置并重启服务:
systemctl daemon-reloadsystemctl restart libvirtd.service
- 停止并禁用默认的 socket 激活服务,让 libvirtd 走传统的服务启动模式:
- 端口占用场景处理
如果日志提示bind() failed: Address already in use:- 执行
ss -tulpn | grep 16509查看占用端口的进程 - 要么停止对应占用进程,要么修改
libvirtd.conf中的tcp_port为空闲端口后重启服务
- 执行
- AppArmor 拦截场景处理
如果日志提示 AppArmor 权限拒绝:- 临时切换 AppArmor 为告警模式测试:
aa-complain /usr/sbin/libvirtd - 重启服务验证是否能正常启动,确认是 AppArmor 拦截后,检查自定义的 AppArmor 规则是否禁用了 libvirtd 的网络监听权限,默认规则无需修改即可正常使用
- 临时切换 AppArmor 为告警模式测试:
配置生效验证
- 执行
ss -tulpn | grep 16509,确认输出中存在 libvirtd 进程的监听记录 - 执行
telnet localhost 16509,能正常连通即说明 TCP 监听已生效
注意:如果需要从远程主机连接 libvirtd 的 TCP 端口,还需要配置防火墙放开 16509 端口的入站规则,避免连通性问题。
内容的提问来源于stack exchange,提问作者Robot Gao
相关产品推荐
相关产品推荐

