[libvirt-users] Using unix-type channel ....

Hi, I'm trying to use unix-type channel to send/receive datas between host and guest . Here are the steps I follow : 1) Adding these lines to expose a channel unix type to my guest <channel type='unix'> <source mode='bind' path='/var/lib/libvirt/qemu/omnivision_1.agent'/> <target type='virtio' name='org.qemu.guest_agent.0'/> <alias name='channel0'/> <address type='virtio-serial' controller='0' bus='0' port='2'/> </channel> 2) the VM_Orion-1 Guest, exposing a channel "unix" omnivision_1.agent is started, then netstat shows these new things : netstat -apn | grep qemu unix 2 [ ACC ] STREAM LISTENING 37214 19124/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor unix 2 [ ACC ] STREAM LISTENING 37219 19124/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 37242 19124/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 37240 19124/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor 3) I start , on the host , a simple test in order to send datas to the guest: ..... sock = socket(AF_UNIX, SOCK_STREAM, 0); if (sock < 0) { perror("opening stream socket"); return(1); } server.sun_family = AF_UNIX; strcpy(server.sun_path, argv[1]); printf("connecting to socket number : %d \n",sock); fflush(stdout); if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) { close(sock); perror("connecting stream socket"); return(1); } printf("writing data on stream socket"); if (write(sock, DATA, sizeof(DATA)) < 0) perror("writing on stream socket"); close(sock); ..... 4) invoking > test "/var/lib/libvirt/qemu/omnivision_1.agent" then I got : connecting to socket number : 3 writing data on stream socket and following netstat result : netstat -apn | grep qemu unix 2 [ ACC ] STREAM LISTENING 39348 20587/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor unix 2 [ ACC ] STREAM LISTENING 39353 20587/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 2 [ ] STREAM CONNECTING 0 - /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 39375 20587/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 39373 20587/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor 5) if I try to re-invoke test "/var/lib/libvirt/qemu/omnivision_1.agent" then : netstat -apn | grep qemu tcp 0 0 127.0.0.1:5902 0.0.0.0:* LISTEN 20587/qemu-kvm tcp 0 0 127.0.0.1:5902 127.0.0.1:57772 ESTABLISHED 20587/qemu-kvm unix 2 [ ACC ] STREAM LISTENING 39348 20587/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor unix 2 [ ACC ] STREAM LISTENING 39353 20587/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 2 [ ] STREAM CONNECTING 0 - /var/lib/libvirt/qemu/omnivision_1.agent unix 2 [ ] STREAM CONNECTING 0 - /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 39375 20587/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 39373 20587/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor on the guest side , I try to retrieve datas sent by host , by using this kind of thing : ... int fd = open("/dev/virtio-ports/org.qemu.guest_agent.0", O_RDWR | O_NONBLOCK); ssize_t size = read(fd, &buffer, 100); ... As you can imagine , I never receive any data from the host . Is it the right way to use this "unix-type" channel ? Thx for your patience. Regards, J.P. Ribeauville P: +33.(0).1.47.17.27.87 Puteaux 3 Etage 5 Bureau 4 jpribeauville@axway.com<mailto:jpribeauville@axway.com> http://www.axway.com<http://www.axway.com/> P Pensez à l'environnement avant d'imprimer.

On 27.08.2015 15:48, Jean-Pierre Ribeauville wrote:
Hi,
I'm trying to use unix-type channel to send/receive datas between host and guest .
Here are the steps I follow :
1) Adding these lines to expose a channel unix type to my guest <channel type='unix'> <source mode='bind' path='/var/lib/libvirt/qemu/omnivision_1.agent'/> <target type='virtio' name='org.qemu.guest_agent.0'/> <alias name='channel0'/> <address type='virtio-serial' controller='0' bus='0' port='2'/> </channel>
This won't fly. A channel with that name is special. It's guest agent socket that libvirt automatically connects to once domain is starting up. You need to provide a different name and everything should just work. Michal

Hi, Thx for your hint. I've tried this instead : <channel type='unix'> <source mode='bind' path='/opt/omnivision_1.agent'/> <target type='virtio' name='omnivision_1.agent'/> <address type='virtio-serial' controller='0' bus='0' port='2'/> </channel> Then, when starting the Guest I get a pop up window showing this error message : Error starting domain : internal error : process exited while connecting to monitor Quemu-kvm -chardev socket id=channel1,path=/opt/omnivision_1_agent,server,nowait Failed to bind socket : Permission denied Did I miss something ? Regards, J.P. -----Message d'origine----- De : Michal Privoznik [mailto:mprivozn@redhat.com] Envoyé : vendredi 28 août 2015 06:28 À : Jean-Pierre Ribeauville; libvirt-users@redhat.com<mailto:libvirt-users@redhat.com> Objet : Re: [libvirt-users] Using unix-type channel .... On 27.08.2015 15:48, Jean-Pierre Ribeauville wrote:
Hi,
I'm trying to use unix-type channel to send/receive datas between host and guest .
Here are the steps I follow :
1) Adding these lines to expose a channel unix type to my guest
<channel type='unix'>
<source mode='bind' path='/var/lib/libvirt/qemu/omnivision_1.agent'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='2'/>
</channel>
This won't fly. A channel with that name is special. It's guest agent socket that libvirt automatically connects to once domain is starting up. You need to provide a different name and everything should just work. Michal
participants (2)
-
Jean-Pierre Ribeauville
-
Michal Privoznik