QEMU使用ivshmem时Backing Store Size不匹配问题排查求助
QEMU ivshmem 共享内存大小不匹配问题
启动ivshmem服务器后,启动QEMU虚拟机时出现如下错误:
qemu-system-x86_64: -device ivshmem-doorbell,vectors=1,chardev=testshm: backing store size 0x6300 does not match 'size' option 0x7000
错误发生在ivshmem服务器接受QEMU连接并发送shm fd之后,相关QEMU启动命令如下:
sudo qemu-system-x86_64 -initrd initrd.img-5.4.0-84-generic \ -kernel vmlinuz-5.4.0-84-generic \ -nographic -monitor none -serial stdio \ -append 'root=/dev/vda1 console=ttys0' \ -machine q35 -cpu host \ -drive "file=base.snapshot.qcow2,format=qcow2,if=virtio" \ -chardev socket,path="/run/testshm",id="testshm" \ -device ivshmem-doorbell,vectors=1,chardev="testshm" \ -enable-kvm \ -m 12G \ -smp 16
疑问:
- 在哪里查看backing store的大小?
- 如何让backing store大小与QEMU的
size选项匹配?
解决方案
一、查看backing store的大小
- 若使用官方
ivshmem-server,直接看启动时的-s参数值,这就是它创建的共享内存大小;如果是自定义服务器,去代码中查找创建共享内存的逻辑(比如shm_open后调用ftruncate的代码段),那里的数值就是backing store的实际大小。 - 通过系统工具查询已存在的共享内存:
执行ipcs -m命令,会列出系统中所有共享内存段,找到对应ivshmem的条目,bytes列即为该共享内存的大小。拿不准目标段的话,可搭配ipcs -mp查看关联的进程ID,对应上你的ivshmem服务器进程即可。
二、让两者大小匹配
错误核心是ivshmem服务器创建的共享内存大小,与QEMU的预期值不一致,分两种情况解决:
1. 使用官方ivshmem-server的场景
启动服务器时,通过-s参数指定与QEMU一致的大小。比如QEMU报错显示预期0x7000,启动服务器的命令需改为:
ivshmem-server -s 0x7000 -p /run/testshm
同时在QEMU启动命令中,给ivshmem-doorbell设备显式加上size参数,避免默认值差异导致的不匹配:
-device ivshmem-doorbell,vectors=1,chardev="testshm",size=0x7000
2. 自定义ivshmem服务器的场景
要么修改服务器代码,将共享内存大小调整为QEMU期望的0x7000(比如调整ftruncate的参数值);要么修改QEMU的size选项为服务器创建的0x6300,保证两边数值统一即可。
额外注意事项
- 如果QEMU命令中未显式指定
size,它会使用默认值,不同版本的默认值可能不同,建议始终显式指定该参数。 - 共享内存大小必须是页面大小的整数倍(通常为4KB),若指定的大小不符合要求,系统会自动对齐,这也可能导致大小不匹配,因此尽量使用4KB的倍数来设置数值。
内容的提问来源于stack exchange,提问作者MUAS
相关产品推荐
相关产品推荐

