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函数睡眠几秒,等待完成。
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函数睡眠几秒,等待完成。
相关文章推荐
- HDU 1009贪心
- 使用PL/SQL生成随机密码
- HTML<!DOCTYPE> 声明的作用
- UML时序图总结
- android模仿Twitter记住密码功能
- js提交form表单,并传递参数
- XPCOM (Cross Platform Component Object Model)
- Python 第十四周 字符串与正则表达式
- 关于LR录制时不能自动启动IE浏览器的解决方法总结
- istringstream和ostringstream的使用方法
- tmpFile.renameTo(classFile) failed 错误
- VS2010 小技巧
- GraphMatrix::构造、析构、插入、删除
- 对象的向上向下转型规则
- C++使用模板类实现任意类型switch和变量case
- 安装Redis的图形界面管理工具phpRedisAdmin
- [leetcode]Find Minimum in Rotated Sorted Array
- STL容器之deque
- Linux LVM逻辑卷配置过程详解
- android WebView使用 一 (简单使用在程序中)