KVM虚拟机除了用到qemu命令行界面进行操作,我们可以在创建虚拟机的时候指定一些参数,可以让我们通过SOCKET UNIX通信的方式,来控制虚拟机。
qemu-system-x86_64-m 2048 -drive file=/var/disk/win.img,if=virtio -rtcbase=localtime -netnic,macaddr=00:11:22:33:44:aa,model=virtio -nettap,script=/var/etc/ovs-ifup,downscript=/var/etc/ovs-ifdown,ifname=vmwin7 -chardev socket,id=img,path=/var/console/1.img,server,nowait -mon chardev=img,id=monitor,mode=readline -usb -usbdevice tablet -vnc :5
红色字体是找那个要的代码,实现添加一个字符设备,指定socket通信的的ID 和路径(因为是指定的unix 域 socket通信方式,所以要指定Unix域文件的路径,server选项开启监听,nowait是非阻塞模式,-mon chardev=img,id=monitor,mode=readline :Setup monitor on chardev name创建监视器窗口在指定的字符设备上)接下来就是让我们进行通信:写一个socket客户端int socketfd;
char buf[1024];
struct sockaddr_un sockaddr;//定义unix 域socket结构地址
socketfd = socket(AF_UNIX,SOCKET_STREAM,0);
if(socketfd<0)
{
printf("socket failure!");
return 0;
}
bzero(&sockaddr,sizeof(sockaddr));//使用之前清空地址
sockaddr.sun_family = AF_UNIX(AF_LOCAL);
srtcpy(sockaddr.sun_path,"xxxxxxx");//xxx是unix域套接字的文件路径
int res = connect(socketfd,(struct sockaddr*)&sockaddr,sizeof(sockaddr));
if(res<0)
{
printf("connet failure");
return 0;
}
else
{
wtrite(socketfd,buf,strlen(buf));
}
return 0;
}
unix socket 通信的大致流程就是这样的
很重要一点,在和qemu monitor进行socket通信的时候,发现每次只能够发送<=4个字符才可以正确接收,如果命令超过4个字符,那么将命令分成多次进行发送。每次发送4个即可。
还有发送完命令不要立刻关闭socket 或者 结束程序,等待qemu monitor执行完毕后,才可以关闭,一般上用sleep函数睡眠几秒,等待完成。
本文介绍了如何在KVM虚拟机中利用qemu命令行接口和UNIX套接字进行通信。通过设置特定参数,如指定SOCKET UNIX通信方式、控制虚拟机的内存、磁盘和网络设备,可以实现对虚拟机的控制。通信过程涉及创建socket、连接到指定路径的UNIX域套接字,并注意到与qemu monitor通信时,命令长度限制为4个字符,需要分批发送并等待执行完成。
761

被折叠的 条评论
为什么被折叠?



