一、前言

最近做 3D NAND/SSD 存储仿真,用到开源 FEMU 框架,在 Windows WSL2 环境部署运行 run-blackbox.sh 启动脚本时,连续遇到两个致命报错:

  1. QMP unix socket 绑定失败:Failed to bind socket to ./qmp-sock: Operation not supported
  2. 内存分配失败:GLib: failed to allocate 12884901888 bytes

网上资料零散,踩坑很久才彻底解决,本文整理从零配置 WSL2 + 完美跑通 FEMU 黑盒模式全套解决方案,可直接照着操作。

二、环境说明

  • 宿主系统:Windows 10/11
  • 运行环境:WSL2 Ubuntu 20.04 / 22.04
  • 仿真框架:FEMU(SSD 开源仿真器,基于 QEMU 二次开发)
  • 运行模式:BBSSD 黑盒模式 run-blackbox.sh

三、遇到的两大核心报错

报错1:QMP Socket 绑定失败

qemu-system-x86_64: -qmp unix:./qmp-sock,server,nowait: 
Failed to bind socket to ./qmp-sock: Operation not supported

原因
WSL2 不支持在 Windows 挂载目录、普通工作目录 创建 Unix 域套接字,只能放在 Linux 原生临时目录 /tmp 下。

报错2:内存分配失败

GLib: ../../../glib/gmem.c:139: 
failed to allocate 12884901888 bytes

原因
脚本默认配置 ssd_size=12288,对应 FEMU 要申请 12GB 内存,WSL2 默认内存限制不够,直接分配失败。
另外在 /mnt/f 等 Windows 挂载磁盘下运行,也会加剧内存分配、权限、兼容性问题。

四、解决方案一:修复 QMP Socket 路径

原脚本错误参数

-qmp unix:./qmp-sock,server,nowait

修改后正确参数

把相对路径改成 /tmp 绝对路径:

-qmp unix:/tmp/qmp-sock,server,nowait

每次运行前清理残留 socket

防止上次残留文件导致绑定失败:

rm -f /tmp/qmp-sock

五、解决方案二:解决内存分配失败

有两种方案,任选其一即可。

方案A:修改 FEMU 配置,减小 SSD 仿真容量(推荐)

打开 run-blackbox.sh,找到:

ssd_size=12288

改为小容量,适配 WSL 内存:

ssd_size=2048   # 2GB
# 或 ssd_size=4096  # 4GB

修改后 FEMU 只需分配少量内存,低配 WSL 也能直接跑通。

方案B:给 WSL2 扩容内存(不修改脚本)

  1. Windows 打开用户目录,新建 .wslconfig 文件
    路径:C:\Users\你的用户名\.wslconfig

  2. 写入以下内容

[wsl2]
memory=16GB
swap=4GB
processors=8
  1. 生效配置
    以管理员身份打开 CMD/PowerShell:
wsl --shutdown

重启 WSL 后,内存就扩容到 16GB,可原生跑 12GB 的 FEMU 配置。

六、关键避坑:不要在 /mnt 挂载目录运行 FEMU

严重不推荐

/mnt/f/FEMU
/mnt/d/FEMU

这类是 Windows NTFS 挂载到 WSL 的目录,存在一堆兼容问题:

  • Unix Socket 不支持
  • QEMU 内存分配受限
  • 权限异常、性能极低、仿真容易卡死

正确做法:移到 WSL 家目录

# 拷贝到 WSL 原生 Linux 文件系统
cp -r /mnt/f/FEMU ~/
# 进入家目录运行
cd ~/FEMU/build-femu
# 先清旧socket再运行
rm -f /tmp/qmp-sock
./run-blackbox.sh

七、修复后的完整可用 run-blackbox.sh 关键片段

只贴修改后的末尾部分,替换你原有脚本即可:

sudo ./qemu-system-x86_64 \
    -name "FEMU-BBSSD-VM" \
    -enable-kvm \
    -cpu host \
    -smp 2 \
    -m 2G \
    -device virtio-scsi-pci,id=scsi0 \
    -device scsi-hd,drive=hd0 \
    -drive file=$OSIMGF,if=none,aio=native,cache=none,format=qcow2,id=hd0 \
    ${FEMU_OPTIONS} \
    -net user,hostfwd=tcp::8080-:22 \
    -net nic,model=virtio \
    -nographic \
    -qmp unix:/tmp/qmp-sock,server,nowait 2>&1 | tee log

同时把脚本开头:

ssd_size=12288

改成:

ssd_size=2048

八、总结

  1. QMP socket 报错:把 ./qmp-sock 改为 /tmp/qmp-sock;
  2. 内存分配失败:减小 ssd_size 或给 WSL 扩容内存;
  3. 绝对不要在 /mnt/ Windows 挂载目录跑 FEMU,移到 ~/ 家目录;
  4. 每次运行前 rm -f /tmp/qmp-sock 避免残留绑定失败。

按照本文配置,WSL2 可稳定跑通 FEMU 黑盒 SSD 仿真,无报错、不卡死。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐