先确认neutron-dhcp-agent服务是否存活:执行openstack network agent list --agent-type dhcp,检查alive列为:-)且admin_state_up为True;再运行systemctl status neutron-dhcp-agent确认Active: active (running),并验证/var/lib/neutron/dhcp/下存在对应网络命名空间目录及ip netns exec qdhcp-xxx ps aux | grep dnsmasq输出正常。

neutron-dhcp-agent 服务状态是否存活
先确认 neutron-dhcp-agent 进程是否在运行,且被 OpenStack 正确识别为活跃。它可能“看起来启动了”,但实际没注册进数据库或心跳超时。
执行:openstack network agent list --agent-type dhcp,检查输出中 alive 列是否为 :-),admin_state_up 是否为 True。若显示 XXX 或空值,说明 agent 未成功上报心跳——常见原因是节点时间不同步、RabbitMQ 连接失败、或 Keystone 认证 token 过期。
进一步验证系统级状态:systemctl status neutron-dhcp-agent。注意看 Active: 行是否为 active (running);若为 inactive (dead) 或反复 restart,则要查 journal:journalctl -u neutron-dhcp-agent -n 50 -f。
/var/lib/neutron/dhcp/ 下有没有对应网络的命名空间目录
DHCP agent 为每个子网创建一个独立的 Linux network namespace,并在 /var/lib/neutron/dhcp/ 下以 UUID 命名。如果该目录为空或缺失目标子网的子目录(比如 /var/lib/neutron/dhcp/062d2b07-339e-4d54-aaca-6b9169d17f6c/),说明 agent 根本没加载该网络配置。
可能原因包括:
- 子网未绑定到网络(
openstack subnet show SUBNET_ID中network_id字段为空或错误) - 子网启用了
enable_dhcp=False(检查openstack subnet show输出) - neutron-server 数据库里该子网的
dhcp_agent_id字段为空,且没有启用 DHCP agent scheduling(即没自动调度)
手动触发调度(仅限未启用 auto-scheduling 的环境):neutron dhcp-agent-network-add AGENT_ID NETWORK_ID。
dnsmasq 进程是否存在且监听正确 namespace
即使 neutron-dhcp-agent 进程活着,也不代表 dnsmasq 已启动。DHCP 功能最终靠 dnsmasq 提供,它运行在 network namespace 内,不暴露在 host 主命名空间。
检查方式:
- 进入对应 namespace:
ip netns exec qdhcp-062d2b07-339e-4d54-aaca-6b9169d17f6c ps aux | grep dnsmasq - 若无输出,说明 dnsmasq 没起来;此时翻
/var/log/neutron/dhcp-agent.log,重点搜RuntimeError、Command: ['ip', '-o', 'netns', 'list']、Exit code: 255—— 这类报错往往意味着 iproute2 工具异常或 namespace 创建失败 - 常见诱因:SELinux 启用时阻止了
neutron-dhcp-agent创建 namespace;或内核不支持CONFIG_NET_NS=y
不要只看 host 上的 ps aux | grep dnsmasq,那可能是别的服务起的,和 Neutron 无关。
local_ip 配置是否与物理接口 IP 匹配
neutron-dhcp-agent 的配置文件(通常是 /etc/neutron/dhcp_agent.ini)里必须设置 local_ip,这个 IP 必须是所在节点上某块物理网卡(如 eth1)的实际 IPv4 地址,且需属于 provider 网络的同一网段。
错误配置示例:local_ip = 127.0.0.1 或 local_ip = 192.168.100.10(但该节点 eth1 实际是 192.168.200.10)会导致 DHCP 报文无法从 namespace 正确路由出去,虚拟机发的 DHCP Discover 根本收不到响应。
验证方法:
- 查配置:
grep ^local_ip /etc/neutron/dhcp_agent.ini - 查接口 IP:
ip -4 addr show eth1 | grep inet(把eth1换成你实际的 provider 接口名) - 两者必须完全一致,不能是别名、不能是 CIDR 形式(如
192.168.200.10/24),只能是纯 IP(192.168.200.10)
改完记得 systemctl restart neutron-dhcp-agent,并确认 namespace 和 dnsmasq 重建成功。
真正卡住的地方往往不是日志报错,而是 local_ip 和物理接口 IP 的微妙错位,或者 dnsmasq 在 namespace 里静默崩溃却没写入主日志——得进 namespace 里单独看它的 stderr 输出。


















