KVM虚拟机通信

本文介绍了如何在KVM虚拟机中利用qemu命令行接口和UNIX套接字进行通信。通过设置特定参数,如指定SOCKET UNIX通信方式、控制虚拟机的内存、磁盘和网络设备,可以实现对虚拟机的控制。通信过程涉及创建socket、连接到指定路径的UNIX域套接字,并注意到与qemu monitor通信时,命令长度限制为4个字符,需要分批发送并等待执行完成。

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函数睡眠几秒,等待完成。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值