QEMU/KVM virtio-serial 宿主机到虚拟机无法连通问题咨询
根因说明
- 关于
target标签state="disconnected"的问题
该字段是libvirt生成的运行时动态属性,手动修改静态XML配置的state值无效,显示断开状态的核心原因是宿主机侧没有进程以读写模式打开对应的pty伪终端设备:pty是双端通信的伪终端设备,仅当宿主机、虚拟机两侧都有进程关联对应的设备节点时,才会自动切换为connected状态。 - 关于反向通信失败的问题
你之前测试时使用cat < {pts-path}是只读模式打开宿主机pty设备,没有获得写权限,自然无法向虚拟机侧发送数据;同时如果虚拟机侧没有进程监听串口设备的输入,即使数据发送成功也不会被捕获展示。
解决步骤
- 第一步:修正XML配置,删除静态写死的
source path和target state属性,libvirt会在虚拟机启动时自动分配可用的pty路径,手动指定路径容易因为pts编号变动出现异常:
<channel type="pty"> <target type="virtio" name="org.fedoraproject.port.1"/> <address type="virtio-serial" controller="0" bus="0" port="1"/> </channel>
修改配置后重新定义虚拟机并启动,执行virsh dumpxml <你的虚拟机名称>即可查看到libvirt自动分配的pty路径。
- 第二步:虚拟机内配置串口监听
启动虚拟机后,首先找到对应virtio串口的设备路径,默认路径为/dev/virtio-ports/org.fedoraproject.port.1,先执行命令开放设备权限:
sudo chmod 666 /dev/virtio-ports/org.fedoraproject.port.1
之后保持串口读进程运行,不要退出终端:
cat /dev/virtio-ports/org.fedoraproject.port.1
- 第三步:宿主机侧开启双向通信
不要使用只读的cat命令测试写入,你可以直接用echo命令测试发向虚拟机的消息,假设libvirt分配的pty路径为/dev/pts/4:
echo "来自宿主机的测试消息" > /dev/pts/4
此时虚拟机侧运行的cat进程即可正常打印收到的消息。如果需要长期双向交互,可以使用screen命令关联pty设备:
screen /dev/pts/4
完成以上操作后再查看虚拟机运行时XML,target的state字段会自动变为connected。
双向通信验证
- 保持虚拟机侧的
cat /dev/virtio-ports/org.fedoraproject.port.1进程运行,宿主机写入消息后虚拟机正常接收,代表宿主机到虚拟机的通信正常 - 在虚拟机新开终端执行
echo "来自虚拟机的测试消息" > /dev/virtio-ports/org.fedoraproject.port.1,宿主机执行cat /dev/pts/4可正常打印消息,代表虚拟机到宿主机的通信正常
内容的提问来源于stack exchange,提问作者Virtual-Plate
相关产品推荐
相关产品推荐

