nbd-server 连接被误清理:tcp6 双栈的坑

虚拟机通过 nbd 秒级启动,但 nbd-server 连接总被误清理。根因是新版本 nbd-server 默认用 tcp6 双栈监听,而清理代码用 netstat -4 只过滤 tcp4,把 tcp6 上的连接误判为"无连接"而误清理。 现象 虚拟机通过 nbd 可以实现秒级启动,之前跑的好好的。 最近一个测试环境,总是会出现 nbd 连接丢失的情况。 排查是 base img 的 nbd-server 进程被 kill。 且通过日志看,就是我们的程序给 kill 的。 但是我们的程序是正常的清理,会判断这个 nbd-server 没有连接,才会去 kill。 到底是哪里的问题?是真没有连接了,还是哪里判断有问题。 排查 代码会先检查已经有连接的,这些是肯定不会去 kill: exec_cmd("netstat -4 --tcp -p -n | grep ESTABLISHED | grep nbd-server | awk '{print $4}' | awk -F':' '{print $2}' | sort -u > %s" % tmp_file) 代码已经十年了,看着也很完善,没出过类似问题。 后发现是 tcp6 和 tcp4 的原因,和 nbd-server 的版本有关系: ...

July 5, 2026 · 2 min · 247 words · 文叨叨

清理网卡前先清理相关资源:unregister_netdevice 的坑

LXC 销毁后,hyper 内核报 unregister_netdevice 网卡错误,困扰了很久。根因是网卡 down 后 IPv6 协议栈仍持有 netdevice 引用,在 hyper 中加一个 disable_ipv6=1 的操作就好了。 现象 LXC 销毁后,hyper 内核报网卡错误 unregister_netdevice,这个问题困扰了很久没有解决。 按道理,应该是清理网卡之前,清理相关资源。但我们的程序是直接 down 网卡。 后来有人在网卡 down 后加了一个清理 ipv6 neigh 的操作,然后就好了。卧槽。 排查 先看接口没 down 的时候,比如 eth0 上有 neigh: root@host:~# ip n s 10.0.0.252 dev eth1 lladdr 36:95:2f:f5:af:85 STALE 10.0.0.1 dev eth0 lladdr 02:54:d7:af:4b:cb STALE 10.0.0.253 dev eth1 lladdr 52:54:d7:c6:e8:47 STALE fe80::5054:d7ff:fec6:e847 dev eth1 lladdr 52:54:d7:c6:e8:47 router STALE fd00:2024:822:0:167:ffff:ffff:fffd dev eth1 lladdr 52:54:d7:c6:e8:47 router STALE fe80::e01e:53ff:fe85:5ca0 dev eth0 lladdr 02:54:d7:af:4b:cb router STALE 把接口 eth0 down 掉: ...

June 13, 2026 · 2 min · 275 words · 文叨叨

为什么 ICMP 通但 TCP 不通?tunl 设备校验和没生效

k8s 环境里 pod 之间 ICMP 通但 TCP 不通,client 收到 synack 却不响应。根因是 server 端 tunl 设备的 tx-checksumming 没生效,发出的包校验和错误,被 client 丢弃。 现象 有个 k8s 的环境,pod 之间 ICMP 是通的,TCP 不通。 client 发送的 SYN 报文,可以收到 server 的 SYNACK 回复,但是 client 并不响应这个 SYNACK 报文。 排查 通过 tcpdump -vvv 抓包,看到 server 发出的包,在 client 端依然 checksum incorrect。 怀疑是 server 端的 tx-checksumming: on 功能对 tunl 设备没有生效。 关闭 server 的该功能后正常: ethtool -K tunl0 tx off 根因 1. tunl0 是个软件设备 client 和 server 用 tunnel 隧道来通信,这里的 tunl0 是个软件设备。 ...

January 3, 2026 · 2 min · 373 words · 文叨叨