为什么 NBD 要嵌套 NBD?qcow2 镜像链解析原理

创建 NBD 镜像时,为什么要把 backing 的所有镜像全部设置为 NBD? 因为镜像链的解析是 qemu driver 负责的,NBD 和本地 file 都只是独立的块设备,没有解析能力。 现象 创建 NBD 镜像时报错: cmd [qemu-img create -f qcow2 -b nbd://10.0.0.10:54195 -F qcow2 /dev/qbd/vol/vol-example.img] on [local] failed: ret[1] out[] err[qemu-img: /dev/qbd/vol/vol-example.img: Could not open backing file: Could not open '/data/image/centos79x64a': No such file or directory Could not open backing image.]. exec_time is [0.093]s 怪不得创建 NBD 镜像的时候,会把 backing 的所有镜像全部设置为 NBD。之前很费解。 有一个误区 以为通过 NBD 找到 nbd://10.0.0.10:54195 head 镜像,那么 NBD 镜像的 backing 镜像,自然通过 NBD head 链接一起使用了。 ...

July 18, 2026 · 2 min · 223 words · 文叨叨

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 · 文叨叨