您的位置:首页 > 其它

KVM虚拟机通信

2015-06-02 14:51 316 查看
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函数睡眠几秒,等待完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: