liuzhuohua
7d646b5f2b
fix(helper): dnsmasq 预检失败时诊断出「/dev 节点缺失」
用户在 DHCP 页点「保存并应用」,弹出:
配置语法检查未通过:dnsmasq: failed to seed the random number
generator: 没有那个文件或目录
根因不是配置写错,而是目标机的 /dev 标准设备节点被误删过。
/dev 是 devtmpfs,由内核维护,但**已删除的节点内核不会重建**。
2026-09-30 一次 chroot 的 `mount --bind /dev` 变量写错,把宿主机 /dev
挂到了自己身上,随后的清理清空了整个 /dev —— 当时只补回了 /dev/null
一个节点。urandom / random / zero / full / tty / console / kmsg 以及
全部块设备(sda、sda1、sda2、zram0)和 /dev/net/tun 一直缺到今天,
直到 dnsmasq 预检要读随机数才暴露。
内核那句话里既没有 "dev" 也没有「设备」字样,用户只会以为是自己把
地址池填错了。新增 _missing_dev_nodes() 做分诊:命中该错误时返回中文
提示,指明这是系统层面的 /dev 问题、不是配置问题。
- backend/drouter-helper.py:新增 _missing_dev_nodes();_verify 的
dnsmasq 分支做错误分诊(其它语法错误仍走原路径)
- devtools/fix-dev-nodes.sh:新增。幂等地补齐被删的标准设备节点,
设备号分别取自内核 devices.txt(字符设备)、/proc/partitions
(块设备)、/sys/class/input(输入设备);已存在的一律不动
- _dev/t-verify.py:新增 15 项回归,覆盖「节点齐全不误报」「缺谁报谁」
「随机数错误被翻译」「其它错误不受影响」「合法配置通过」五条路径
- devtools/sync.sh:预检链挂上 t-verify.py
目标机 192.168.7.3 实测:
- fix-dev-nodes.sh 新建 32 个节点、0 失败;二次执行 32 跳过(幂等)
- dnsmasq --test 从「failed to seed the random number generator」
变为「syntax check OK.」(退出码 0)
- 网络基线零变化:网关仍 192.168.7.2、ip_forward=1、
5900 仍在听、网卡集合不变、dnsmasq 仍 inactive/disabled、
nft 表 0 个
2026-10-01 16:01:45 +08:00
..
2026-09-30 19:26:24 +08:00
2026-09-30 22:46:43 +08:00
2026-09-30 19:26:24 +08:00
2026-09-30 19:26:24 +08:00
2026-09-30 23:05:51 +08:00
2026-09-30 19:26:24 +08:00
2026-10-01 16:01:45 +08:00
2026-09-30 23:14:19 +08:00
2026-10-01 01:29:09 +08:00
2026-10-01 03:09:19 +08:00
2026-09-30 19:26:24 +08:00
2026-09-30 19:26:24 +08:00
2026-09-30 19:26:24 +08:00
2026-09-30 22:46:43 +08:00
2026-09-30 19:26:24 +08:00
2026-10-01 16:01:45 +08:00