MacOS Arm64执行virsh net-define报未设置URI无法使用直连套接字错误
运行环境
- 系统:MacOS Arm64
- 已完成操作:通过MacPorts安装virt-manager,执行命令为
sudo port install virt-manager
问题现象
按照KVM缺失默认网络的修复教程操作,尝试创建默认网络时,执行命令:
sudo virsh net-define --file default.xml
返回如下报错:
error: failed to connect to the hypervisor error: Operation not supported: Cannot use direct socket mode if no URI is set
报错原因
报错本质是virsh客户端没有拿到可用的hypervisor连接地址:
- MacPorts源安装的libvirt套件默认不会预置全局hypervisor连接URI,加上sudo提权时不会继承普通用户的环境变量配置,提权后的virsh进程读不到预设的连接参数,就会触发直连套接字模式的报错。
- 额外注意:KVM是Linux内核专属的虚拟化模块,MacOS本身不支持KVM,本地运行的libvirt默认对接的是QEMU用户态虚拟化,不会自动匹配Linux下默认的KVM连接地址。
解决方案
按优先级依次操作即可:
- 临时指定连接URI执行命令
MacOS本地QEMU模式的libvirt系统连接地址为qemu:///system,执行virsh命令时通过-c参数显式指定连接地址即可:
后续所有virsh操作都带上sudo virsh -c qemu:///system net-define --file default.xml-c qemu:///system参数即可正常执行。 - 配置默认连接URI永久生效
如果不想每次执行都加参数,可以配置环境变量固定连接地址:- MacOS默认使用zsh终端,编辑用户目录下的
.zshrc文件,追加如下配置:export LIBVIRT_DEFAULT_URI='qemu:///system' - 执行
source ~/.zshrc让当前终端加载配置 - 由于sudo默认不继承用户环境变量,要么切换到root用户后在root的shell配置文件中也添加同样的环境变量,要么修改sudoers配置保留
LIBVIRT_DEFAULT_URI环境变量,否则sudo执行virsh时还是会触发相同报错。
- MacOS默认使用zsh终端,编辑用户目录下的
- 确认libvirt服务状态正常
如果指定URI后仍然连接失败,先启动libvirt后台服务:
等待服务启动完成后再重新执行网络定义命令即可。sudo port load libvirt
提示:MacOS下不存在原生KVM支持,libvirt在该平台下对接QEMU实现软件虚拟化,网络配置规则、虚拟机运行性能和Linux原生KVM环境存在差异,不要直接照搬Linux环境下的default.xml配置,需要提前调整配置里的网桥、DHCP地址段参数适配MacOS网络环境。
内容的提问来源于stack exchange,提问作者Chris G.
相关产品推荐
相关产品推荐

